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/)
-   -   Delphi Nochmal VST - Node einfärben (https://www.delphipraxis.net/163351-nochmal-vst-node-einfaerben.html)

MasterTobi 26. Sep 2011 12:14

Nochmal VST - Node einfärben
 
Hallo,
ich beschäftige mich nun auch mal mit VST da der normale Treeview das nicht konnte was ich wollte :D

Mein Problem ist nun das wenn etwas bestimmtes passiert, das sich die Farbe des Node des VST ändern soll.

Delphi-Quellcode:
begin
       n := virtualstringtree1.GetFirst;
      while assigned(n) do
       begin
       if assigned(n) then
       begin
        data:=virtualstringtree1.GetNodeData(n);
        if data^.FCaption='hiereindummertext' then
        begin
// hier sollte sich dann von n die Farbe ändern
        break;
        end;
das problem ist nur es gibt ja nicht direkt sowas wie "n.color".
auch aftercellpaint oder befor oder PaintText nützt ja nix da es ja schon da ist :(

weiß nochjemand rat?


mfg

SirThornberry 26. Sep 2011 12:24

AW: Nochmal VST - Node einfärben
 
Da du das Zeichnen ja selbst übernimmst (oder?) müsstest du ein neu-Zeichnen auslösen. Bei normalen Controls kann dies zum Beispile über Invalidate ausgelöst werden.

DeddyH 26. Sep 2011 12:26

AW: Nochmal VST - Node einfärben
 
Meinst Du so etwas? http://stackoverflow.com/questions/3...ring-tree-node

MasterTobi 26. Sep 2011 12:28

AW: Nochmal VST - Node einfärben
 
d.h. also icch müsste ja das vorhandene löschen, genau an der stelle neu zeichnen und einfärben oder? muss aber auch bedenken wenn ich dann auf das node drück das die farbe wieder schwarz wird.
ich zeichne einmal das vst beim programmstart.


mfg

Gollum 26. Sep 2011 12:44

AW: Nochmal VST - Node einfärben
 
Hallo,

das Ereignis das Du suchst heist OnBeforeCellPaint. In diesem Ereignis kannst Du den Colum-Hintergrund ändern.
Delphi-Quellcode:
procedure TForm1.vtBeforeCellPaint(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect;
  var ContentRect: TRect);
begin
  with TargetCanvas do
  begin
    if Odd(Node^.Index) then Brush.Color:=clLightGray
      else Brush.Color:=clWindow;
    FillRect(CellRect);
  end; // with
end;
Obiges Beispiel färbt in einem Tree jede 2. Zeile in einer alternierenden Farbe.

MasterTobi 26. Sep 2011 12:53

AW: Nochmal VST - Node einfärben
 
d.h. bevor das node / column gezeichnet wird, male es an ;) aber ich suche ja etwas wenn das node/die column schon vorhanden ist :D oder bin ich atm blöd ?! :D

Gollum 26. Sep 2011 12:55

AW: Nochmal VST - Node einfärben
 
Hallo,

das Ereignis wird ausgelöst, wenn Die Spalte/Zelle gezeichnet wird.
Dies bedeutet, das Ereignis wird nur gefeuert, wenn die Spalte existiert und sie auch Daten enthält, die dargestellt werden sollen.

CCRDude 26. Sep 2011 13:07

AW: Nochmal VST - Node einfärben
 
Zum Verständnis: die Ansicht ist nicht "stabil" - wischt Du mit der Maus oder einem anderen Fenster darüber oder rufst ein Invalidate/Refresh etc. auf, wird neu gezeichnet.

Es wird also keinesfalls nur beim Programmstart gezeichnet :)

MasterTobi 26. Sep 2011 13:13

AW: Nochmal VST - Node einfärben
 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhh

gut zu wissen :D erstma vielen dank das bringt mich schonma weiter :D hehe

MasterTobi 26. Sep 2011 13:33

AW: Nochmal VST - Node einfärben
 
so verstehe nu :D

was ne geburt,
na gut nu hab ich mal das bsp vonGollum genommen. muss aber jetzt nur die node färben wo sich die caption geändert hat.
muss ich also die node in einer globalen variable übergeben ?

wil er ändert immer den ganzen baum

Gollum 26. Sep 2011 14:24

AW: Nochmal VST - Node einfärben
 
Hallo,

der Knoten (Node) und die Spalte (Column) die gezeichnet werden sollen, werden Dir doch im Ereignis übergeben.

Ich hoffe einmal, Du weist dann, wie Du auf Deine im VT gespeicherten Infos zugreifen kannst.

MasterTobi 26. Sep 2011 14:46

AW: Nochmal VST - Node einfärben
 
Hallo ,

meine strucktur ist ja nur

node
+'irgendwas'
---- 'irgendeine nummer'
+'irgendwas2'
---- 'irgendeine nummer2'
+'irgendwas3'
---- 'irgendeine nummer3'

so wenn nun jetzt

Delphi-Quellcode:
       n := virtualstringtree1.GetFirst;
      while assigned(n) do
       begin
       if assigned(n) then
       begin
        data:=virtualstringtree1.GetNodeData(n);
        if data^.FColumn1='irgendeinenummer' then
        begin
        found:=1;
        foundednode:=n;
        virtualstringtree1.Refresh;
        break;
        end;
        n:=virtualstringtree1.GetNext(n);
       end;
