[Gelöst] VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Rund um die LCL und andere Komponenten
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von Nimral »

Thnx, so klappt es!

Armin.

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von wp_xyz »

Wegen des nicht OnClick-baren letzen Node erscheint mir folgende Stelle verdächtig:

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;
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

Code: Alles auswählen

Inc(Result.Top, FHeader.Height);
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...

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von Nimral »

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?

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von Nimral »

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.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von Michl »

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.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von wp_xyz »

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.).

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von Michl »

- gelöscht - war Unsinn.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von Nimral »

Michl hat geschrieben:
So 16. Mai 2021, 20:04
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.
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.

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 .
Passt! Fix von wp in Laz.Treeview. Node 19 bleibt allerdings "in Deckung"
Passt! Fix von wp in Laz.Treeview. Node 19 bleibt allerdings "in Deckung"
VST Node onCLick problem 1.png (7.76 KiB) 1678 mal betrachtet
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.
Passt besser! Node 19 wird in den View gescrollt (Original-Version aus Lazarus\Components und OnNodeClick statt onClick)
Passt besser! Node 19 wird in den View gescrollt (Original-Version aus Lazarus\Components und OnNodeClick statt onClick)
VST Node onCLick problem 2.png (8.85 KiB) 1677 mal betrachtet

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von wp_xyz »

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.

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von Nimral »

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.
wp_xyz hat geschrieben:
So 16. Mai 2021, 21:51
... und keinen Tree mit zusätzlichen Spalten wie bei einem StringGrid brauchst...
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.

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von wp_xyz »

Nimral hat geschrieben:
So 16. Mai 2021, 21:57
Wenn ich Laz.TreeView eingehängt habe, kann ich nicht mehr mit dem Formular-Editor arbeiten.
Versteh ich nicht...

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von wp_xyz »

Nimral hat geschrieben:
So 16. Mai 2021, 21:57
wp_xyz hat geschrieben:
So 16. Mai 2021, 21:51
... und keinen Tree mit zusätzlichen Spalten wie bei einem StringGrid brauchst...
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.
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).

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von Nimral »

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.
Zuletzt geändert von Nimral am So 16. Mai 2021, 22:38, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)

Beitrag von wp_xyz »

Nimral hat geschrieben:
So 16. Mai 2021, 22:18
Eigenfehler 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:
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.

Antworten