Scrollbalken bei set Filter

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Scrollbalken bei set Filter

Beitrag von saul »

Hallo,
der vertikale Scrollbalken scheint, wenn ich einen Filter setze, nicht mehr richtig zu funktionieren. Es scheint so wenn der Balken dann die Position jedes Datensatzes in der ganzen Datenbank anzeigt. Wäre das denkbar?

mfg
Wolfgang
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Scrollbalken bei set Filter

Beitrag von UliTs »

Was meinst Du?
Hast Du vielleicht ein XbpBrowse, welches sich auf eine Tabelle mit Filter bezieht?

Alaska hat da den Scrollbalken nicht gut implementiert. Wenn ein Filter gesetzt ist, dann kann XbpBrowse die Position nur dann korrekt bestimmen, wenn es zuvor sämtliche dem Filter entsprechende Datensätze untersucht hat. Und dass kann (natürlich) zu viel zu großen Zeitverzögerungen führen! Besser wäre meines Erachtens, wenn der Scrollbalken in diesen Fällen grundsätzlich (außer beim ersten und letzten Datensatz) in der Mitte stehen würde.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Scrollbalken bei set Filter

Beitrag von brandelh »

Der Scrollbalken ist recht einfach gehalten, MIN MAX Werte bestimmen die Rahmen und der aktuelle Wert die aktuelle Position des "Schiebereglers".

Wenn man weder Filter noch Index hat, war das schon immer einfach 1, LastRec(), RecNo().
Mit Index war das immer ein Problem, aber Xbase seit ( ? ) kennt:
Handbuch hat geschrieben: DbPosition() --> nPercent

Rückgabe
Die Funktion gibt einen Wert zwischen 0 und 100 zurück. Er kennzeichnet die Position des Satzzeigers als Prozentwert.
Beschreibung
Mit der Funktion DbPosition() wird die Position des Satzzeigers als Prozentwert ermittelt. Sie arbeitet unabhängig davon ob in der Workarea ein kontrollierender Index aktiv ist oder nicht. Damit kann die Position des Satzzeigers sehr einfach mit einem Scrollbar visualisiert werden. Der Wertebereich für den Scrollbar muß zwischen 0 und 100 liegen,
Grundsätzlich müsste dbPosition() auch mit Filter funktionieren, wenn aber am Anfang und Ende viele Sätze übersprungen werden wird es etwa unschön.
Der einzige Ausweg wäre die genaue Anzahl angezeigter Datensätze zu ermitteln und eine Art von Laufzähler zu bauen, je nach Datenbestand SEHR LANGSAM und wenn neue hinzu kommen wirklich unschön.

Du kannst aber auch eine eigene Funktion angeben, die wie vorgeschlagen 50% ausgibt, solange nicht BOF() oder EOF() erreicht ist (dann 0 bzw. 100)
Oder aber dbPosition() und zusätzlich BOF() und EOF() um das Ergebnis zu verbessern sobald die Grenzen erreicht sind.

Ich muss zugeben, dass mir dieser Aufwand immer zuviel war ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Scrollbalken bei set Filter

Beitrag von AUGE_OHR »

wie Huber schon sagte "sollte" es funktionieren in einem Browse.
was für ein Umstand es mit Index und Scrollbar ist kannst du im Help Beispiel für OrdKeyNo() mit TBrowse sehen

wenn man nun einen Filter verwendet will man ja nur eine Teilmenge haben ... ähnlich einer SQL Query.
wenn du also die Ergebnisse eines Filter / Query in einem Array sammelst und das im Browse anzeigst dann hast du auch keine Problem mit dem Scrollbar ;)
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Scrollbalken bei set Filter

Beitrag von UliTs »

AUGE_OHR hat geschrieben:...wenn man nun einen Filter verwendet will man ja nur eine Teilmenge haben ... ähnlich einer SQL Query.
wenn du also die Ergebnisse eines Filter / Query in einem Array sammelst und das im Browse anzeigst dann hast du auch keine Problem mit dem Scrollbar ;)
Das stimmt. Allerdings müssen dann auch alle Datensätze vor dem Anzeigen gelesen werden, was gegebenenfalls auch zu unerwünschten Wartezeiten führt ... :D
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Scrollbalken bei set Filter

Beitrag von Martin Altmann »

Ratzfatz funktioniert das mit DbEval(), unter Angabe der passenden Filterbedingung als zweiten Codeblock(parameter).

Viele Grüße,
Martin
:grommit:
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.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Scrollbalken bei set Filter

Beitrag von brandelh »

und selbst wenn das Einlesen etwas dauert, die Anzeige danach (mit den Array-Daten) geht rasend schnell ;-)
Wenn man sich dann noch die Satznummer merkt, kann man schnell auf einen angezeigten Satz zugreifen (offene DBF verhindert PACK !)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Scrollbalken bei set Filter

Beitrag von AUGE_OHR »

UliTs hat geschrieben:Allerdings müssen dann auch alle Datensätze vor dem Anzeigen gelesen werden, was gegebenenfalls auch zu unerwünschten Wartezeiten führt ... :D
schon mal was von einem dynamischen Auffüllen mittels Thread von Arrays gehört ... aber es geht ja auch gar nicht um das finden der Treffer.

wie schon gesagt die Frage hier war der vertikale Scrollbar wofür DbPosition() (ein einer DBF) zuständig wäre was aber bei FILTER (und bei pgDBE / SQL ) versagt.
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Scrollbalken bei set Filter

Beitrag von UliTs »

Schon mal was davon gehört, dass du bei dynamischen auffüllen von Arrays nicht weißt, wie groß das Array ist?
Und das brauchst Du für die korrekte Umsetzung von DbPosition().

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Scrollbalken bei set Filter

Beitrag von brandelh »

Nicht unbedingt, man könnte bei der Berechnung der aktuellen Position im Array jeweils die Anzahl neu ermitteln.
Dies würde dann zu einem "zurückspringen" der Positionsanzeige führen, aber irgendwas ist immer ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Scrollbalken bei set Filter

Beitrag von AUGE_OHR »

UliTs hat geschrieben:Schon mal was davon gehört, dass du bei dynamischen auffüllen von Arrays nicht weißt, wie groß das Array ist?
Und das brauchst Du für die korrekte Umsetzung von DbPosition().
so so ... für ein Array ein DBposition ... [-X

Code: Alles auswählen

   oBrowse:skipBlock     := {|n,obj| SkipArray( n, obj:cargo ) }
   oBrowse:goTopBlock    := {|obj| obj:cargo[ ARR_NO ] := 1 }
   oBrowse:goBottomBlock := {|obj| obj:cargo[ ARR_NO ] := Len( obj:cargo[ ARR_SRC ] ) }
   oBrowse:posBlock      := {|obj| obj:cargo[ ARR_NO ]  }
   oBrowse:phyPosBlock   := {|obj| obj:cargo[ ARR_SORT, obj:cargo[ ARR_NO ] ] }
   oBrowse:lastPosBlock  := {|obj| Len( obj:cargo[ ARR_SRC ] ) }
   oBrowse:firstPosBlock := {|obj| 1  }
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Scrollbalken bei set Filter

Beitrag von UliTs »

AUGE_OHR hat geschrieben:...so so ... für ein Array ein DBposition ... [-X

Code: Alles auswählen

   oBrowse:skipBlock     := {|n,obj| SkipArray( n, obj:cargo ) }
   oBrowse:goTopBlock    := {|obj| obj:cargo[ ARR_NO ] := 1 }
   oBrowse:goBottomBlock := {|obj| obj:cargo[ ARR_NO ] := Len( obj:cargo[ ARR_SRC ] ) }
   oBrowse:posBlock      := {|obj| obj:cargo[ ARR_NO ]  }
   oBrowse:phyPosBlock   := {|obj| obj:cargo[ ARR_SORT, obj:cargo[ ARR_NO ] ] }
   oBrowse:lastPosBlock  := {|obj| Len( obj:cargo[ ARR_SRC ] ) }
   oBrowse:firstPosBlock := {|obj| 1  }
Da hast Du ja DbPosition() schön für ein Array umgesetzt :) :!: Aber was soll das [-X bedeuten?
Und len() innerhalb ::LastPosBlock() ist eine gute Idee. Da hat man zwar keine korrekte aber doch eine vernünftige und akzeptable Lösung für die parallele Erzeugung des Arrays während der Darstellung. Aktualisierst Du dann alle paar Sekunden die Darstellung des Browsers bis das Array fertig erzeugt ist?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Scrollbalken bei set Filter

Beitrag von brandelh »

Die Vorgehensweise ist schön beschrieben in einem Beitrag von Alaska:

http://www.alaska-software.com/download ... section=40

* MT Tutorial Part I ... The Multi-Threading Tutorial Part I ... oder
* MT Tutorial Part II ... The Multi-Threading Tutorial Part II
Gruß
Hubert
Antworten