xbpBrowse() Aufbau, aber wie?
Moderator: Moderatoren
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
xbpBrowse() Aufbau, aber wie?
Hi,
ich stehe mal wieder vor einem Scherbenhaufen. Ich habe jetzt alles durchgelesen, was über XXXBrowse hier steht, komme aber überhaupt nicht weiter. Ich baue mir gerade ein Testprg zusammen, in dem ich mir nach und nach ein XbpBrowse zusammensetze, mit dem ich später einmal alles möglich machen kann und anhand dessen ich die Sache irgendwie versuche zu verstehen. Aber irgendwie ist die Mauer so hoch und lang, das es scheint, als gäbe es kein Drüberkommen.
Ich habe jetzt den Standard, dass das XbpBrowse mir eine Tabelle anzeigt. Prima. XbpBrowse() kann alles, was ein XbpQuickbrowse() kann. Wie komme ich weiter, was muß ich lesen um überhaupt zu verstehen, was ich jetzt wie einbaue? Ich möchte gerne eine Eingabezeile haben, in der ich zeichenweise direkt suchen kann, so wie in qbrowse2. Kriege ich nicht hin -> weil keine Ahnung was ich tun muß. Dann habe ich gelesen, das es :colorBlock gibt - > klappt nicht, weil unbekannt.
Ich weiß überhaupt nicht wie ich es anfassen soll.
Woher wißt ihr das alles? Nur nachgelesen? Super kombiniert? Es ist echt frustrierend.
ich stehe mal wieder vor einem Scherbenhaufen. Ich habe jetzt alles durchgelesen, was über XXXBrowse hier steht, komme aber überhaupt nicht weiter. Ich baue mir gerade ein Testprg zusammen, in dem ich mir nach und nach ein XbpBrowse zusammensetze, mit dem ich später einmal alles möglich machen kann und anhand dessen ich die Sache irgendwie versuche zu verstehen. Aber irgendwie ist die Mauer so hoch und lang, das es scheint, als gäbe es kein Drüberkommen.
Ich habe jetzt den Standard, dass das XbpBrowse mir eine Tabelle anzeigt. Prima. XbpBrowse() kann alles, was ein XbpQuickbrowse() kann. Wie komme ich weiter, was muß ich lesen um überhaupt zu verstehen, was ich jetzt wie einbaue? Ich möchte gerne eine Eingabezeile haben, in der ich zeichenweise direkt suchen kann, so wie in qbrowse2. Kriege ich nicht hin -> weil keine Ahnung was ich tun muß. Dann habe ich gelesen, das es :colorBlock gibt - > klappt nicht, weil unbekannt.
Ich weiß überhaupt nicht wie ich es anfassen soll.
Woher wißt ihr das alles? Nur nachgelesen? Super kombiniert? Es ist echt frustrierend.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9358
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Hallo, Manfred.
Dir scheint nicht ganz klar zu sein, daß ein XbpBrowse aus mehreren Objekten besteht, nämlich aus XbpColumn-Objekten, die wiederum aus :heading-, :dataarea- und :footing-Objekten zusammengesetzt sind. Diese wiederum sind XbpCell-Group-Objekte. Die :colorBlock-Instanz steht nur dem Column-Objekt zur Verfügung, nicht dem XbpBrowse selbst. Wenn Du mit AddColumn() eine neue Spalte erstellst, kann das zurückgereichte Column-Objekt einen colorBlock bekommen, und nur dann. XbpBrowse kennt diese iVar nicht.
Ich kann mich wieder nur Wolfgangs Vorschlag anschließen. Roger Donnays eXPress++ läßt einen sehr leicht zum Beispiel komplexe Browses bauen, und er übernimmt für Dich solche Verständnisgeschichten. Nach und nach kann man aber im Feinbereich mit den auch auf diese Art entstehenden Objekten arbeiten und verstehen, wie sie aufgebaut sind. Ein Browse entsteht bei Roger so:
Dir scheint nicht ganz klar zu sein, daß ein XbpBrowse aus mehreren Objekten besteht, nämlich aus XbpColumn-Objekten, die wiederum aus :heading-, :dataarea- und :footing-Objekten zusammengesetzt sind. Diese wiederum sind XbpCell-Group-Objekte. Die :colorBlock-Instanz steht nur dem Column-Objekt zur Verfügung, nicht dem XbpBrowse selbst. Wenn Du mit AddColumn() eine neue Spalte erstellst, kann das zurückgereichte Column-Objekt einen colorBlock bekommen, und nur dann. XbpBrowse kennt diese iVar nicht.
Ich kann mich wieder nur Wolfgangs Vorschlag anschließen. Roger Donnays eXPress++ läßt einen sehr leicht zum Beispiel komplexe Browses bauen, und er übernimmt für Dich solche Verständnisgeschichten. Nach und nach kann man aber im Feinbereich mit den auch auf diese Art entstehenden Objekten arbeiten und verstehen, wie sie aufgebaut sind. Ein Browse entsteht bei Roger so:
Code: Alles auswählen
@ 1,1 DCBROWSE oBrowse ALIAS "MyData" SIZE 100,25 DATALINK {||MyBrowseEdit(oBrowse)}
DCBROWSECOL FIELD name HEADER "Name" WIDTH 15 PARENT oBrowse COLOR {|x|MyColor(x)}
usw.
FUNCTION MyColor(x)
IF x == "Müller"
RETURN {GRA_CLR_WHITE,GRA_CLR_BLUE}
ENDIF
RETURN {GRA_CLR_BLACK,GRA_CLR_WHITE}
(nur ein Beispiel)
Herzlich,
Tom
Tom
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Tom,
mir ist schon klar, das mehrere Objekte im Spiel sind, auch bein anderen Klassen. Ich tue mich schwer damit zu kapieren, wie die zusammengbaut und dann gesteuert werden. Wann was wie an wen übergeben oder abgefragt werden soll/muß.
Ich weiß nicht ob es so ratsam ist immer wieder Zusatztools zu benutzen um irgendwas einfacher programmieren zu können, mir geht es in allererster Linie darum die Dinge zu verstehen und da habe ich Bedenken, dass es über den Umweg mit Tools besser laufen soll.
Es gibt viele Zustztools, die man benutzen kann, die aber auch Geld kosten, das ich zur Zeit nicht dafür übrig habe. Außerdem hat mir die Vergangenheit gezeigt, dass es dass nicht ist. Ich habe mir immer mal einige Dinge dazugekauft und dann aber feststellen müssen, dass trotzdem das entsprechende Wissen fehlte und das möchte ich mir auf jeden Fall aneignen, indem ich halt versuche mir alles nach und nach aufzubauen und zu verstehen.
Ich weiß, dass alles eigentlich eine Sache von Containern ist, in die wiederum andere Container gepackt werden, aber immer der Reihe nach. Nur habe ich noch diverse Probleme damit, ab wann ich was aus welchem Container ansprechen, oder benutzen kann.
Habe ich denn die Anleitung zu Xbase++ so schlecht gelesen?
mir ist schon klar, das mehrere Objekte im Spiel sind, auch bein anderen Klassen. Ich tue mich schwer damit zu kapieren, wie die zusammengbaut und dann gesteuert werden. Wann was wie an wen übergeben oder abgefragt werden soll/muß.
Ich weiß nicht ob es so ratsam ist immer wieder Zusatztools zu benutzen um irgendwas einfacher programmieren zu können, mir geht es in allererster Linie darum die Dinge zu verstehen und da habe ich Bedenken, dass es über den Umweg mit Tools besser laufen soll.
Es gibt viele Zustztools, die man benutzen kann, die aber auch Geld kosten, das ich zur Zeit nicht dafür übrig habe. Außerdem hat mir die Vergangenheit gezeigt, dass es dass nicht ist. Ich habe mir immer mal einige Dinge dazugekauft und dann aber feststellen müssen, dass trotzdem das entsprechende Wissen fehlte und das möchte ich mir auf jeden Fall aneignen, indem ich halt versuche mir alles nach und nach aufzubauen und zu verstehen.
Ich weiß, dass alles eigentlich eine Sache von Containern ist, in die wiederum andere Container gepackt werden, aber immer der Reihe nach. Nur habe ich noch diverse Probleme damit, ab wann ich was aus welchem Container ansprechen, oder benutzen kann.
Habe ich denn die Anleitung zu Xbase++ so schlecht gelesen?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo Manfred,
für dein SLE , das als Suchbegriff aktiv im Browser sucht und positioniert, brauchst du dringend Object code, sonst kommst du nicht weiter.
oSuchSle nennen wir mal das SLE, das oberhalb deines Browsers liegt.
oBrowser nennen wir den Browser
beides einfach mit dem XppFD übereinander basteln und die Namen schön benennen.
Nun mußt du im oSuchSle:keyboard slot oder Methode eine Funktion hinterlegen, die bei jedem Tastendruck (falls du das wünschst) aufgerufen wird, daher im Keyboardblock.
Diese Funktion muß nun einen Suchbefehl in deinem Browser ausführen, habe ich jetzt zwar kein Beispiel es gibt verschiedene Möglichkeiten.
Zum Positionieren (ohne Filtern) würde ich versuchen mit dbseek und dblocate REST den richtigen Satz zu finden (es muß schnell gehen sonst will das keiner ...) und dann mit oBrowser:refreshAll() einen neuaufbau zu erzwingen. Je nach Datei kann das schnell oder langsam sein, aber wenn man sucht ist der Neuaufbau eh zu erwarten ...
So ähnlich habe ich es damals auch unter Clipper mit Tbrowse gemacht.
Man könnte natürlich auch im Browser skippen und die Inhalte vergleichen, aber dblocate ist wesentlich schneller !
für dein SLE , das als Suchbegriff aktiv im Browser sucht und positioniert, brauchst du dringend Object code, sonst kommst du nicht weiter.
oSuchSle nennen wir mal das SLE, das oberhalb deines Browsers liegt.
oBrowser nennen wir den Browser
beides einfach mit dem XppFD übereinander basteln und die Namen schön benennen.
Nun mußt du im oSuchSle:keyboard slot oder Methode eine Funktion hinterlegen, die bei jedem Tastendruck (falls du das wünschst) aufgerufen wird, daher im Keyboardblock.
Diese Funktion muß nun einen Suchbefehl in deinem Browser ausführen, habe ich jetzt zwar kein Beispiel es gibt verschiedene Möglichkeiten.
Zum Positionieren (ohne Filtern) würde ich versuchen mit dbseek und dblocate REST den richtigen Satz zu finden (es muß schnell gehen sonst will das keiner ...) und dann mit oBrowser:refreshAll() einen neuaufbau zu erzwingen. Je nach Datei kann das schnell oder langsam sein, aber wenn man sucht ist der Neuaufbau eh zu erwarten ...
So ähnlich habe ich es damals auch unter Clipper mit Tbrowse gemacht.
Man könnte natürlich auch im Browser skippen und die Inhalte vergleichen, aber dblocate ist wesentlich schneller !
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Hubert,
das denke ich auch so.
Wenn ich z.B. ein oSLE baue, dann muß ich ja etwas haben, über das ich das SLE legen kann. Das ist ja dann in dem Fall das oBrowse. Das habe ich auch so gemacht. In den Qbrowse2 klappt das sofort. Bei meinem XbpBrowse wird es aber nicht angezeigt. Da hapert es ja schon. Irgendwo habe ich noch einen Knoten in der Leitung.
das denke ich auch so.
Wenn ich z.B. ein oSLE baue, dann muß ich ja etwas haben, über das ich das SLE legen kann. Das ist ja dann in dem Fall das oBrowse. Das habe ich auch so gemacht. In den Qbrowse2 klappt das sofort. Bei meinem XbpBrowse wird es aber nicht angezeigt. Da hapert es ja schon. Irgendwo habe ich noch einen Knoten in der Leitung.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16509
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Manfred,
Code bitte (wenn nicht zu viel...)
Viele Grüße,
Martin
Code bitte (wenn nicht zu viel...)
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Martin,
Du hast ja Recht....
Das ist jetzt erstmal das Grundgerüst, das läuft. Hier experimentiere ich mit und schreibe dahinter, was zu welchem Ergebnis führt.
Du hast ja Recht....
Das ist jetzt erstmal das Grundgerüst, das läuft. Hier experimentiere ich mit und schreibe dahinter, was zu welchem Ergebnis führt.
Code: Alles auswählen
*
*
*
* TEstumgebung für XbpBrowse mit dem versuch alle Schikanen einzubauen
********************************************************************************
#include "Appevent.ch"
#include "Common.ch"
#include "gra.ch"
#include "xbp.ch"
#pragma Library( "XppUi2.lib" )
********************************************************************************
PROCEDURE AppSys
RETURN
********************************************************************************
PROCEDURE main()
LOCAL cField
LOCAL mp1, mp2
LOCAL nI
LOCAL nEvent := 0
LOCAL oXbp, oBrowse, oSle
DbUseArea(.T.,"DBFCDX","\videoneu\datenbanken\vo\titel")
IF ! FILE("\videoneu\datenbanken\vo\titelxbpbrowse.cdx")
OrdCreate("\videoneu\datenbanken\vo\titelxbpbrowse","titel","UPPER(bez)")
ELSE
OrdListAdd("\videoneu\datenbanken\vo\titelxbpbrowse")
ENDIF
//Dialogfenster erzeugen
oXbp := GuiStdDialog( "Standard GUI Browser für DBF")
//Browser im Fenster erzeugen
oBrowse := GuiBrowseDb( oXbp:drawingArea )
// Spalten für alle Felder anfangen
FOR nI := 1 TO FCount()
cField := FieldName( nI )
oBrowse:addColumn( FieldBlock ( cField ), , cField )
NEXT
// Der Browser füllt nach :resize() immer das Fenster aus
oXbp:drawingArea:resize := { |mp1,mp2,obj| obj:childList()[1]:setSize(mp2) }
oXbp:show() // jetzt wird erst angezeigt
oBrowse:show() // da bei Erzeugung lVisible := .F. war
SetAppFocus( oBrowse )
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
RETURN
********************************************************************************
FUNCTION GuiBrowseDb(oParent,aPos,aSize)
LOCAL aPresParm
LOCAL lVisible := .F.
LOCAL oOwner
LOCAL oBrowse
oBrowse := XbpBrowse():new( oParent, oOwner, aPos, aSize, aPresParm, lVisible)
oBrowse:adjustHeight := .T. // damit die letzte zeile auch sichtbar wird
oBrowse:cursorMode := XBPBRW_CURSOR_ROW // die ganze Zeile als Cursor
oBrowse:softTrack := .F. // damit das Scrollen weich und sofort klappt
oBrowse:create()
// Navigationscodeblöcke für den Browser
oBrowse:skipBlock := {|n| DbSkipper(n) } // skipped vorwärts, oder rückwärts
oBrowse:goTopBlock := {| | DbGoTop() }
oBrowse:goBottomBlock := {| | DbGoBottom() }
oBrowse:phyPosBlock := {| | Recno() }
// Navigationscodeblöcke für den vertikalen Scrollbar
oBrowse:posBlock := {| | DbPosition() }
oBrowse:goPosBlock := {|n| DbGoPosition(n) }
oBrowse:lastPosBlock := {| | 100 }
oBrowse:firstPosBlock := {| | 0 }
RETURN oBrowse
********************************************************************************
FUNCTION GuiStdDialog( cTitle ) // das gibt das fertige Objekt zurück (aha!)
LOCAL aPos := {100,100} // Startpostion des Fensters auf dem Parentbildschirm
LOCAL aPresParm := {} // Presentations Parameter für den XbasePart
LOCAL aSize := {1024,768} // Größe des Fensters auf dem Parentbildschirm
LOCAL lVisible := .F. // bestimmt, ob der XbpDialog nach Aufruf von create() sichtbar ist
LOCAL oDlg
LOCAL oOwner
LOCAL oParent
DEFAULT cTitle TO "Standard Dialog Fenster" // wenn kein Parameter mitgegeben werden würde
oDlg := XbpDialog():new(oParent,oOwner,aPos,aSize,aPresParm,lVisible)
oDlg:icon := 1 // dieses Icon ist nachher oben links sichtbar!?
oDlg:tasklist := .T. // bei .F. fehlen oben rechts die Button und der Rahmen
oDlg:title := cTitle // Überschriftentext oben im Kopf
oDlg:create() // Objekt wird erzeugt
// CenterControl(oDlg) // zentriert am Bildschirm
oDlg:drawingArea:setFontCompoundName( "8.Helv") // Schriftart im Fenster !?
RETURN oDlg
Zuletzt geändert von Manfred am Fr, 22. Sep 2006 12:39, insgesamt 2-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16509
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
OK - und wo ist da jetzt Dein Sle?
Viele Grüße,
Martin
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo Manfred,Manfred hat geschrieben:Wenn ich z.B. ein oSLE baue, dann muß ich ja etwas haben, über das ich das SLE legen kann.
wenn es ein SuchSLE sein soll, dann liegt das etwas oberhalb der Oberkante des Browsers oder etwas unterhalb der Unterkante, aber NIE darüber ! Sonst verdecken die sich gegenseitig !
Wenn du ein SLE in einer Spaltenzelle willst, um dort einen Wert zu editieren, ist das was ganz anderes.
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Hubert, Martin
ich habe es eben editiert und ich glaube ich habe zumindest einen Fehler gefunden.....
Ich mache das nochmal neu und stelle es dann rein, sonst komme ich hier ganz durcheinander.
ich habe es eben editiert und ich glaube ich habe zumindest einen Fehler gefunden.....
Ich mache das nochmal neu und stelle es dann rein, sonst komme ich hier ganz durcheinander.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
-
- Rekursionen-Architekt
- Beiträge: 205
- Registriert: Mo, 07. Aug 2006 10:18
- Wohnort: Leipzig
- Danksagung erhalten: 11 Mal
Hallo Manfred,
vielleicht hilft Dir das folgende, einfache Beispiel, um den Aufbau eines
XbpBrowse besser zu verinnerlichen:
Für ein Suchfeld musst Du, wie Martin andeutete, ein SLE erzeugen, die darin stattfindenden Tastatur-Eingaben mittels keyboard-Callback abfragen und den editBuffer() des SLE's per dbSeek() in der Datenbank suchen. Dazu muss die Datenbank nach dem Suchfeld indiziert sein.
Ich hoffe, Du kannst etwas damit anfangen.
Übrigens finde ich dieses Thema (XbpBrowse) passt besser in die Rubrik "GUI" (für spätere Suche).
Tschüs,
Sören
vielleicht hilft Dir das folgende, einfache Beispiel, um den Aufbau eines
XbpBrowse besser zu verinnerlichen:
Code: Alles auswählen
#include "Xbp.ch"
#include "Appevent.ch"
#include "Gra.ch"
#pragma Library( "XppUi2.lib" )
PROCEDURE Main
LOCAL nEvent, mp1, mp2, oXbp
LOCAL oDlg, oBrowse, oCol
USE Customer.dbf EXCLUSIVE NEW
// Dialogfenster erzeugen
oDlg := XbpDialog():new( AppDesktop(), , {150,100}, {600,500}, , .F. )
oDlg:title := "Browse-Test"
oDlg:create()
// Browse erzeugen
oBrowse := XbpBrowse():new( oDlg:drawingArea, , {10,10}, {560,460}, , .T. )
// Browse-Navigation festlegen
oBrowse:skipBlock := { |n| DbSkipper(n) }
oBrowse:goTopBlock := { | | DbGoTop() }
oBrowse:goBottomBlock := { | | DbGoBottom() }
oBrowse:posBlock := { | | DbPosition() }
oBrowse:phyPosBlock := { | | Recno() }
oBrowse:goPosBlock := { |n| DbGoPosition(n) }
oBrowse:firstPosBlock := { | | 1 }
oBrowse:lastPosBlock := { | | 100 }
// Spalte 1 erzeugen und an Browse anfuegen
oBrowse:addColumn( { || LTrim( Customer->custno ) }, 5, "Kd.-Nr." )
// Spalte 2 erzeugen, an Browse anfuegen und ColorBlock definieren
oCol := oBrowse:addColumn( { || LTrim( Customer->mr_mrs ) }, 10, "Anrede" )
oCol:colorBlock := { |xValue| iif( Upper( AllTrim( xValue ) ) == "MR.", {GRA_CLR_YELLOW,GRA_CLR_RED}, {GRA_CLR_BLUE,GRA_CLR_YELLOW} ) }
oBrowse:addColumn( { || LTrim( Customer->lastname ) }, 20, "Nachname" ) // Spalte 3
oBrowse:addColumn( { || LTrim( Customer->firstname ) }, 20, "Vorname" ) // Spalte 4
oBrowse:create()
oBrowse:refreshAll() // Anzeige auffrischen
oDlg:Show()
nEvent := 0
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
RETURN
Ich hoffe, Du kannst etwas damit anfangen.
Übrigens finde ich dieses Thema (XbpBrowse) passt besser in die Rubrik "GUI" (für spätere Suche).
Tschüs,
Sören
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hi,
die Rubrik mit Tabellen (am Monitor ...) finde ich nicht verkehrt, wenngleich natürlich auch alles GUI ist
Beim Suchen muß man natürlich auch noch überlegen, ob man den gewünschten Text irgendwo im Text findet (dblocate(....cSuch $ cFeld1+cFeld2 ...) oder ob man erst die aktuelle Spalte ermittelt um dann den Index zu wählen ...
die Rubrik mit Tabellen (am Monitor ...) finde ich nicht verkehrt, wenngleich natürlich auch alles GUI ist
Beim Suchen muß man natürlich auch noch überlegen, ob man den gewünschten Text irgendwo im Text findet (dblocate(....cSuch $ cFeld1+cFeld2 ...) oder ob man erst die aktuelle Spalte ermittelt um dann den Index zu wählen ...
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9358
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Hallo, Manfred.
Manchmal ist es einfacher, schnell zu einem Ergebnis zu kommen und sich anschließend um das Verständnis seiner Entstehung zu bemühen. Aber das ist, wie gesagt, auch nur ein Vorschlag. Ich denke, Du würdest Dir viele Scherbenhaufen ersparen, wenn Du diesen Weg mal ausprobieren würdest.
Sicher sind Tools, die gekapselte Klassenbibliotheken enthalten, aus DLLs bestehen, deren Funktionen man einfach aufruft, nicht geeignet, um die Lernkurve abzuflachen. Aber eXPress++ kommt im Quellcode (plain Xbase++), und man kann dieserart sozusagen vom Ergebnis aus rückwärts lernen. Alleine, wenn man sich anguckt, was der von Roger sehr intensiv genutzte Präprozessor aus "seinen" Befehlen (siehe Beispiel macht), kann man - immer das Ergebnis vor Augen - viel darüber erfahren, wie sowas geht, später auch ohne solche Tools. Gleichzeitig habe ich die Möglichkeit, bequem und tatsächlich objektorientiert zu programmieren, ohne diese Objekte zu Fuß (herkömmlicher Weg) erzeugen zu müssen. Sie existieren, und ich kann nach und nach herangehen und sie manipulieren. Ich habe den Vorschlag ja nicht gemacht, um Dir die Library zu verkaufen, sondern weil ich finde, daß sie sehr gut geeignet ist, diese Seite der Xbase-Programmierung besser zu verstehen. Ich nehme an, daß es mit TopDown ganz ähnlich ist (hier wird allerdings ein anderer Ansatz verfolgt); ob die Klassenbibliotheken von DS-Datasoft auch im Quellcode vorliegen, weiß ich nicht.Ich weiß nicht ob es so ratsam ist immer wieder Zusatztools zu benutzen um irgendwas einfacher programmieren zu können, mir geht es in allererster Linie darum die Dinge zu verstehen und da habe ich Bedenken, dass es über den Umweg mit Tools besser laufen soll.
Manchmal ist es einfacher, schnell zu einem Ergebnis zu kommen und sich anschließend um das Verständnis seiner Entstehung zu bemühen. Aber das ist, wie gesagt, auch nur ein Vorschlag. Ich denke, Du würdest Dir viele Scherbenhaufen ersparen, wenn Du diesen Weg mal ausprobieren würdest.
Herzlich,
Tom
Tom
- Martin Altmann
- Foren-Administrator
- Beiträge: 16509
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Tom,
Es gibt XClass++ in der Standardversion (ohne Quälcode) und in der Developerversion (mit Sourcen) - gleiches gilt auch für das ADSClass von ihnen.
Viele Grüße,
Martin
das hängt davon ab, wieviel Du bezahlst (und welches Paket Du kaufst).Tom hat geschrieben:...; ob die Klassenbibliotheken von DS-Datasoft auch im Quellcode vorliegen, weiß ich nicht.
Es gibt XClass++ in der Standardversion (ohne Quälcode) und in der Developerversion (mit Sourcen) - gleiches gilt auch für das ADSClass von ihnen.
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Tom,
jetzt weiß ich auch, warum ich mir bisher keine Gedanken über eXPress++ gemacht hatte. Wir hatten schon das Gespräch vor ein paar Monaten, dass Roger nur über Kreditkarte bezahlen läßt. Und da ich keine habe....
jetzt weiß ich auch, warum ich mir bisher keine Gedanken über eXPress++ gemacht hatte. Wir hatten schon das Gespräch vor ein paar Monaten, dass Roger nur über Kreditkarte bezahlen läßt. Und da ich keine habe....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Hallo Manfred
jetzt haben wir in deiner Person schon den ersten Programmier-Gott.
Sollen wir dir jetzt huldigen? Wie?
- ich weiss, das ist ziemlich OT, und zudem ja nicht deine "Schuld", Tom hat diese Rangliste ja erstellt.
Wohin soll ich das nun schreiben - in den Raucherraum wage ich mich als NR ja nicht rein ...
Gratulation und Gruss
Daniel
P.S. eXPress ohne Kreditkarte:
Geht auch, du kannst Michael Rudrich fragen, ob du das noch über ihn beziehen kannst.
jetzt haben wir in deiner Person schon den ersten Programmier-Gott.
Sollen wir dir jetzt huldigen? Wie?
- ich weiss, das ist ziemlich OT, und zudem ja nicht deine "Schuld", Tom hat diese Rangliste ja erstellt.
Wohin soll ich das nun schreiben - in den Raucherraum wage ich mich als NR ja nicht rein ...
Gratulation und Gruss
Daniel
P.S. eXPress ohne Kreditkarte:
Geht auch, du kannst Michael Rudrich fragen, ob du das noch über ihn beziehen kannst.
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
hi,
einsetzen wollen. Deshalb solltest du das "create(n)" der "Column" gleich
in eine eigene Funktion/Class umwandeln.
Die Möglichkeit die "Column" zu "manipulieren" z.b. Farbe ist auch der
wesentliche Unterschied zu XbpQuickBrowse.
Vergessen wird auch immer wieder gerne die "Presentation Parameter"
da diese wesentlich für das "Aussehen" der "Column" zuständig ist. Ohne
"PP" bekommt man z.B. keinen "Footer".
deshalb würde ich nicht :
verwenden sondern es "zerpflücken". Die "Feld"er etc. würde ich in
ein Array packen.
aDBF Array Strucktur :
1.) FELD als Codeblock oder String
2.) Breite der Spalte im XbpBrowse
3.) "Header" Text
4.) für Index OrdSetFocus(cName)
5.) Colorblock
6.) Footer im Beispiel nicht verwendet
klar kann man sich das Array so anpassen wie man es selber braucht.
Wie bauen wir nun aus dem Array die "Column" ?
wie ihr seht wird zuerst der "Presentation Parameter" aPP3 durch das
jeweilige aDBF Element ersetzt und ein "Column" Object erzeugt bevor
man dieses oBrowse:addColumn(oCol).
So damit hättest man ein Grundgerüst für eine eingene Funktion/Class
die man immer wieder verwenden kann.
gruss by OHR
Jimmy
wenn du XbpBrowse "im Griff" hast wirst du es wahrscheinlich "überall"Manfred hat geschrieben: Das ist jetzt erstmal das Grundgerüst, das läuft.
Hier experimentiere ich mit und schreibe dahinter, was zu welchem Ergebnis führt.Code: Alles auswählen
// Spalten für alle Felder anfangen FOR nI := 1 TO FCount() cField := FieldName( nI ) oBrowse:addColumn( FieldBlock ( cField ), , cField ) NEXT
einsetzen wollen. Deshalb solltest du das "create(n)" der "Column" gleich
in eine eigene Funktion/Class umwandeln.
Die Möglichkeit die "Column" zu "manipulieren" z.b. Farbe ist auch der
wesentliche Unterschied zu XbpQuickBrowse.
Vergessen wird auch immer wieder gerne die "Presentation Parameter"
da diese wesentlich für das "Aussehen" der "Column" zuständig ist. Ohne
"PP" bekommt man z.B. keinen "Footer".
deshalb würde ich nicht :
Code: Alles auswählen
oBrowse:addColumn( FieldBlock(cField ), ,cField )
ein Array packen.
Code: Alles auswählen
FUNCTION myBrowse
...
LOCAL aDBF := {;
{ {|| SCANDBF->W9MARK } , 1,"*","MARK",;
"IF(!EMPTY (SCANDBF->W9MARK),{ 0,12 },NIL )","" },;
{ {|| SCANDBF->ARTIST } ,15,"Artist" ,"ARTIST","","" },;
{ {|| SCANDBF->TITEL } ,15,"Titel" ,"TITEL" ,"","" }}
...
USE (zPATH+"myDBF.DBF") ALIAS SCANDBF SHARED
...
aPos := CenterPos( aSize, AppDesktop():currentSize() )
RETVAR := GBROWSE(oParent,aPos,aSize,aDBF,"MP3 suchen")
1.) FELD als Codeblock oder String
2.) Breite der Spalte im XbpBrowse
3.) "Header" Text
4.) für Index OrdSetFocus(cName)
5.) Colorblock
6.) Footer im Beispiel nicht verwendet
klar kann man sich das Array so anpassen wie man es selber braucht.
Wie bauen wir nun aus dem Array die "Column" ?
Code: Alles auswählen
FUNCTION GBROWSE(oParent,aPos,aSize,aDBF,cTitle)
...
LOCAL imax := LEN(aDBF) // Länge des Arrays
LOCAL aPP3 := { ;
{ XBP_PP_COL_HA_CAPTION , "" }, ;
{ XBP_PP_COL_HA_BGCLR , GRA_CLR_PALEGRAY }, ;
{ XBP_PP_COL_HA_FGCLR , GRA_CLR_BLACK }, ;
{ XBP_PP_COL_DA_BGCLR , GRA_CLR_WHITE }, ;
{ XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK }, ;
{ XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE }, ;
{ XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_BLUE }, ;
{ XBP_PP_COL_DA_CHARWIDTH , 1 }, ;
{ XBP_PP_COL_DA_CELLALIGNMENT , XBPALIGN_LEFT }, ;
{ XBP_PP_COL_DA_FRAMELAYOUT , XBPFRAME_NONE }, ;
{ XBP_PP_COL_DA_HILITEFRAMELAYOUT, XBPFRAME_NONE }, ;
{ XBP_PP_COMPOUNDNAME , FONT_HELV_SMALL }, ;
{ XBP_PP_COL_DA_CELLFRAMELAYOUT , XBPFRAME_BOX + XBPFRAME_RAISED } }
...
oDlg := XbpDialog():new( oParent, , aPos, aSize, , .F. )
...
oBrowse := GuiBrowseDb(oDlg:drawingArea, {0,0}, {aSize[1],aSize[2]})
FOR i:=1 TO imax
aPP3[1,2] := aDBF[i,2] // title name
aPP3[8,2] := aDBF[i,3] // field wide
IF EMPTY(aDBF[i,5]) // colorblock
aPP3[9,2] := XBPALIGN_LEFT
oCol := XbpColumn():new(oBrowse,,,, aPP3)
IF VALTYPE(aDBF[i,1])=="C"
oCol:dataLink := &("{||"+aDBF[i,1]+"}")
ELSE
oCol:dataLink := aDBF[i,1]
ENDIF
ELSE
aPP3[9,2] := XBPALIGN_RIGHT
oCol := XbpColumn():new(oBrowse,,,, aPP3)
IF VALTYPE(aDBF[i,1])=="C"
oCol:dataLink := &("{||"+aDBF[i,1]+"}")
ELSE
oCol:dataLink := aDBF[i,1]
ENDIF
// her now colorblock
oCol:colorBlock := &("{||"+aDBF[i,5]+"}")
ENDIF
oCol:create()
oBrowse:addColumn(oCol)
NEXT
oBrowse:show()
SetAppFocus(oBrowse)
oBrowse:refreshall()
jeweilige aDBF Element ersetzt und ein "Column" Object erzeugt bevor
man dieses oBrowse:addColumn(oCol).
So damit hättest man ein Grundgerüst für eine eingene Funktion/Class
die man immer wieder verwenden kann.
gruss by OHR
Jimmy
Zuletzt geändert von AUGE_OHR am Fr, 22. Sep 2006 19:42, insgesamt 1-mal geändert.
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi,
kurz den Kopf durchpusten lassen und zumindest ein Teil klappt jetzt.
kurz den Kopf durchpusten lassen und zumindest ein Teil klappt jetzt.
Code: Alles auswählen
*
*
*
* TEstumgebung für XbpBrowse mit dem versuch alle Schikanen einzubauen
********************************************************************************
#include "Appevent.ch"
#include "Common.ch"
#include "gra.ch"
#include "xbp.ch"
#pragma Library( "XppUi2.lib" )
********************************************************************************
PROCEDURE AppSys
RETURN
********************************************************************************
PROCEDURE main()
LOCAL cField
LOCAL mp1, mp2
LOCAL nI
LOCAL nEvent := 0
LOCAL oXbp, oBrowse, oSle
DbUseArea(.T.,"DBFCDX","\videoneu\datenbanken\vo\titel")
IF ! FILE("\videoneu\datenbanken\vo\titelxbpbrowse.cdx")
OrdCreate("\videoneu\datenbanken\vo\titelxbpbrowse","titel","UPPER(bez)")
ELSE
OrdListAdd("\videoneu\datenbanken\vo\titelxbpbrowse")
ENDIF
//Dialogfenster erzeugen
oXbp := GuiStdDialog( "Standard GUI Browser für DBF")
//Browser im Fenster erzeugen
oBrowse := GuiBrowseDb( oXbp:drawingArea )
oSle := XbpSle():new( oXbP:drawingArea,,,,,.T.)
oSle:keyboard := {|nKey,mp2,obj| browseSearch( nKey, obj, oBrowse, "titel")}
oSle:create()
BrowseResize( oSle, oBrowse, oXbp:drawingArea:currentSize())
// Spalten für alle Felder anfangen
FOR nI := 1 TO FCount()
cField := FieldName( nI )
oBrowse:addColumn( FieldBlock ( cField ), , cField )
NEXT
// Der Browser füllt nach :resize() immer das Fenster aus
oXbp:drawingArea:resize := { |mp1,mp2,obj| obj:childList()[1]:setSize(mp2) }
oXbp:show() // jetzt wird erst angezeigt
oBrowse:show() // da bei Erzeugung lVisible := .F. war
SetAppFocus( oSle )
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
RETURN
********************************************************************************
FUNCTION GuiBrowseDb(oParent,aPos,aSize)
LOCAL lVisible := .T.
LOCAL oBrowse
oBrowse := XbpBrowse():new( oParent,, aPos, aSize,, lVisible)
oBrowse:adjustHeight := .T. // damit die letzte zeile auch sichtbar wird
oBrowse:cursorMode := XBPBRW_CURSOR_ROW // die ganze Zeile als Cursor
oBrowse:softTrack := .F. // damit das Scrollen weich und sofort klappt
oBrowse:create()
// Navigationscodeblöcke für den Browser
oBrowse:skipBlock := {|n| DbSkipper(n) } // skipped vorwärts, oder rückwärts
oBrowse:goTopBlock := {| | DbGoTop() }
oBrowse:goBottomBlock := {| | DbGoBottom() }
oBrowse:phyPosBlock := {| | Recno() }
// Navigationscodeblöcke für den vertikalen Scrollbar
oBrowse:posBlock := {| | DbPosition() }
oBrowse:goPosBlock := {|n| DbGoPosition(n) }
oBrowse:lastPosBlock := {| | 100 }
oBrowse:firstPosBlock := {| | 0 }
RETURN oBrowse
********************************************************************************
FUNCTION GuiStdDialog( cTitle ) // das gibt das fertige Objekt zurück (aha!)
LOCAL aPos := {100,100} // Startpostion des Fensters auf dem Parentbildschirm
LOCAL aSize := {1024,768} // Größe des Fensters auf dem Parentbildschirm
LOCAL lVisible := .T. // bestimmt, ob der XbpDialog nach Aufruf von create() sichtbar ist
LOCAL oDlg
DEFAULT cTitle TO "Standard Dialog Fenster" // wenn kein Parameter mitgegeben werden würde
oDlg := XbpDialog():new(,,aPos,aSize,,lVisible)
oDlg:icon := 1 // dieses Icon ist nachher oben links sichtbar!?
oDlg:tasklist := .T. // bei .F. fehlen oben rechts die Button und der Rahmen
oDlg:title := cTitle // Überschriftentext oben im Kopf
oDlg:create() // Objekt wird erzeugt
// CenterControl(oDlg) // zentriert am Bildschirm
oDlg:drawingArea:setFontCompoundName( "8.Helv") // Schriftart im Fenster !?
RETURN oDlg
********************************************************************************
FUNCTION browseResize( oSle, obrowse, aSize)
oSle:setpos({0,aSize[2]-24})
oSle:setSize({aSize[1],24})
oBrowse:setSize({aSize[1], aSize[2]-24})
RETURN (.T.)
********************************************************************************
FUNCTION browseSearch( nKey, oSle, oBrowse, cIndex)
LOCAL cValue := Upper( Alltrim( oSle:editBuffer()))
Dbseek(cValue,.T.,cIndex)
oBrowse:refreshall() // ist das die richtige Lösung? aber es klappt jetzt
RETURN(.T.)
Zuletzt geändert von Manfred am Fr, 22. Sep 2006 19:50, insgesamt 1-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Jimmy,
das mit dem oBrowse:refreshall(), das hatte mir noch gefehlt......
Juchu, es klappt jetzt.
Jetzt geht es an den nächsten Punkt.
das mit dem oBrowse:refreshall(), das hatte mir noch gefehlt......
Juchu, es klappt jetzt.
Jetzt geht es an den nächsten Punkt.
Zuletzt geändert von Manfred am Fr, 22. Sep 2006 19:46, insgesamt 1-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi,
so wie es aussieht, ist der Tag schon wieder gerettet. Ich habe jetzt das SLE mit dem XbpBrowse verbunden und es klappt. Und vor allen Dingen, was mich am meisten freut, ist die Tatsache, das im Unterschied zum XbpQuickBrowse, im Browser gescrollt werden kann und dann der Datensatz wirklich übernommen wird, auf dem der Cursor steht. Das muß wohl an der unterschiedlichen Arbeitsweise von den beiden Browseklassen liegen.
Es klappt, der Scherbenhaufen ist erstmal wieder weg.....
so wie es aussieht, ist der Tag schon wieder gerettet. Ich habe jetzt das SLE mit dem XbpBrowse verbunden und es klappt. Und vor allen Dingen, was mich am meisten freut, ist die Tatsache, das im Unterschied zum XbpQuickBrowse, im Browser gescrollt werden kann und dann der Datensatz wirklich übernommen wird, auf dem der Cursor steht. Das muß wohl an der unterschiedlichen Arbeitsweise von den beiden Browseklassen liegen.
Es klappt, der Scherbenhaufen ist erstmal wieder weg.....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo Manfred,
genau, der XbpBrowse verhält sich mit dem Cursor parallel zu dem Satzzeiger ähnlich dem TBrowse von Clipper. Durch viele Parameter kann man den Browser anpassen und auch Editierfelder vorsehen, leider wird er für manche Aufgaben deshalb aber auch zu langsam.
Wenn man dann diese Flexibilität nicht braucht, dann kann man mit dem Quickbrowser wesentlich schnellere Anzeigen schaffen.
Das ist der Unterschied, der Rennwagen für reine Anzeigen, das gemächliche Schlachtschiff für die Schwergewichte
genau, der XbpBrowse verhält sich mit dem Cursor parallel zu dem Satzzeiger ähnlich dem TBrowse von Clipper. Durch viele Parameter kann man den Browser anpassen und auch Editierfelder vorsehen, leider wird er für manche Aufgaben deshalb aber auch zu langsam.
Wenn man dann diese Flexibilität nicht braucht, dann kann man mit dem Quickbrowser wesentlich schnellere Anzeigen schaffen.
Das ist der Unterschied, der Rennwagen für reine Anzeigen, das gemächliche Schlachtschiff für die Schwergewichte
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Hubert,
Du hast vollkommen Recht. XbpBrowse ist etwas langsamer. Aber allein die Tatsache, dass XbpBrowse auch den Datensatz ordentlich überneimmt, der nur im Browser angeklickt wurde, führt mich dahin, mich damit mehr zu beschäftigen.
Aber ich schätze einmal, es wird in der Zukunft sicherlich ein Zusammenspiel beider Browser für ihre jewiligen Zwecke geben. Allerdings erst, wenn ich ein wenig mehr Durchblick habe.
Jetzt geht es zum nächsten Schritt.
Du hast vollkommen Recht. XbpBrowse ist etwas langsamer. Aber allein die Tatsache, dass XbpBrowse auch den Datensatz ordentlich überneimmt, der nur im Browser angeklickt wurde, führt mich dahin, mich damit mehr zu beschäftigen.
Aber ich schätze einmal, es wird in der Zukunft sicherlich ein Zusammenspiel beider Browser für ihre jewiligen Zwecke geben. Allerdings erst, wenn ich ein wenig mehr Durchblick habe.
Jetzt geht es zum nächsten Schritt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi,
so, nachdem das Teil jetzt erstmal läuft, ist aber noch etwas merkwürdig aufgestoßen:
Wenn man das Fenster mit der Maus verändert, verschwindet das SLE und taucht auch nicht wieder auf. Es ist nur am rechten Rand zu sehen, dass es irgendwie im Hintergrund zu sehen ist.
Sicherlich eine Frage der Focussetzung? (tolles Wort). Aber wie macht man das denn dann?
@Jimmy,
Deine Beispiele werde ich mir am WE mal ansehen und schauen, ob ich da schon durchblicke. Also nicht denken, ich hätte sie nicht beachtet, oder ignoriert.
so, nachdem das Teil jetzt erstmal läuft, ist aber noch etwas merkwürdig aufgestoßen:
Code: Alles auswählen
*
*
*
* TEstumgebung für XbpBrowse mit dem versuch alle Schikanen einzubauen
********************************************************************************
#include "Appevent.ch"
#include "Common.ch"
#include "gra.ch"
#include "xbp.ch"
#pragma Library( "XppUi2.lib" )
********************************************************************************
PROCEDURE AppSys
RETURN
********************************************************************************
PROCEDURE main()
LOCAL cField
LOCAL mp1 := 0, mp2 := 0
LOCAL nI
LOCAL nEvent := 0
LOCAL oXbp, oBrowse, oSle
DbUseArea(.T.,,"titel")
IF ! FILE("titelxbpbrowse.ntx")
OrdCreate("titelxbpbrowse","titel","UPPER(bez)")
ELSE
OrdListAdd("titelxbpbrowse")
ENDIF
//Dialogfenster erzeugen
oXbp := GuiStdDialog( "Standard GUI Browser für DBF")
//Browser im Fenster erzeugen
oBrowse := GuiBrowseDb( oXbp:drawingArea )
oSle := XbpSle():new( oXbP:drawingArea,,,,,.F.)
oSle:keyboard := {|nKey,mp2,obj| browseSearch(obj, oBrowse, "titel")}
oSle:create()
BrowseResize( oSle, oBrowse, oXbp:drawingArea:currentSize())
// Spalten für alle Felder anfangen
FOR nI := 1 TO FCount()
cField := FieldName( nI )
oBrowse:addColumn( FieldBlock ( cField ), , cField )
NEXT
// Der Browser füllt nach :resize() immer das Fenster aus
oXbp:drawingArea:resize := { |mp1,mp2,obj| obj:childList()[1]:setSize(mp2) }
oXbp:show() // jetzt wird erst angezeigt
oBrowse:show() // da bei Erzeugung lVisible := .F. war
oSle:show()
SetAppFocus( oSle )
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
RETURN
********************************************************************************
FUNCTION GuiBrowseDb(oParent,aPos,aSize)
LOCAL lVisible := .F.
LOCAL oBrowse
oBrowse := XbpBrowse():new( oParent,, aPos, aSize,, lVisible)
oBrowse:adjustHeight := .T. // damit die letzte zeile auch sichtbar wird
oBrowse:cursorMode := XBPBRW_CURSOR_ROW // die ganze Zeile als Cursor
oBrowse:softTrack := .F. // damit das Scrollen weich und sofort klappt
oBrowse:create()
// Navigationscodeblöcke für den Browser
oBrowse:skipBlock := {|n| DbSkipper(n) } // skipped vorwärts, oder rückwärts
oBrowse:goTopBlock := {| | DbGoTop() }
oBrowse:goBottomBlock := {| | DbGoBottom() }
oBrowse:phyPosBlock := {| | Recno() }
// Navigationscodeblöcke für den vertikalen Scrollbar
oBrowse:posBlock := {| | DbPosition() }
oBrowse:goPosBlock := {|n| DbGoPosition(n) }
oBrowse:lastPosBlock := {| | 100 }
oBrowse:firstPosBlock := {| | 0 }
RETURN oBrowse
********************************************************************************
FUNCTION GuiStdDialog( cTitle ) // das gibt das fertige Objekt zurück (aha!)
LOCAL aPos := {100,100} // Startpostion des Fensters auf dem Parentbildschirm
LOCAL aSize := {1024,768} // Größe des Fensters auf dem Parentbildschirm
LOCAL lVisible := .F. // bestimmt, ob der XbpDialog nach Aufruf von create() sichtbar ist
LOCAL oDlg
DEFAULT cTitle TO "Standard Dialog Fenster" // wenn kein Parameter mitgegeben werden würde
oDlg := XbpDialog():new(,,aPos,aSize,,lVisible)
oDlg:icon := 1 // dieses Icon ist nachher oben links sichtbar!?
oDlg:tasklist := .T. // bei .F. fehlen oben rechts die Button und der Rahmen
oDlg:title := cTitle // Überschriftentext oben im Kopf
oDlg:create() // Objekt wird erzeugt
// CenterControl(oDlg) // zentriert am Bildschirm
oDlg:drawingArea:setFontCompoundName( "8.Helv") // Schriftart im Fenster !?
RETURN oDlg
********************************************************************************
FUNCTION browseResize( oSle, obrowse, aSize)
oSle:setpos({0,aSize[2]-24})
oSle:setSize({aSize[1],24})
oBrowse:setSize({aSize[1], aSize[2]-24})
RETURN (.T.)
********************************************************************************
FUNCTION browseSearch(oSle, oBrowse, cIndex)
LOCAL cValue := Upper( Alltrim( oSle:editBuffer()))
Dbseek(cValue,.T.,cIndex)
oBrowse:refreshAll()
RETURN(.T.)
Sicherlich eine Frage der Focussetzung? (tolles Wort). Aber wie macht man das denn dann?
@Jimmy,
Deine Beispiele werde ich mir am WE mal ansehen und schauen, ob ich da schon durchblicke. Also nicht denken, ich hätte sie nicht beachtet, oder ignoriert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16509
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Manfred,
der Fehler dürfte in Deinem Aufruf des BrowseResize liegen! Du nimmst dort ja die Größe der drawingArea - darfst Du natürlich nicht, da Du davon ja auch noch die Höhe des Sles abziehen mußt...
Viele Grüße,
Martin
der Fehler dürfte in Deinem Aufruf des BrowseResize liegen! Du nimmst dort ja die Größe der drawingArea - darfst Du natürlich nicht, da Du davon ja auch noch die Höhe des Sles abziehen mußt...
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.