[Gelöst] VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Thnx, so klappt es!
Armin.
Armin.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Wegen des nicht OnClick-baren letzen Node erscheint mir folgende Stelle verdächtig:
Wenn hier der unteer Rand des ClientRect um die Header-Höhe nach oben geschoben wird, fällt die unterste Zeile mit großer Wahrscheinlichkeit aus dem ClientRect. Und das erklärt auch die Beobachtung, dass das Problem verschwindet, wenn der Header ausgeblendet wird.
Ersetze das "Dec()" in diesem Code durch
kommt die Message in deinem Programm auch beim Click auf der letzten Zeile.
Irgendwie kommt mir das sehr bekannt vor, wie wenn es hier, im englischen Forum oder im Bugtracker schon mal diskutiert worden wäre...
Code: Alles auswählen
function TBaseVirtualTree.GetClientRect: TRect;
begin
Result := inherited;
//lclheader
if HandleAllocated and (hoVisible in FHeader.FOptions) then
Dec(Result.Bottom, FHeader.Height);
end;
Ersetze das "Dec()" in diesem Code durch
Code: Alles auswählen
Inc(Result.Top, FHeader.Height);
Irgendwie kommt mir das sehr bekannt vor, wie wenn es hier, im englischen Forum oder im Bugtracker schon mal diskutiert worden wäre...
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Habs schnell eingebaut, und es klappt wunderbar. Logisch ist es auch.
Was mich jetzt noch stutzig macht: der Bug ist doch alles Andere als unauffällig, und Nodes klicken ist keine selten gebrauchte Funktion, und den VirtualTreeView gibt es doch auch schon 15 Jahre oder so. Ich fand den Bug in allen Treeview Versionen mit denen ich mich die letzen Wochen herumgeplagt habe, incl. der in Lazarus eingebauen Version von 2014.
Was soll ich daraus schließen, dass er so lange unentdeckt geblieben ist? Bin ich die einzige arme S** die sich unter Lazarus mit dieser Komponente beschäftigt?
Da stimmt doch was nicht.
Armin.
P.S. ich hab den Bugtrack-Eintrag gefunden: https://bugs.freepascal.org/view.php?id=38482
2/2021. Und vorher hat das keiner bemerkt?
Was mich jetzt noch stutzig macht: der Bug ist doch alles Andere als unauffällig, und Nodes klicken ist keine selten gebrauchte Funktion, und den VirtualTreeView gibt es doch auch schon 15 Jahre oder so. Ich fand den Bug in allen Treeview Versionen mit denen ich mich die letzen Wochen herumgeplagt habe, incl. der in Lazarus eingebauen Version von 2014.
Was soll ich daraus schließen, dass er so lange unentdeckt geblieben ist? Bin ich die einzige arme S** die sich unter Lazarus mit dieser Komponente beschäftigt?
Da stimmt doch was nicht.
Armin.
P.S. ich hab den Bugtrack-Eintrag gefunden: https://bugs.freepascal.org/view.php?id=38482
2/2021. Und vorher hat das keiner bemerkt?
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Report-Datum 2/2021, priority "minor". Jan Bouwman und ich - wir sind also wohl zwei auf der Welt, die den VirtualTreeView nützen wollen, und die einzigen beiden, die seit 2015 einmal auf den untersten Node geklickt haben.
Und wenn so ein Bug, der immerhin einen kompletten Node unbenützbar macht, "minor" ist, was ist dann "severe"?
Armin.
Und wenn so ein Bug, der immerhin einen kompletten Node unbenützbar macht, "minor" ist, was ist dann "severe"?
Armin.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Das VST nutze ich in mehreren Anwendungen, die ich seit längerem nicht angefasst habe und ihren Dienst tun. Wie gesagt, hier geht es auch so.
Bei dem Beispiel kann ich allerdings, mit oder ohne Header, per Mausrad nur bis zum Eintrag 16 scrollen (was IMHO nicht sein sollte). Daher habe ich das Formular so vergrößert, daß Eintrag 19 sichtbar wird. Es wird immer OnClick gefeuert.
Übrigens kann ich mit dem veränderten Code von wp nur noch bis Index 14 scrollen, wenn der Header an ist, ohne Header bis Index 16.
Bei dem Beispiel kann ich allerdings, mit oder ohne Header, per Mausrad nur bis zum Eintrag 16 scrollen (was IMHO nicht sein sollte). Daher habe ich das Formular so vergrößert, daß Eintrag 19 sichtbar wird. Es wird immer OnClick gefeuert.
Übrigens kann ich mit dem veränderten Code von wp nur noch bis Index 14 scrollen, wenn der Header an ist, ohne Header bis Index 16.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Michl, du hast recht.
Irgendwie ist das aber sowieso oberfaul, denn wieso sollte der Tree ein ClientRect ohne den Header haben. ClientRect ist eine zentrale Größe in der LCL, und wenn man damit herumspielt, kann man viel kaputt machen.
Nimral, der Fehler ist bisher wahrscheinlich nicht aufgefallen, weil der Klick als solcher ja funktioniert. Was nicht geht, ist das OnClick-Ereignis. Aber hier würde ist stattdessen das viel mächtigere OnNodeClick nehmen, das mir den kompletten HitTest-Record liefert, so dass ich weiß, wo genau ich geklickt habe (auf welchem Node, auf dem Label, dahinter, auf dem Icon usw.).
Irgendwie ist das aber sowieso oberfaul, denn wieso sollte der Tree ein ClientRect ohne den Header haben. ClientRect ist eine zentrale Größe in der LCL, und wenn man damit herumspielt, kann man viel kaputt machen.
Nimral, der Fehler ist bisher wahrscheinlich nicht aufgefallen, weil der Klick als solcher ja funktioniert. Was nicht geht, ist das OnClick-Ereignis. Aber hier würde ist stattdessen das viel mächtigere OnNodeClick nehmen, das mir den kompletten HitTest-Record liefert, so dass ich weiß, wo genau ich geklickt habe (auf welchem Node, auf dem Label, dahinter, auf dem Icon usw.).
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
- gelöscht - war Unsinn.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Strange. Mein Beispiel funktioniert bei mir mit wps Änderung (eingebaut in die Laz.Treeview Komponente) tadellos, auch mit 19 Nodes, und auch wenn Node 19 nur teilweise sichtbar ist, und auch wenn ich einen anderen Node als den Letzen an den unteren Rand scrolle, egal ob er ganz oder teilweise sichtbar ist. Auch das Mausrad funktioniert genau wie es soll.Michl hat geschrieben: ↑So 16. Mai 2021, 20:04Das VST nutze ich in mehreren Anwendungen, die ich seit längerem nicht angefasst habe und ihren Dienst tun. Wie gesagt, hier geht es auch so.
Bei dem Beispiel kann ich allerdings, mit oder ohne Header, per Mausrad nur bis zum Eintrag 16 scrollen (was IMHO nicht sein sollte). Daher habe ich das Formular so vergrößert, daß Eintrag 19 sichtbar wird. Es wird immer OnClick gefeuert.
Übrigens kann ich mit dem veränderten Code von wp nur noch bis Index 14 scrollen, wenn der Header an ist, ohne Header bis Index 16.
Was mit Laz.VirtualTree nicht mehr geht: wenn ich den obersten teilweise sichtbaren Node anklicke, wird das Fenster ein wenig heruntergescrollt damit er ganz sichtbar wird. Finde ich nicht blöd. Beim untersten sichtbaren Node gibt es diese Funktionalität im Original-Package, das mit Lazarus mitkommt, aber mit Laz.VirtualTree ist sie leider weg .
Armin.
P.S. danke für den Hinweis auf onNodeClick, den hatte ich bisher nicht auf dem Schirm. Und was soll ich sagen, der funktioniert mit der Originalversion wie er soll, mit und ohne Header und mit Node-Schubs oben und unten bis sichtbar und allem udn Mausrad und so weiter. Ich denke, ich reiß das Projekt wieder mal um 180 Grad rum und wechsle von Laz.Treeview wieder reumütig zurück, in diesem Fall vorwärts, auf den eingebauten Treeview.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Genau. Wenn du nicht Riesenmengen an Daten anzeigen willst (was an sich ohnehin ein Problem ist) und keinen Tree mit zusätzlichen Spalten wie bei einem StringGrid brauchst, ist der Standard-Treeview ausreichend. Ich versuche Drittkomponenten immer soweit wie möglich zu vermeiden, weil ich bei meinen vielen Laz-Installationen diese immer gerade nicht installiert habe, wenn ich sie brauche.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Und sie haben Nebenwirkungen. Wenn ich Laz.TreeView eingehängt habe, kann ich nicht mehr mit dem Formular-Editor arbeiten.
Mir würden solche Sonderwege weh tun, weil ich häufig die Maschine wechsle, da wäre dann bereits wieder eine zusätzliche Fußangel angelegt.
Armin.
Mir würden solche Sonderwege weh tun, weil ich häufig die Maschine wechsle, da wäre dann bereits wieder eine zusätzliche Fußangel angelegt.
Was genau meinst Du damit? Das Formular an dem ich arbeite verwendet sogar 2 Treeviews, und beide haben Spalten. Bisher kein Problem, auch nicht mit dem Overflow in die Spalte nach rechts, wenn sie leer ist.
Armin.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
TTreeView zeigt nur die Nodes an. TVirtualStringTree auch, aber es gibt auch die Möglichkeit, dass jeder Node aus mehreren Spalten besteht, so dass das ganze dann eher aussieht wie ein StringGrid, aber so dass man eine Gruppe von Nodes zusammen-/aufklappen kann. Der VTV im Online-Package-Manager ist das beste Beispiel dafür (siehe die Spalten "Installed", "Rating" usw).
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Eigenfehler nicht ausgeschlossen. Also was ich mache, ich schreibe schnell mit:
- ich öffne den Projekt-Inspektor, und entferne das virtualtreeview-package.
- ich öffne das Laz.VirtualTreeView Package und füge es zum Projekt hinzu
- Ich ändere in den Uses VirtualTrees --> Laz.VirtualTrees
- ich öffne den FormularEditor (F12), und versuche einen Event-Handler hinzuzufügen:
und ... es funktioniert. Beim letzten mal bekam ich eine wirre Fehlermeldung von wegen kann nicht, mag nicht, darf nicht. Hab dann wieder zum normalen TreeView gewechselt und alles war OK. War dann wohl eine andere Ursache.
--> Problem nicht reproduzierbar, ich nehme die Aussage zurück und behaupte ab sofort das Gegenteil.
Den Rest hab ich jetzt auch geschnallt: Du redest vom TreeView, ich dachte Du meinst "die Standardversion vom VirtualTreeView". Ich brauche schon den VirtualTreeView, aber eben die Standardversion die bei Lazarus dabei ist. Wäre eine böse Überraschung geworden, wenn ich nach der 180 Grad Wende plötzlich Probleme mit den Spalten bekommen hätte. Scheint aber alles prima zu funktionieren.
- ich öffne den Projekt-Inspektor, und entferne das virtualtreeview-package.
- ich öffne das Laz.VirtualTreeView Package und füge es zum Projekt hinzu
- Ich ändere in den Uses VirtualTrees --> Laz.VirtualTrees
- ich öffne den FormularEditor (F12), und versuche einen Event-Handler hinzuzufügen:
und ... es funktioniert. Beim letzten mal bekam ich eine wirre Fehlermeldung von wegen kann nicht, mag nicht, darf nicht. Hab dann wieder zum normalen TreeView gewechselt und alles war OK. War dann wohl eine andere Ursache.
--> Problem nicht reproduzierbar, ich nehme die Aussage zurück und behaupte ab sofort das Gegenteil.
Den Rest hab ich jetzt auch geschnallt: Du redest vom TreeView, ich dachte Du meinst "die Standardversion vom VirtualTreeView". Ich brauche schon den VirtualTreeView, aber eben die Standardversion die bei Lazarus dabei ist. Wäre eine böse Überraschung geworden, wenn ich nach der 180 Grad Wende plötzlich Probleme mit den Spalten bekommen hätte. Scheint aber alles prima zu funktionieren.
Zuletzt geändert von Nimral am So 16. Mai 2021, 22:38, insgesamt 1-mal geändert.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Das ist Zufall, wenn das so funktioniert. Wenn du das Standard-VTV-Package im Projekt hast, und plötzlich das Laz-interne Package verwenden willst, musst du neben dem Ersetzen des Package durch laz.virtualtreeview_package auch den Unit-Namen und die Komponenten-Klasse ändern. Am besten du schließt Lazarus und öffnest die pas-Datei deines Projekts mit dem VTV in einem externen Editor und änderst in der uses-Zeile "VirtualTrees" in "laz.VirtualTrees" und die Klasse des VTV von TVirtualStringTree in TLazVirtualStringTree. Dann öffnest du auch noch die lfm-Datei und änderst dort auch den Klassennamen des VTV entsprechend. Das muss natürlich mit allen Units wiederholt werden, die einen VTV enthalten. Damit solltest du das Projekt wieder in Laz öffnen können. Aber Achtung: es sollte klar sein, dass du vor einer solchen Aktion ein Backup deines Projekts machst.Nimral hat geschrieben: ↑So 16. Mai 2021, 22:18Eigenfehler nicht ausgeschlossen. Also was ich mache:
- ich öffne den Projekt-Inspektor, und entferne das virtualtreeview-package.
- ich öffne das Laz.VirtualTreeView Package und füge es zum Projekt hinzu
- Ich ändere in den Uses VirtualTrees --> Laz.VirtualTrees
- ich öffne den FormularEditor (F12), und versuche einen Event-Handler hinzuzufügen: