Suchen im XbpBrowse

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Suchen im XbpBrowse

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Suchen im XbpBrowse

Beitrag 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
gruss by OHR
Jimmy
Dieter
Rekursionen-Architekt
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

Beitrag 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! :)
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Suchen im XbpBrowse

Beitrag von Jan »

Jimmy,

und wie sieht das dann aus?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Suchen im XbpBrowse

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Dieter
Rekursionen-Architekt
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

Beitrag 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.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Suchen im XbpBrowse

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Suchen im XbpBrowse

Beitrag 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
gruss by OHR
Jimmy
Dieter
Rekursionen-Architekt
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

Beitrag 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.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Suchen im XbpBrowse

Beitrag 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.
gruss by OHR
Jimmy
Dieter
Rekursionen-Architekt
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

Beitrag 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. :(
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
zaremi
Rookie
Rookie
Beiträge: 3
Registriert: Mo, 15. Jun 2020 12:31

Re: Suchen im XbpBrowse

Beitrag von zaremi »

Konntest du denn eine Lösung dazu finden?
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Suchen im XbpBrowse

Beitrag 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.
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Suchen im XbpBrowse

Beitrag 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".
gruss by OHR
Jimmy
Dieter
Rekursionen-Architekt
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

Beitrag 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.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Antworten