[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

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

Beitrag von Nimral »

... wenn die Option hoVisible (Header-Anzeigen) eingeschaltet ist.

Gute Morgen!

onClick feuert, wenn bei eingeschalteten Headern auf den untersten im VST Fenster sichtaren Node geklickt wird, nicht zuverlässig.
Es scheint da ein Bug im Hit-Test für den Mausklick (onClick) im VST zu sein.
vtv problem OnClick.png
vtv problem OnClick.png (8.46 KiB) 1730 mal betrachtet
Ich habe den "blinden" Bereich in etwa rot eingerahmt. Scrolle ich den untersten Node ein wenig nach oben, wird er sofort klickbar.

Ich habe mit drei VirtualTreeView Versionen getestet: mit der eingebauten 5.5.3.1, der letzten 5.5.3 RC-2 aus dem Blikblum GIT, und der neueste Laz.VirtualTreeView. Letztere ist noch schlimmer, da reicht der "blinde" Bereich teilweise bis zur halben Höhe des zweituntersten Nodes. Sobald ich die Anzeige der Header abschalte, kann ich bei allen drei Treeview Versionen auch den/die untersten Nodes richtig klicken.

Seltsam, dass das nicht bei allen Treeviews gleich ist, wovon genau das abhängt konnte ich nicht feststellen, im beiliegenden Demo-Projekt kann ich den untersten Node noch klicken, wenn ich genau auf seinen oberen Rand treffe, oder, genauer, wenn ich ein Pixel über den blauen Markierungsbalken treffe. Ich habe auch andere Testprojekte wie das von dem ich den Screenshot abgenommen habe, da funktioniert der Klick auch noch im oberen Drittel des untersten Nodes, der rot eingerahmte Bereich ist "blind".

Bug? Kennt jemand einen Workaround? Ich dachte, eventuell hängt es mit der Höhe des Treeview zusammen, weil ich bei manchen mehr vom untersten Node klicken kann und bei anderen weniger, das konnte ich aber nicht verifizieren, mein Demo-Projekt kann die Höhe verändern, trotzdem muss ich immer genau den oberen Rand des untersten Nodes treffen. Das Verhalten, dass der Click auch noch im oberen Drittel des untersten Nodes funktioniert konnte ich mit diesem Projekt nicht erzeugen, und die Version, wo es funktioniert hat, habe ich leider überschrieben.

Reproduzierbar mit VTV 5.5.3.1 (eingebaut), 5.5.3-RC2 von Blikblum-GIT und aktuelle Laz.VirtualTreeView vom svn trunk (Version ubekannt), Lazarus 2.0.12 auf Windows 10 x64.

HG Armin.
Dateianhänge
Last Node Hit Test.zip
(126.67 KiB) 57-mal heruntergeladen
Zuletzt geändert von Nimral am Mo 17. Mai 2021, 10:56, insgesamt 1-mal geändert.

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

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

Beitrag von Michl »

Hier geht es, egal wohin ich die letzte Node bewege (teil- oder vollsichtbar) und wo ich sie anklicke:
Windows7, VST 5.5.3.1, Lazarus 2.1.0 r65116 FPC 3.0.4 i386-win32-win32/win64
Windows7, VST 5.5.3.1, Lazarus 2.1.0 r65116 FPC 3.3.1 x86_64-win64-win32/win64

Hinweis: VST ist gerade kaputt. Man muss eine Klammer setzen, damit es kompiliert (per OPM installiert)
2. Hinweis: Ich sitze gearde an einem Laptop ohne zweiten Monitor. Stelle Position von Form1 auf poWorkAreaCenter, poDesktopCenter oder poScreenCenter, sonst sehe ich hier nichts :wink:

Code: Alles auswählen

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

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

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

Beitrag von wp_xyz »

Ich kann's bestätigen. Man muss die Liste der Nodes ganz ans Ende scrollen und auf "Node 19" klicken. Der Node wird zwar ausgewählt, aber es kommt die MessageBox nicht, die bei all den anderen Nodes erscheint.

Getestet mit 32-bit Laz trunk/fpc 3.2/eingebauter VTV und mit 32-bit Laz 2.0.12/fpc3.2/VTV vom OPM (kompiliert einwandfrei - der "Klammer-Fehler" ist anscheinend nun behoben).

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

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

Beitrag von Michl »

Dann scheint's ein Problem mit Win10 zu sein.

Code: Alles auswählen

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

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

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

Beitrag von Michl »

wp_xyz hat geschrieben:
So 16. Mai 2021, 11:11
Getestet mit 32-bit Laz trunk/fpc 3.2/eingebauter VTV und mit 32-bit Laz 2.0.12/fpc3.2/VTV vom OPM (kompiliert einwandfrei - der "Klammer-Fehler" ist anscheinend nun behoben).
Hab's vorhin erst gezogen. Der Fehler ist mit FPC Trunk.

Code: Alles auswählen

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

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

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

Beitrag von wp_xyz »

Michl hat geschrieben:
So 16. Mai 2021, 11:17
Der Fehler ist mit FPC Trunk.
Du meinst den "'is' muss geklammert werden"-Fehler in TVirtualTreeHintWindow.Paint? Ja, den sehe ich mit FPC Trunk und der VTV-Version vom OPM auch (in der eingebauten und der blikblum-Version ist es behoben). Aber das schein komplizierter zu sein, denn ein "if Sender is TForm" wird mit FPC trunk akzeptiert (genauso wie bei Delphi).

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

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

Beitrag von Nimral »

wp_xyz hat geschrieben:
So 16. Mai 2021, 11:11
Ich kann's bestätigen. Man muss die Liste der Nodes ganz ans Ende scrollen und auf "Node 19" klicken.
Bei mir tritt das Problem bei jedem untersten Node im Treeview-Fenster auf, egal ob es der Letzte im Tree ist oder nicht.

Windows 10 Problem ... hm. Sobald ich die Header ausblende, funktioniert es. Das weist mir eher auf ein Problem im VST hin.

Armin.
Zuletzt geändert von Nimral am So 16. Mai 2021, 12:00, insgesamt 1-mal geändert.

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

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

Beitrag von Michl »

wp_xyz hat geschrieben:
So 16. Mai 2021, 11:40
Du meinst den "'is' muss geklammert werden"-Fehler in TVirtualTreeHintWindow.Paint? Ja, den sehe ich mit FPC Trunk und der VTV-Version vom OPM auch (in der eingebauten und der blikblum-Version ist es behoben). Aber das schein komplizierter zu sein, denn ein "if Sender is TForm" wird mit FPC trunk akzeptiert (genauso wie bei Delphi).
Ja. Das Problem ist das "and" dahinter.

Code: Alles auswählen

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

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

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

Beitrag von Michl »

Nimral hat geschrieben:
So 16. Mai 2021, 11:44
Windows 10 Problem ... hm. Sobald ich die Header ausblende, funktioniert es. Das weist mir eher auf ein Problem im VST hin.
Das ist schon richtig. Es ist ein Problem vom VST oder LCL, da eine bestimmte Eigenschaft von Windows10 nicht mehr mit der von Windows7 übereinstimmt. Das kann eine abweichende Höhenermittlung vom Header sein, ein Margin, Border etc. Da muss jemand mit Windows10 den Debugger bemühen :wink:

Wie gesagt, hier geht es. Interessant wäre noch zu sehen, ob GTK2, Qt(4/5) ähnliche Probleme haben oder nicht. Man kann es auf jeden Fall im Bugtracker eintragen (zumindest für die Lazarusversion) oder/und blikblum (Luiz Américo) melden.

Code: Alles auswählen

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

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

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

Beitrag von theo »

Ist auf GTK2 und Qt genau das Gleiche, das hat imo mit Windows nichts zu tun.
Wahrscheinlich wird bei einer Hittest Berechnung der Header nicht miteinbezogen.

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

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

Beitrag von Nimral »

Danke für die Bestätigung! Ich trete einen Bug Report los.

Nachdem ich damit noch keine große Übung habe, und Dubletten vermeiden möchte: bei den Open Issues fand ich keinen Hinweis dass das Problem bekannt ist. Gibt es eine Suchfunktion, mit der man in den erledigten Issues suchen kann?

HG, Armin.

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

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

Beitrag von Nimral »

wp_xyz hat geschrieben:
So 16. Mai 2021, 11:11
Ich kann's bestätigen. Man muss die Liste der Nodes ganz ans Ende scrollen und auf "Node 19" klicken.
Hab nochmal genauer hingesehen, ja, beim letzten Node feuert der Click nie, wenn genügend Nodes im Baum sind um das View-Fenster komplett zu füllen. Das liegt m.E. daran, dass dieser Node zwangsläufig im "blinden Bereich" zu liegen kommt.

wp_xyz
Beiträge: 4869
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, 13:06
Gibt es eine Suchfunktion, mit der man in den erledigten Issues suchen kann?
Die Suchfunktion im Bugtracker ist besch... Ich würde auf "All Projects" klicken, dann auf die "Recently modified"-Tafel, und nun erscheint in der Rubrik "Filters" eine Filter-Box; da würde ich "VirtualTreeView" eintragen. Das Häkchen bei "Filter by last updated date" solltest du entfernen, sonst hast du nur die Einträge für einen bestimmten Zeitraum. (Evtl ist die Abfolge bei dir anders).

Ich glaube aber nicht, dass das schon gemeldet worden ist.

Eins vielleicht noch, um ganz sicher zu gehen: Du fügst in deinem Beispiel nirgendwo explizit Nodes dazu, sondern verlässt dich auf die automatische Nodeerzeugung durch die Zahl der Rootnodes. Erweitere dein Beispiel mal entsprechend mit halbwegs realistischer Anwendung. Man weiß nie...

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

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

Beitrag von Nimral »

wp_xyz hat geschrieben:
So 16. Mai 2021, 13:36
Eins vielleicht noch, um ganz sicher zu gehen: Du fügst in deinem Beispiel nirgendwo explizit Nodes dazu, sondern verlässt dich auf die automatische Nodeerzeugung durch die Zahl der Rootnodes. Erweitere dein Beispiel mal entsprechend mit halbwegs realistischer Anwendung. Man weiß nie...
Ich hab das Beispiel schnell geändert und ein paar Nodes mit AddChildNode hinzugefügt, es ist genau das Selbe, es ist egal ob der letzte Node eine Root oder ein Child ist, und es ist egal ob er automatisch oder mit AddChildNode hinzugefügt wurde.

Weisst Du zufällig (OT - aber ich hätte das in meinem Beispielcode gerne verwendet) wie man den FocusedNode "entfokussieren" kann, so dass der Tree - genau so wie wenn er neu generiert wird, oder wenn man den FocusedNode aus dem Tree löscht - ohne aktiven Fokus da steht? Ich habe diese Sequenz versucht:

Code: Alles auswählen

procedure TForm1.FormClick(Sender: TObject);

var
  n:PVirtualNode;

begin
  n := VirtualStringTree1.FocusedNode;
  VirtualStringTree1.FocusedNode := NIL;
  VirtualStringTree.InvalidateNode(n);   // tut nix, nützt nix.
end;  
Es klappt insofern, als dass ein AddChildNode(FocusedNode,nil) jetzt eine Root erzeugt, FocusedNode ist also NIL. Der blaue Balken im Tree bleibt aber auf dem letzen FocusedNode stehen. Ich hätte ihn gerne weg.

Armin.

wp_xyz
Beiträge: 4869
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, 14:10
Weisst Du zufällig [...]wie man den FocusedNode "entfokussieren" kann
Der FocusedNode ist automatisch mit selektiert. Daher muss man auch das Selected-Flag des Nodes löschen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  VirtualStringTree1.Selected[VirtualStringTree1.FocusedNode] := false;
  VirtualStringTree1.FocusedNode := nil;
end; 

Antworten