if data^.FColumn1='irgendeinenummer' then stimmig ist, sprich er fragt ab ob das subnode die nummer hat die er bekommen hat(in der abfrage)

dann
Delphi-Quellcode:
procedure TForm1.VirtualStringTree1BeforeCellPaint(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  Column: TColumnIndex; CellRect: TRect);
  var ContentRect: TRect;
  var d:ptreedata;
begin
   with TargetCanvas do
   begin
   d:=virtualstringtree1.GetNodeData(foundednode);
   if found <>1 then exit;
     if d.fColumn1='irgendeinenummer' then targetcanvas.Font.Color:=clred;
     FillRect(CellRect);
   end; // with
end;
sollte es doch funktionieren ? oder nicht. ich übergeb ihm ja mit d:=virtualstringtree1.GetNodeData(foundednode); die daten von der node die er unter foundednode:=n; gesaved hat.

hm ....

DeddyH 26. Sep 2011 14:49

AW: Nochmal VST - Node einfärben
 
Wieso fragst Du nicht direkt die Daten der übergebenen Node ab?

MasterTobi 26. Sep 2011 14:55

AW: Nochmal VST - Node einfärben
 
-.- weil ich doooof bin :D

kann sein das wenn der subnode ausgeblendet ist bzw so gemacht is das der nicht angezeigt wird, das er auch nicht den wert auslesen kann ?

habe grad mal
Delphi-Quellcode:
   
with TargetCanvas do
   begin
   d:=virtualstringtree1.GetNodeData(Node);
   showmessage(d.FCaption+d.FColumn1);
mir ausgegeben lassen. Showmessage zeigt mir immer nu den wert der node an, aber nicht der subnode

DeddyH 26. Sep 2011 15:11

AW: Nochmal VST - Node einfärben
 
Du bist im BeforeCellPaint-Event? Dann dürfte das klar sein, denn wieso sollten ausgeblendete Knoten gezeichnet werden?

MasterTobi 26. Sep 2011 15:50

AW: Nochmal VST - Node einfärben
 
hm stimmt auch wieder -.- dachte die werden zwar gezeichnet aber nur ausgeblendet

MasterTobi 27. Sep 2011 09:20

AW: Nochmal VST - Node einfärben
 
Huhu dank euch hab ic schonmal meine halbe miete hehe, nur es stellt sich jetzt noch folgende frage

Delphi-Quellcode:
procedure TForm1.VirtualStringTree1BeforeCellPaint(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  Column: TColumnIndex; CellRect: TRect);
  var ContentRect: TRect;
  var d,d2:ptreedata;
begin
   with TargetCanvas do
   begin
   d:=virtualstringtree1.getnodedata(node);
   d2:=virtualstringtree1.getnodedata(node.Parent);
   showmessage('d'+d^.FCaption+'...'+'d2'+d2^.FCaption);
   if d^.FCaption=inttostr('diedummenummer') then
   //showmessage(d.FCaption);
   showmessage('ok'); TargetCanvas.Font.Color:=clred;
   FillRect(CellRect);
   end;
   // with
end;
also erstens malt er mir es gar nicht rot :(
un zweitens müsste er mir ja das node.parent rot malen. jemand noch eine idee ? :)

DeddyH 27. Sep 2011 09:33

AW: Nochmal VST - Node einfärben
 
Zitat:

Zitat von MasterTobi (Beitrag 1126889)
un zweitens müsste er mir ja das node.parent rot malen.

Wieso denn das? AFAIK wird das Ereignis für den aktuell zu zeichnenden Knoten aufgerufen, man kann also auch nur diesen zeichnen. Und versuch einmal, nach dem Setzen der Schriftfarbe den Text noch einmal auszugeben (Canvas.Textout oder DrawText).

Gollum 27. Sep 2011 09:40

AW: Nochmal VST - Node einfärben
 
Hallo,

das kann ja auch nicht funktionieren. Du änderst nicht den (Node-)Zellhintergrund, sondern die Textfarbe. Dazu ist dieses Ereignis nicht gedacht.
Stattdessen musst Du das Ereignis OnPaintText benutzen.

Noch einmal kurz zusammengefasst:
- Um den Hintergrund zu ändern: OnBeforeCellPaint
- Um die Textfarbe zu ändern: OnPaintText

Sollte das nicht genügen oder zu verwirrend sein, kommst Du nicht darum herum, einen TVirtualDrawTree zu nehmen. Dann musst Du aber alles im Ereignis OnDrawNode selber zeichnen.

MasterTobi 27. Sep 2011 09:48

AW: Nochmal VST - Node einfärben
 
so ok hab es nun so das er auf das richtige zeigt, bzw das er das richtige rot malen soll.
auch canvas.textout zeigt mir die richtige caption an :)

nur rot macht er es nicht :D


edit mom glaub hab da einen kleinen fehler hab mal hintergrund rot gemacht un da macht er es mir in der rootnode rot -.-

Gollum 27. Sep 2011 09:49

AW: Nochmal VST - Node einfärben
 
Hallo,

was macht er nicht rot? Zeig' mal etwas Code.

DeddyH 27. Sep 2011 09:50

AW: Nochmal VST - Node einfärben
 
Lies noch einmal #19.

MasterTobi 27. Sep 2011 09:52

AW: Nochmal VST - Node einfärben
 
hey,

danke gollum, genau da war der fehler ;)

un danke an alle anderen für die infos :)

nu gehts :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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