[Gelöst] VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
[Gelöst] VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
... 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.
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.
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.
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.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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
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
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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).
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).
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Dann scheint's ein Problem mit Win10 zu sein.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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;
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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).
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
Ja. Das Problem ist das "and" dahinter.wp_xyz hat geschrieben: ↑So 16. Mai 2021, 11:40Du 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).
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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
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;
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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.
Wahrscheinlich wird bei einer Hittest Berechnung der Header nicht miteinbezogen.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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.
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.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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...
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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.wp_xyz hat geschrieben: ↑So 16. Mai 2021, 13:36Eins 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...
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;
Armin.
Re: VirtualStringTree: unterster sichtbarer Node nicht klickbar (Bug?)
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;