Performance Probleme mit TVirtualStringTree

Rund um die LCL und andere Komponenten
Antworten
Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Performance Probleme mit TVirtualStringTree

Beitrag von Bergmann89 »

Hey Leute,

ich spiel gerade bisl mit der TVirtualStringTree (VirtualTreeView) Componente rum. Ich würde gern in der zweiten Spalte meines Trees ein Control anzeigen wenn der jewweilige Knoten den Focus hat. Also hab ich einfach die Componente die ich benötige erstellt und als Parent den TVirtualStringTree zugewiesen. Jetzt wird aber jedesmal wenn meine Componente das Paint-Event bekommt der ganze Baum neu gezeichnet weil mein Control das Paint-Event an seinen Parent, also den Tree weiter gibt. Daraufhin zeichnet sich der komplette Tree neu und das dauert selbst bei kleinen Bäumen 1-2 Sekunden (keine Ahnung warum das so langsam ist?!).
Die Frage ist nun: Ist das ein Problem von TVirtualStringTree, oder mach ich das mit den custom Components im Tree falsch?

MfG Bergmann.

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: Performance Probleme mit TVirtualStringTree

Beitrag von Bergmann89 »

Ich hab mit das nochmal genauer angesehen. Die Componente bekommt die Paint-Message und ein entsprechendes Rect in das sich das Control rein zeichnen soll. Das hat auch die richtige Größe. Wenn die Paint-Message dann aber an den Tree weiter gereicht wird, veränder sich aus irgend einem Grund das Rect und ist auf einmal mehrere Millionen Pixel hoch und breit. Im Tree allokiert er dann eine temporäre Bitmap so groß wie das Rect auf die er Zeichnet.

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

Re: Performance Probleme mit TVirtualStringTree

Beitrag von Michl »

Das sind so viele Variablen:
- welche Version vom Virtualstringtree
- welche Lazarusversion
- welche FreePascalversion
- welches OS
- 32/64bit
- dein Code

Am besten wäre es, du erstellst ein Minimalbeispiel (nur Source), lädst das gezippt hier hoch. Dann kann das jemand mal gegentesten.

Code: Alles auswählen

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

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

Re: Performance Probleme mit TVirtualStringTree

Beitrag von wp_xyz »

Bergmann89 hat geschrieben:Ich würde gern in der zweiten Spalte meines Trees ein Control anzeigen wenn der jewweilige Knoten den Focus hat. Also hab ich einfach die Componente die ich benötige erstellt und als Parent den TVirtualStringTree zugewiesen.

Ich glaube nicht, dass das so geht. Eigentlich müsste doch auch ein Bitmap reichen, um den Zustand des Nodes anzuzeigen. Warum ein Control?

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: Performance Probleme mit TVirtualStringTree

Beitrag von Bergmann89 »

@wp_xyz: Ich möchte Daten vom Node in einer ComboBox editieren. Im offizellen Beispiel wird das auch so gemacht: http://wiki.freepascal.org/VirtualTreev ... A_Combobox

@Michl:
- virtualtreeview ist up-to-date: 4.8.7
- Lazarus: 1.7 rev52470
- FPC: 3.1.1 rev33943
- OS: Win10 - x64

Laz und FPC sind die Dev-Versionen vom Freitag (10.06.16). Code ist im Anhang. Problem ist, das im VirtualTreeview Paint Handler das falsche Rect rein kommt: VirtualTrees.pas:16425. Wenn ich da FUpdateRect := BoundsRect; setze dann funktioniert alles wunderbar. Sieht man schon wenn man einfach mal mit der Maus über die Checkbox im Beispiel geht, die braucht teilweise 1sec bis sie neu gezeichnet wurde. Umso größer das Fenster umso heftiger das Problem.

MfG Bergmann
Dateianhänge
VirtualTreeview.zip
(2.35 KiB) 49-mal heruntergeladen

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

Re: Performance Probleme mit TVirtualStringTree

Beitrag von Michl »

Das scheint ein Fehler im VirtualStringTree zu sein. Ich habe hier (Windows 7, 32bit Lazarus 1.7 auf FPC 3.1.1, VST 5.3.2.1) keine Probleme (Test von WMPaint GetTickCount wird bei mir nie gefeuert). VST hat auch eine neue Heimat gefunden: https://github.com/blikblum/VirtualTreeView-Lazarus. Du könntest diese Version ja mal testen.

Code: Alles auswählen

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

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: Performance Probleme mit TVirtualStringTree

Beitrag von Bergmann89 »

Oh, Okay. Die sieht bedeutent neuer aus :) Pack ich mir gleich mal drauf.
Ich denk aber das es eher n Bug im FPC oder der LCL ist. Auf die Messages die da gesendet werden hat VirtualTreeview keinen Einfluss...

€: VirtualTreeview geupdated... Problem besteht weiterhin... Ich glaub ich schreib n Ticket im Bugtracker

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

Re: Performance Probleme mit TVirtualStringTree

Beitrag von Michl »

Bergmann89 hat geschrieben:Oh, Okay. Die sieht bedeutent neuer aus :) Pack ich mir gleich mal drauf.
War aber auch nicht die aktuellste Version, die ich da zum testen hatte.

Bergmann89 hat geschrieben:Ich denk aber das es eher n Bug im FPC oder der LCL ist.
Aktuell lässt sich Lazarus Trunk zwar auf FPC Trunk bauen, beim Start eines leeren Projekts gibt aber eine Access Violation. Ich suche gerade die FPC-Revision, die das verursacht. Lazarus r52501 auf FPC r33925 lässt sich noch normal starten. Kann das daher aktuell nicht testen.

Code: Alles auswählen

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

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

Re: Performance Probleme mit TVirtualStringTree

Beitrag von wp_xyz »

Michl hat geschrieben:Aktuell lässt sich Lazarus Trunk zwar auf FPC Trunk bauen, beim Start eines leeren Projekts gibt aber eine Access Violation. Ich suche gerade die FPC-Revision, die das verursacht. Lazarus r52501 auf FPC r33925 lässt sich noch normal starten. Kann das daher aktuell nicht testen.

Dazu gabs heute in der MailingList eine Anfrage, Ondrej antwortet darauf:
> Hi!
>
> I tried to update my Lazarus svn to the current revision (52501) on a debian jessie x86_64 machine.
> I compiled it by make clean;make all using fpc 3.1.1 from today.
>
> The comilation finishes successfully, but on starting lazarus I get a window "Read error" "Access violation Access violation".

It's a known issue. It's due to the recent FPC changes (PTypeInfo -> PPTypeInfo). Lazarus designer sources haven't been updated to handle these changes yet.

I recommend you to compile Lazarus with FPC 3.0 fixes branch or with FPC trunk rev 33943 until it gets sorted out. You can stil compile your own applications with the most recent FPC trunk.

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

Re: Performance Probleme mit TVirtualStringTree

Beitrag von Michl »

Oh, da brauche ich ja nicht weiter meinen Computer zu quälen.

Vielen Dank für die Info!!!

Code: Alles auswählen

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

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: Performance Probleme mit TVirtualStringTree

Beitrag von Bergmann89 »

Ich hab mal n Bug im FPC Bugtracker angelegt, wenn es jmd interessiert: http://bugs.freepascal.org/view.php?id=30275

Antworten