Einzelnen Beitrag anzeigen

Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Große Probleme mit VirtualStringTree

  Alt 17. Jun 2017, 11:11
Tag!

Also vorab: Mit dem VST kannst du eigentlich alles machen was du willst. Die Komponente ist extrem flexibel und lässt sehr viele Dinge zu, die mit anderen Komponenten nur schwer bis gar nicht erreicht werden können. Und das noch auf extrem einfache Art und Weise.

Das farbliche Markieren von Zeilen macht man besser im OnBeforeCellPaint. Das Event ist dafür besser geeignet bzw. wird in der Regel eher dafür genutzt. Anbei mal die Reihenfolge der Zeichen-Events, die nacheinander ausgelöst werden. Das OnBeforeCellPaint Event kommt zwar direkt nach dem OnAfterItemErase, aber StateOfTheArt ist eigentlich OnBeforeCellPaint.

Zitat von VirtualTreeView Help File:
Usually the following paint stages are executed during a paint cycle:
• before paint (OnBeforePaint)
• before item paint (OnBeforeItemPaint)
• before item erase (OnBeforeItemErase)
• after item erase (OnAfterItemErase)
• before cell draw (OnBeforeCellPaint)
• on paint text (string trees only, OnPaintText)
• after cell draw (OnAfterCellPaint)
• after item paint (OnAfterItemPaint) after paint (OnAfterPaint)
Die Messung der Texthöhe solltest du nicht im OnGetText Event machen. Dafür gibt es spezielle Events wie z.B. OnMeasureItem.

Zitat von VirtualTreeView Help File:
10.1.2.126 TBaseVirtualTree.OnMeasureItem Event

Miscellaneous event.

property OnMeasureItem: TVTMeasureItemEvent; Description

Virtual Treeview supports individual node heights. However it might sometimes unpractical to set this height in advance (e.g. during OnInitNode( see TBaseVirtualTree.OnInitNode Event, page 147)). Another scenario might be that multi line nodes must size themselves to accomodate the entire node text without clipping. For such and similar cases the event OnMeasureItem is for. It is queried once for each node and allows to specify the node's future height. If you later want to have a new height applied (e.g. because the node's text changed) then call InvalidateNode( see TBaseVirtualTree.InvalidateNode Method , page 221) for it and its vsHeightMeasured state is reset causing so the tree to trigger the OnMeasureItem event again when the node is painted the next time.
Die Grund Initialisierung kannst du im OnInit Event durchführen. In den neueren Versionen gibt es auch noch die Events OnMeasureTextHeight und OnMeasureTextWidth die du dafür nutzen solltest.


Bei Änderungen der Formatierung deiner Texte die im VST angezeigt werden solltest du OnPaintText benutzen. Im OnDrawText musst du alles selbst machen. Die Positionierung, die Ausgabe des Textes, usw.

Im OnPaintText übernimmt der Tree das alles für dich. Aber nur, wenn es um Formatierungen geht. Wenn du weitere Texte dazumalen willst, dann solltest du OnDrawText.


Die eigentliche Erstellung der Nodes solltest du mit der RootNodeCount Eigenschaft des Trees machen. Die Children bzw. den ChildCount dann im OnInit und OnInitChildren Event zuweisen.

Um Nodes beim Drüberfahren mit der Maus markieren zu lassen, kannst du auch die TreeOption toHotTrack in den PaintOptions setzen. Wenn dir das Design nicht zusagt, dann setze evtl. zum Testen mal toUseExplorerTheme auf True. Wenn es dann noch nicht passt, dann kannst du das im OnBeforeCellPaint selbst machen. Hatte ich auch mal für ein paar Programme gemacht. Sieht eigentlich ziemlich gut aus.
  Mit Zitat antworten Zitat