Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Seltsames Problem mit VIrtualStringTree (https://www.delphipraxis.net/189787-seltsames-problem-mit-virtualstringtree.html)

Lemmy 21. Jul 2016 06:12

Seltsames Problem mit VIrtualStringTree
 
Hallo,

ich habe hier ein seltsames Problem:

Daten werden aus einer DB gelesen, in Objekte verpackt und dann über den VirtualStringTree dargestellt. Wichtiger Bestandteil ist dabei ein längerer Text, der über MultiLine dargestellt wird. Nach dem Laden wird automatisch auf den letzten Eintrag gesprungen.

Bei einem Anwender tritt jetzt folgendes auf: Gibt es mehrere (viele) Einträge (Datensätze), dann wird der letzte Knoten nicht wie üblich am unteren Rand angezeigt, sondern klebt ganz oben. Darunter kommt dann ein großer weißer Bereich. Die vertikale Scrollbar ist dabei nicht am Ende ganz unten, sondern irgend wo bei 2/3 - sprich VST geht davon aus, dass nach dem letzten Eintrag noch was kommt (und daher klebt der Eintrag ganz oben.

Es werden keine Knoten ausgeblendet (vsVisible). Eingesetzt wird Version 5.5 mit Delphi 7

Kennt jemand das Verhalten von VST?

ConnorMcLeod 21. Jul 2016 07:28

AW: Seltsames Problem mit VIrtualStringTree
 
Das Verhalten kenne ich nicht, aber beim Lesen kommt mir der Gedanke, daß die Höhenberechnung vom VST für das lange Multiline nicht richtig funktioniert. IIRC gibt es ein Event, bei dem man die Dimensionen selbst bestimmen kann. Für diese -eigene- Höhenberechnung würde ich dann DrawText mit DT_CALCRECT verwenden.

Codehunter 21. Jul 2016 08:06

AW: Seltsames Problem mit VIrtualStringTree
 
Das klingt für mich so als würde da mit OwnerDraw gearbeitet, mit GetNodeAt(X,Y) ein Node über eine Koordinate geholt und beim letzten Node der Zeiger auf NIL lauten. Dann wirft GetDisplayRect 0,0 als Topleft-Koordinate aus und der Node pappt am oberen Rand. Daher vermute ich ein simples Koordinatenproblem in einer der OnPaintXyz-Ereignisse. Ohne Einblick in den Source aber schwer zu beurteilen.

Da sich das Problem mit zunehmender Zahl der Nodes zu verstärken scheint, würde ich mal überprüfen ob IMMER mit der korrekten Höhe des NodeRect gearbeitet wird und nicht zufällig zwischendurch mit einem Pixel weniger Höhe gearbeitet wird. Das würde am Ende die große freie Fläche erklären.

Aviator 21. Jul 2016 08:40

AW: Seltsames Problem mit VIrtualStringTree
 
Werden beim Laden der Nodes zufälligerweise manche irrelevanten Nodes wieder ausgeblendet? Wie beim einem Filter z.B.? Je nachdem wie das gemacht wird, ergibt das genau dieses Verhalten. Hatte das Problem auch schonmal und mir das deshalb gemerkt. Nur um dir richtig weiterhelfen zu können, müsstest du uns evtl. auch noch den SourceCode anhängen. Zumindest die relevanten Abschnitte (Laden der Daten in den VST, mögliche Stellen an denen die Nodes wieder bearbeitet/visible geschaltet werden, usw.).

Lemmy 21. Jul 2016 09:24

AW: Seltsames Problem mit VIrtualStringTree
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1343105)
daß die Höhenberechnung vom VST für das lange Multiline nicht richtig funktioniert.

hm... warum funktioniert das dann bei tausenden anderen Anwendern? ;-) Die teilweise noch längere Texte haben... .


Aber ich hatte gestern auch schon mal die Idee, einfach die Multiline weg zu lassen und schauen ob das eine Auswirkung hat...

Zitat:

Zitat von Codehunter (Beitrag 1343107)
Das klingt für mich so als würde da mit OwnerDraw gearbeitet, mit GetNodeAt(X,Y) ein Node über eine Koordinate geholt ...

Nope...
OnBeforeCellPaint: Zeilen unterschiedlich einfärben
OnChange: Knoten auswählen
OnCompareNodes: Sortieren
OnGetTExt: Darstellung
OnMeasureItem: Knotenhöhe berechnen

Mehr passiert nicht...


Zitat:

Zitat von Aviator (Beitrag 1343110)
Werden beim Laden der Nodes zufälligerweise manche irrelevanten Nodes wieder ausgeblendet? Wie beim einem Filter z.B.?

war gestern auch meine erste Vermutung, das habe ich an einer anderen Stelle im Programm mal gemacht, aber nicht bei dem Baum, der wird bei einer Filteränderung (da gibt es nicht viele) neu geladen bzw. die Knoten neu aus der Objektliste (die die Daten vorhält) neu aufgebaut und nur die relevanten Knoten erzeugt. Sehe gerade dass ich das oben schon erwähnt habe :-) (Es werden keine Knoten ausgeblendet (vsVisible))

ConnorMcLeod 21. Jul 2016 10:19

AW: Seltsames Problem mit VIrtualStringTree
 
Zitat:

Zitat von Lemmy (Beitrag 1343113)
Zitat:

Zitat von ConnorMcLeod (Beitrag 1343105)
daß die Höhenberechnung vom VST für das lange Multiline nicht richtig funktioniert.

hm... warum funktioniert das dann bei tausenden anderen Anwendern? ;-) Die teilweise noch längere Texte haben... .

Gibt es gemeine Sonderzeichen in dem Text, die die Darstellung verwirren?

Aviator 21. Jul 2016 10:22

AW: Seltsames Problem mit VIrtualStringTree
 
Zitat:

Zitat von Lemmy (Beitrag 1343113)
Sehe gerade dass ich das oben schon erwähnt habe :-) (Es werden keine Knoten ausgeblendet (vsVisible))

Sorry. Habe ich dann wohl überlesen. :oops:

Aber nichts desto trotz sollte man den Nodes nicht einfach den Status vsVisible wegnehmen, sondern die Node über die VST-Methode
Delphi-Quellcode:
IsVisible
entsprechend (un)sichtbar schalten. Erst dann wird nämlich die Scrollbar richtig berechnet. Das nur als Tipp am Rande. :stupid:

Lemmy 21. Jul 2016 10:33

AW: Seltsames Problem mit VIrtualStringTree
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1343120)
Gibt es gemeine Sonderzeichen in dem Text, die die Darstellung verwirren?

bin ich noch am klären.. Ich befürchte ich muss mir die DB mal vom Kunden holen...

Zitat:

Zitat von Aviator (Beitrag 1343122)
Aber nichts desto trotz sollte man den Nodes nicht einfach den Status vsVisible wegnehmen, sondern die Node über die VST-Methode
Delphi-Quellcode:
IsVisible
entsprechend (un)sichtbar schalten. Erst dann wird nämlich die Scrollbar richtig berechnet. Das nur als Tipp am Rande. :stupid:

Danke für den Tipp, werde ich gleich an der anderen Stelle umsetzen....


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz