Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TTreeView nodes mit verschiedenen Icons (https://www.delphipraxis.net/180341-ttreeview-nodes-mit-verschiedenen-icons.html)

Klaus01 13. Mai 2014 08:44


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:
procedure TpwrManager.pmTreeCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  decorateNode(Node, Node.Data);
end;
Dem TreeView ist eine ImageList zugeordnet.

Delphi-Quellcode:
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;
Der Tree wird gezeichnet wie geplant.

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

quaero 13. Mai 2014 10:04

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.

DeddyH 13. Mai 2014 10:09

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?

Klaus01 13. Mai 2014 10:31

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 13:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz