Suchen im XbpBrowse
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Suchen im XbpBrowse
Moin,
wenn ich ein Array browse - wie bekomme ich dann den Zeilencursor auf einen bestimmten Satz gestellt? Beim browsen auf eine dbf ist das simpel, da stell ich mich einfach auf den Satz in der dbf und mach ein refresh. Aber hier beim Array steh ich gerade etwas ratlos da. Es muß doch eine Möglichkeit geben dem Browse zu sagen: Stell Dich bitte auf Arraysatz nnn.
Jan
wenn ich ein Array browse - wie bekomme ich dann den Zeilencursor auf einen bestimmten Satz gestellt? Beim browsen auf eine dbf ist das simpel, da stell ich mich einfach auf den Satz in der dbf und mach ein refresh. Aber hier beim Array steh ich gerade etwas ratlos da. Es muß doch eine Möglichkeit geben dem Browse zu sagen: Stell Dich bitte auf Arraysatz nnn.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12911
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Suchen im XbpBrowse
hi,
wie siegt dein Array "Skipper" aus .
man kann über den o:posblock die Position ansteuern
wie siegt dein Array "Skipper" aus .
Code: Alles auswählen
oBrowse:skipBlock := {|nSkip| -np + (np := MAX(1, MIN(LEN(aPlayground), np + nSkip))) }
oBrowse:goTopBlock := {|| np := 1}
oBrowse:goBottomBlock := {|| np := LEN(aPlayground) }
oBrowse:posBlock := {|| np }
oBrowse:phyPosBlock := {|| np }
oBrowse:lastPosBlock := {|| Len( aPlayground ) }
oBrowse:firstPosBlock := {|| 1 }
gruss by OHR
Jimmy
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 237
- Registriert: Do, 14. Aug 2008 14:59
- Wohnort: Straelen
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 3 Mal
Re: Suchen im XbpBrowse
Hallo Jan,
du brauchst eine ArrayBrowser-Klasse, die die aktuelle Recordnumber verwaltet. Also zB. eine Instanzvariable ::RecNo. Dann errechnest du in deiner Suchroutine die anzusteuernde Recordnumber nRec mit nachfolgenden oBrowse:RecNo := nRec und oBrowse:refreshAll(). Dann ist der Satzzeiger auf der gesuchten Browserzeile. So einfach geht das!
du brauchst eine ArrayBrowser-Klasse, die die aktuelle Recordnumber verwaltet. Also zB. eine Instanzvariable ::RecNo. Dann errechnest du in deiner Suchroutine die anzusteuernde Recordnumber nRec mit nachfolgenden oBrowse:RecNo := nRec und oBrowse:refreshAll(). Dann ist der Satzzeiger auf der gesuchten Browserzeile. So einfach geht das!
Viele Grüße
Dieter
Was man nicht versteht, besitzt man nicht.
Dieter
Was man nicht versteht, besitzt man nicht.
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Suchen im XbpBrowse
Jimmy,
und wie sieht das dann aus?
Jan
und wie sieht das dann aus?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Suchen im XbpBrowse
Dieter,
so einfach ist das für jemanden, der jeden Tag Klassen programmiert. Ich mach das aber eigentlich nie. Ich benutze hier einfach das Sample aus der Onlinedoku von Alaska, das ich ein wenig an meine Gegebenheiten angepasst habe.
Jan
so einfach ist das für jemanden, der jeden Tag Klassen programmiert. Ich mach das aber eigentlich nie. Ich benutze hier einfach das Sample aus der Onlinedoku von Alaska, das ich ein wenig an meine Gegebenheiten angepasst habe.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Rekursionen-Architekt
- Beiträge: 237
- Registriert: Do, 14. Aug 2008 14:59
- Wohnort: Straelen
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 3 Mal
Re: Suchen im XbpBrowse
Hallo Jan,
vielleicht kommst Du ja mit meiner ArrayBrowse-Klasse aus der Wissensbasis klar. Einfach von DKArrayBrowse statt von xbpBrowse ableiten und die neuen Instanzvariablen und Klassenmethoden nutzen. Ein Beispielprogramm liegt bei.
Es ist sehr schade, dass Alaska den Programmiern eine solche Klasse nicht standardmäßig zur Verfügung stellt. Außerdem ist die Klassendokumentation von xbpBrowse unzureichend. So erkennt man z.B. nicht auf Anhieb, wofür die Klassenvariablen :PosBlock zuständig ist. Ich habe festgestellt, das :PosBlock nur für den Rückgabewert des Prozentwertes (0 bis 100%) der Recordnumber-Position im Array zuständig ist. Der zuständige Codeblock wird gebraucht, um die vertikale Scrollbar in Abhängigkeit von der Recordnumber zu steuern. Auf keinen Fall kann man damit den Satzzeiger auf eine vorberechnete Browserzeile bringen.
vielleicht kommst Du ja mit meiner ArrayBrowse-Klasse aus der Wissensbasis klar. Einfach von DKArrayBrowse statt von xbpBrowse ableiten und die neuen Instanzvariablen und Klassenmethoden nutzen. Ein Beispielprogramm liegt bei.
Es ist sehr schade, dass Alaska den Programmiern eine solche Klasse nicht standardmäßig zur Verfügung stellt. Außerdem ist die Klassendokumentation von xbpBrowse unzureichend. So erkennt man z.B. nicht auf Anhieb, wofür die Klassenvariablen :PosBlock zuständig ist. Ich habe festgestellt, das :PosBlock nur für den Rückgabewert des Prozentwertes (0 bis 100%) der Recordnumber-Position im Array zuständig ist. Der zuständige Codeblock wird gebraucht, um die vertikale Scrollbar in Abhängigkeit von der Recordnumber zu steuern. Auf keinen Fall kann man damit den Satzzeiger auf eine vorberechnete Browserzeile bringen.
Viele Grüße
Dieter
Was man nicht versteht, besitzt man nicht.
Dieter
Was man nicht versteht, besitzt man nicht.
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Suchen im XbpBrowse
Hallo Dieter,
ja, ich hatte das schon gesehen und mir runter geladen. Ich schau da mal rein, weiß aber leider noch nicht wann ich das schaffe.
Jan
ja, ich hatte das schon gesehen und mir runter geladen. Ich schau da mal rein, weiß aber leider noch nicht wann ich das schaffe.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12911
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Suchen im XbpBrowse
hi,
für Jan sollte es ein Hinweis sein das "np" die Item Nummer ist in meinem Array "Skipper"
mehr braucht man nicht für ein Array was sich vergrössern/verkleinern kann zur Laufzeit
---
wenn man nun eine eigene CLASS schreibt macht man aus "np" -> "::np"
ein Array Elemet erreicht man durch die Item Nummer die man im :PosBlock angibt die dann die % "errechnet"Dieter hat geschrieben: ↑Fr, 12. Jun 2020 8:35 Ich habe festgestellt, das :PosBlock nur für den Rückgabewert des Prozentwertes (0 bis 100%) der Recordnumber-Position im Array zuständig ist. Der zuständige Codeblock wird gebraucht, um die vertikale Scrollbar in Abhängigkeit von der Recordnumber zu steuern. Auf keinen Fall kann man damit den Satzzeiger auf eine vorberechnete Browserzeile bringen.
Code: Alles auswählen
lastPosBlock := {|| Len( aPlayground ) }
Code: Alles auswählen
oBrowse:skipBlock := {|nSkip| -np + (np := MAX(1, MIN(LEN(aPlayground), np + nSkip))) }
---
wenn man nun eine eigene CLASS schreibt macht man aus "np" -> "::np"
Code: Alles auswählen
METHOD MYClass:GoTo(nNo)
IF nNo <= LEN(::aPlayground)
::np := nNo
::Refreshall()
ENDIF
RETURN
gruss by OHR
Jimmy
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 237
- Registriert: Do, 14. Aug 2008 14:59
- Wohnort: Straelen
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 3 Mal
Re: Suchen im XbpBrowse
Hallo Jimmy,
ich habe in meinen früheren Ausführungen immer darauf hingewiesen, dass man vernüftigerweise eine Instanzvariable benötigt, die die Recordnumber des Arrays verwaltet. Das tust du jetzt auch mit deinen neuen Codefragmenten und somit stimmen wir in der Sache überein. Ich schätze deine Kompetenz und Hilfsbereitschaft sehr. Aber deine hier früher eingestellte Codezeile ist leider falsch und muss berichtigt werden.
ich habe in meinen früheren Ausführungen immer darauf hingewiesen, dass man vernüftigerweise eine Instanzvariable benötigt, die die Recordnumber des Arrays verwaltet. Das tust du jetzt auch mit deinen neuen Codefragmenten und somit stimmen wir in der Sache überein. Ich schätze deine Kompetenz und Hilfsbereitschaft sehr. Aber deine hier früher eingestellte Codezeile
Code: Alles auswählen
oBrowse:posBlock := {|| np }
Viele Grüße
Dieter
Was man nicht versteht, besitzt man nicht.
Dieter
Was man nicht versteht, besitzt man nicht.
- AUGE_OHR
- Marvin
- Beiträge: 12911
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Suchen im XbpBrowse
hi,
der Code hat ja die Variable "np" die im "reduzierten" Code überall auftaucht.
nun stellt sich doch die Frage wofür steht "np" und das ist auch die Lösung zur Frage von Jan.
das Beispiel mit CLASS VAR soll zeigen wie man sich eine Method GoTo() schreiben kann
---
man kann über den Scrollbar die Position bestimmen.
wenn ich den Wert "vorgebe" und dann
ausführe dann landet er auf der gewünschten Position.
wenn man sich den Codeblock ansieht müsste man erkennen das dort "nur" die Nummer des Item raus kommt.
sobald man den Pointer ( "np") bestückt und den "Skipper" aktiviert ( refresh ) bekommt man das Array Item angezeigt.
der Code hat ja die Variable "np" die im "reduzierten" Code überall auftaucht.
nun stellt sich doch die Frage wofür steht "np" und das ist auch die Lösung zur Frage von Jan.
das Beispiel mit CLASS VAR soll zeigen wie man sich eine Method GoTo() schreiben kann
---
man kann über den Scrollbar die Position bestimmen.
wenn ich den Wert "vorgebe" und dann
Code: Alles auswählen
EVAL(oBrowse:posBlock)
wenn man sich den Codeblock ansieht müsste man erkennen das dort "nur" die Nummer des Item raus kommt.
sobald man den Pointer ( "np") bestückt und den "Skipper" aktiviert ( refresh ) bekommt man das Array Item angezeigt.
gruss by OHR
Jimmy
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 237
- Registriert: Do, 14. Aug 2008 14:59
- Wohnort: Straelen
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 3 Mal
Re: Suchen im XbpBrowse
Hallo Jimmy,
ich habe nochmal in der Alaska-Dokumentation folgendes nachgelesen:
:phyPosBlock -> It returns a numeric value that indicates the physical position of the record pointer.
The code block is used by the browser, not by the vertical scroll bar.
For the display of databases the code block normally is {|| Recno() }.
:posBlock -> It returns a numeric value that indicates the logical position of the record pointer.
The return value is used to position the scroll box of the vertical scroll bar.
:goPosBlock -> Hier sind wohl zwei Navigationsmethoden möglich, wenn die Scrollbar betätigt wird:
a) prozentuale Navigation
b) absolute Navigation
Ich war jahrelang immer der Meinung, dass die prozentuale Navigation bei Betätigung der Scrollbar notwendig ist.
Da du die absolute Navigation anwendest, habe ich diese getestet und festgestellt, dass beides richtig positioniert.
In der Sache gibt es zwischen uns somit keine Differenzen mehr.
Ich bitte um Entschuldigung, dass ich eine deiner Codezeilen in Frage gestellt habe.
ich habe nochmal in der Alaska-Dokumentation folgendes nachgelesen:
:phyPosBlock -> It returns a numeric value that indicates the physical position of the record pointer.
The code block is used by the browser, not by the vertical scroll bar.
For the display of databases the code block normally is {|| Recno() }.
:posBlock -> It returns a numeric value that indicates the logical position of the record pointer.
The return value is used to position the scroll box of the vertical scroll bar.
:goPosBlock -> Hier sind wohl zwei Navigationsmethoden möglich, wenn die Scrollbar betätigt wird:
a) prozentuale Navigation
b) absolute Navigation
Ich war jahrelang immer der Meinung, dass die prozentuale Navigation bei Betätigung der Scrollbar notwendig ist.
Da du die absolute Navigation anwendest, habe ich diese getestet und festgestellt, dass beides richtig positioniert.
In der Sache gibt es zwischen uns somit keine Differenzen mehr.
Ich bitte um Entschuldigung, dass ich eine deiner Codezeilen in Frage gestellt habe.
Viele Grüße
Dieter
Was man nicht versteht, besitzt man nicht.
Dieter
Was man nicht versteht, besitzt man nicht.
- Marcus Herz
- 1000 working lines a day
- Beiträge: 860
- Registriert: Mo, 16. Jan 2006 8:13
- Wohnort: Allgäu
- Hat sich bedankt: 39 Mal
- Danksagung erhalten: 197 Mal
- Kontaktdaten:
Re: Suchen im XbpBrowse
:absolute Navigation mit :Recno, Goto und Lastrec()
Ich glaub, das funktioniert nur, wenn die Datei nicht indiziert ist, also Recno() gleich der Nummer in der Liste.
Ich glaub, das funktioniert nur, wenn die Datei nicht indiziert ist, also Recno() gleich der Nummer in der Liste.
Gruß Marcus
Den Kopf in den Sand zu stecken verbessert die Welt auch nicht.
Den Kopf in den Sand zu stecken verbessert die Welt auch nicht.
- AUGE_OHR
- Marvin
- Beiträge: 12911
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Suchen im XbpBrowse
hi,
im Help File unter XbpBrowse ist Beispiel 2 für ein Array
es wird also, wie bei DBF, ein "Skipper" genutzt
ich kürze es ab ( np == nRecno )
um den Cursor auf eine gewünschte Postion zu bringen muss man np bzw nRecno setzten und dann ein oBrowse:Refreshall()
wenn man
mit EVAL() ausführt dann gibt es ein automatisches "Refresh".
da du "Rookie" bist noch mal im Klartext :
im Help File unter XbpBrowse ist Beispiel 2 für ein Array
Code: Alles auswählen
STATIC aData
STATIC nLastRec
STATIC nRecno
oBrowse:SkipBlock := {|nSkip,oBrowse| DoSkip(nSkip,oBrowse) }
oBrowse:GoBottomBlock := {|| nRecno := Len(aData) }
oBrowse:GoTopBlock := {|| nRecno := 1 }
oBrowse:PosBlock := {|| nRecno }
oBrowse:PhyPosBlock := {|| nRecno }
oBrowse:LastPosBlock := {|| Len(aData) }
oBrowse:FirstPosBlock := {|| 1 }
FUNCTION DoSkip( nSkip )
LOCAL nCanSkip
IF nRecno + nSkip < 1 // "BoF"
nCanSkip := 1 - nRecno
ELSEIF nRecno + nSkip > nLastRec // "EoF"
nCanSkip := nLastRec - nRecno
ELSE
nCanSkip := nSkip
ENDIF
nRecno += nCanSkip
RETURN nCanSkip
ich kürze es ab ( np == nRecno )
Code: Alles auswählen
STATIC np := 1
oBrowse:skipBlock := {|nSkip| -np + (np := MAX(1, MIN(LEN(aPlayground), np + nSkip))) }
oBrowse:goTopBlock := {|| np := 1}
oBrowse:goBottomBlock := {|| np := LEN(aPlayground) }
oBrowse:posBlock := {|| np }
oBrowse:phyPosBlock := {|| np }
oBrowse:lastPosBlock := {|| Len( aPlayground ) }
oBrowse:firstPosBlock := {|| 1 }
Code: Alles auswählen
np := 123 // nRecno
oBrowse:Refreshall()
Code: Alles auswählen
oBrowse:posBlock := {|| np }
oBrowse:phyPosBlock := {|| np }
gruss by OHR
Jimmy
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 237
- Registriert: Do, 14. Aug 2008 14:59
- Wohnort: Straelen
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 3 Mal
Re: Suchen im XbpBrowse
Hallo Marcus,
Wenn Interesse besteht, dann veröffentliche ich auch meine DBF-Browse-Klasse in der Wissensbasis (wenn ich Zeit dafür finde!!). Durch gleiche und gleich-benamte Klassen-Methoden wird hier auch der Vorteil der Klassenprogrammierung deutlich.
Beim Array-Browse gibt es keine indizierte Datei. Man kann jederzeit das Array umsortieren. Wenn eine Tabelle mit n-Zeilen zuerst aufsteigend und danach absteigend nach einer Textspalte sortiert wird, dann zeigt die jeweilige RecNo beim Array-Browse auf unterschiedliche Datenzeilen. Man darf das nicht mit der RecNo einer DBF-Datei verwechseln, die für jeden gespeicherten Datensatz eineindeutig ist. Erst eine zugehörige Index-Datei zu einer DBF-Tabelle ändert die Reihenfolge. Beim DBF-Browse muss man also eine andere Indexdatei aktivieren, um die Reihenfolge der DBF-Browse-Tabelle zu ändern und danach genügt ein DBSeek() um den Satzzeiger zu positionieren. Beim Array-Browse muss man die RecNo vorher berechnen, wenn man den Satzzeiger auf einen bestimmten Satz positionieren will, z.B. mit Ascan(). Die von Jimmy und mir (siehe meine eigene Array-Browse-Klasse in der Wissensbasis) gezeigten Positionierungen in einem Array-Browse funktionieren immer!:absolute Navigation mit :Recno, Goto und Lastrec()
Ich glaub, das funktioniert nur, wenn die Datei nicht indiziert ist, also Recno() gleich der Nummer in der Liste.
Wenn Interesse besteht, dann veröffentliche ich auch meine DBF-Browse-Klasse in der Wissensbasis (wenn ich Zeit dafür finde!!). Durch gleiche und gleich-benamte Klassen-Methoden wird hier auch der Vorteil der Klassenprogrammierung deutlich.
Viele Grüße
Dieter
Was man nicht versteht, besitzt man nicht.
Dieter
Was man nicht versteht, besitzt man nicht.