![]() |
TTreeView nodes mit verschiedenen Icons
Hallo,
ich möchte den einzelnen TreeNodes abhängig von dem TreeNode.data Object Icons zuweisen/ bzw. anzeigen lassen. Dazu müsste doch das Ereignis: OnCustomDrawItems geeignet sein.
Delphi-Quellcode:
Dem TreeView ist eine ImageList zugeordnet.
procedure TpwrManager.pmTreeCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); begin decorateNode(Node, Node.Data); end;
Delphi-Quellcode:
Der Tree wird gezeichnet wie geplant.
procedure TPwrManager.decorateNode(node: TTreeNode; data: TObject);
var deviceType: TDeviceType; begin if data is TDevice then begin deviceType := (data as TDevice).deviceType; if assigned(deviceType) then begin case deviceType.typeClass of a: begin node.ImageIndex := ord(tiClassA_unknown); end; b: begin node.ImageIndex := ord(tiClassB_unknown); end; end; case (data as TDevice).powerState of true: node.ImageIndex := node.ImageIndex -2; false: node.ImageIndex := node.ImageIndex -1; end; end node.ExpandedImageIndex := node.ImageIndex; node.SelectedIndex := node.ImageIndex; end; end; Nur wenn ich Elemente des Trees aufklappe oder den gesamten Tree Expandiere. Dann läuft die CPU auf 100%. Das Programm beschäftigt sich dann nur noch mit dem Neuzeichnen. Habe ich da einen dicken Denkfehler oder etwas übersehen? Oder ist das die falsche Herangehenweise und ich sollte den Node gleich bei der Erstellung das richtige Bild zuweisen? Aber wie mache es dann wenn sich der "Status" des Nodes (bzw. des Objects dahinter) geändert hat und ich das durch ein anderes Bild visualisieren möchte? Grüße Klaus |
AW: TTreeView nodes mit verschiedenen Icons
Hallo Klaus,
kann es sein, dass sich dein Programm in der Schleife totläuft? Du änderst ImageIndex vom Knoten, was dazu führt, dass der Knoten neu gezeichnet wird, so dass DrawItem intern aufgerufen wird und ImageIndex des Knotens wieder neu geändert wird. Eigentlich sollte es reichen, wenn du ImageIndex beim Erzeugen des Knotens zuweist bzw. änderst, wenn sich was an deinen Daten ändert. Das Neuzeichnen sollte TTree selber hinbekommen. Grüße quaero Edit: An der Stelle, an dem du den "Status" änderst, setzt du ImageIndex neu - fertig. |
AW: TTreeView nodes mit verschiedenen Icons
Könnte man nicht einfach die Ereignisse OnGetImageIndex etc. des TreeView nutzen, dafür sind sie AFAIK doch gedacht?
|
AW: TTreeView nodes mit verschiedenen Icons
Hallo quaero und Detlef,
danke für das Lösen des Brettes... onGetImageIndex tut das so was ich beabsichtigt habe. Auch ohne MessageLoop. Bei Statusänderungen rufe ich TreeView.invalidate auf. Damit werden die Änderungen aktualisiert ohne durch den ganzen Tree zu iterieren. Again what learned :o) Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz