Seite 1 von 1

Suchen im XbpBrowse

Verfasst: Mi, 03. Jun 2020 8:23
von Jan
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

Re: Suchen im XbpBrowse

Verfasst: Mi, 03. Jun 2020 20:07
von AUGE_OHR
hi,

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  }
man kann über den o:posblock die Position ansteuern

Re: Suchen im XbpBrowse

Verfasst: Do, 04. Jun 2020 10:08
von Dieter
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! :)

Re: Suchen im XbpBrowse

Verfasst: Fr, 05. Jun 2020 9:23
von Jan
Jimmy,

und wie sieht das dann aus?

Jan

Re: Suchen im XbpBrowse

Verfasst: Fr, 05. Jun 2020 9:24
von Jan
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

Re: Suchen im XbpBrowse

Verfasst: Fr, 12. Jun 2020 8:35
von Dieter
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.

Re: Suchen im XbpBrowse

Verfasst: Fr, 12. Jun 2020 8:48
von Jan
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

Re: Suchen im XbpBrowse

Verfasst: Fr, 12. Jun 2020 9:39
von AUGE_OHR
hi,
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.
ein Array Elemet erreicht man durch die Item Nummer die man im :PosBlock angibt die dann die % "errechnet"

Code: Alles auswählen

lastPosBlock  := {|| Len( aPlayground ) }
für Jan sollte es ein Hinweis sein das "np" die Item Nummer ist in meinem Array "Skipper"

Code: Alles auswählen

oBrowse:skipBlock     := {|nSkip| -np + (np := MAX(1, MIN(LEN(aPlayground), np + nSkip))) }
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"

Code: Alles auswählen

METHOD MYClass:GoTo(nNo)
   IF nNo <= LEN(::aPlayground)
      ::np := nNo
      ::Refreshall()
   ENDIF
RETURN

Re: Suchen im XbpBrowse

Verfasst: Fr, 12. Jun 2020 10:37
von Dieter
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

Code: Alles auswählen

 oBrowse:posBlock      := {|| np }
ist leider falsch und muss berichtigt werden.

Re: Suchen im XbpBrowse

Verfasst: Sa, 13. Jun 2020 6:43
von AUGE_OHR
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

Code: Alles auswählen

   EVAL(oBrowse:posBlock) 
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.

Re: Suchen im XbpBrowse

Verfasst: So, 14. Jun 2020 13:58
von Dieter
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. :(

Re: Suchen im XbpBrowse

Verfasst: Mo, 22. Jun 2020 15:04
von zaremi
Konntest du denn eine Lösung dazu finden?

Re: Suchen im XbpBrowse

Verfasst: Mo, 22. Jun 2020 15:52
von Marcus Herz
: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.

Re: Suchen im XbpBrowse

Verfasst: Di, 23. Jun 2020 3:09
von AUGE_OHR
hi,
zaremi hat geschrieben: Mo, 22. Jun 2020 15:04 Konntest du denn eine Lösung dazu finden?
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 
es wird also, wie bei DBF, ein "Skipper" genutzt

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  }
um den Cursor auf eine gewünschte Postion zu bringen muss man np bzw nRecno setzten und dann ein oBrowse:Refreshall()

Code: Alles auswählen

   np := 123  // nRecno
   oBrowse:Refreshall()
wenn man

Code: Alles auswählen

   oBrowse:posBlock      := {|| np }
   oBrowse:phyPosBlock   := {|| np }
mit EVAL() ausführt dann gibt es ein automatisches "Refresh".

Re: Suchen im XbpBrowse

Verfasst: Di, 23. Jun 2020 16:00
von Dieter
Hallo Marcus,
: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.
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!
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.