Newsgroup: it.comp.lang.delphi
Titolo: Cambiare colori dei nodi in TTreeView....

Amici...stò uscendo pazzo...
Stò facendo un'applicazione CLX (credo non cambi per niente riguardo al mio
problema) con una semplice form e un ttreeview.
Non riesco a cambiare i colori dei nodi; ho cercato già su google, ma in
tutti i post sembra diversa la definizione della funzione OnCustomDrawItem
La funzione è definita così per me (facendo doppio click nell'evento mi crea
stà roba...)
procedure Tmiaform.mylistviewCustomDrawItem(Sender: TCustomViewControl;
  Item: TCustomViewItem; Canvas: TCanvas; const Rect: TRect;
  State: TCustomDrawState; Stage: TCustomDrawStage;
In tutti gli altri post che ho trovato, tutti dicevano di fare le operazioni
di cambio colore/font all'interno di quest'evento...e tutti parlavano di
"node" presente nei paramertri della procedura.... ma io non ce l'ho! :°(
Qualcuno può fare una semplice form, creare un paio di nodi al runtime e
colorarli ? (progetto CLX mi raccomando!)
Stò diventando proprio matto........
Grazie tantissime.

Proprio nessuna idea?

 colorarli ? (progetto CLX mi raccomando!)
dovresti usare l'evento OnCustomDrawItem.
Ti ho sviluppato questo semplice esempio standard, poi è semplice portarlo 
in CLX:
//*************************************************************************
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;
type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1CustomDrawItem(Sender: TCustomTreeView;
      Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
var
  n1, n2: TTreeNode;
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  with TreeView1.Items do
    for i:= 1 to 10 do
      AddChild(Add(nil, Format('node%d', [i])), 'subnode');
  n1:= TreeView1.Items[6];
  n2:= TreeView1.Items[7];
  n1.Expanded:= True;
end;
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if Node = n1 then
    with Sender.Canvas do
    begin
      Font.Color:= clRed;
      Font.Style:= [fsBold];
      Brush.Color:= clYellow;
    end
  else if Node = n2 then
    with Sender.Canvas do
    begin
      Font.Color:= clYellow;
      Font.Style:= [fsBold];
      Brush.Color:= clRed;
    end
end;
end.
-- 
Mauro Falzari ( 
http://digilander.libero.it/mauro.falzari
 )
"Se guardi nell'abisso, anche l'abisso guarda in te." (Friedrich Nietzsche)

 ha scritto nel messaggio
news:Xns93E1A52FEA...@193.70.192.192...

No! è qui che casca l'asino! L'evento OnCustomDrawItem non passa "node" tra
i parametri :(((( non c'è proprio!!! Proprio perchè è CLX (credo)

Aggiunta...la definisce così:
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomViewControl;
  Item: TCustomViewItem; Canvas: TCanvas; const Rect: TRect;
  State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);

 i parametri :(((( non c'è proprio!!! Proprio perchè è CLX (credo)
e noi non facciamolo cascare, sto asino...prova questo (per CLX app):
//**************************************************************************
unit Unit2;
interface
uses
  SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs,
  QStdCtrls, QComCtrls;
type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1CustomDrawItem(Sender: TCustomViewControl;
      Item: TCustomViewItem; Canvas: TCanvas; const Rect: TRect;
      State: TCustomDrawState; Stage: TCustomDrawStage;
      var DefaultDraw: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.xfm}
var
  n1, n2: TTreeNode;
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  with TreeView1.Items do
    for i:= 1 to 10 do
      AddChild(Add(nil, Format('node%d', [i])), 'subnode long text');
  n1:= TreeView1.Items[6];
  n2:= TreeView1.Items[7];
  n1.Expanded:= True;
end;
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomViewControl;
  Item: TCustomViewItem; Canvas: TCanvas; const Rect: TRect;
  State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
  procedure _draw(n: TTreeNode);
  begin
    with Canvas do
    begin
      FillRect(Rect);
      TextRect(Rect, 1, 1, n.Text);        
    end;
    DefaultDraw:= False;
  end;
begin
  if (Stage = cdPrePaint) then
    with Canvas do
      if (TTreeNode(Item) = n1) then
        begin
          Font.Color:= clBlue;
          Brush.Color:= clYellow;
          Font.Style:= Font.Style + [fsBold];
          _draw(n1);
        end
      else if (TTreeNode(Item) = n2) then
        begin
          Font.Color:= clRed;
          Font.Style:= Font.Style + [fsItalic];
          _draw(n2);


>   if (Stage = cdPrePaint) then
non succede mai che sia in modalità prepaint... :°(

sostituito con cdPostPaint funge :)
Non hai idea di quanto tu mi abbia aiutato!
se passi per livorno fammi un fischio che ti offro 'na pizza!
Grazieeeeeeeeeeeeeeee

Stranamente (?) quando clicco sul nodo, esso perde il colore...

 Stranamente (?) quando clicco sul nodo, esso perde il colore...
per caso non è che entra in editing?


infatti...cmq questo l'ho risolto...
senti...ti chiedo un'ultima cosa....ma se all'interno del mio pgm ad un
certo punto faccio una ricerca di un nodo, e trovandolo vorrei colorarlo,
come faccio? La proprietą canvas non la trovo
Supponi che la funzione di ricerca mi ritorni un treenode, che faccio?
tn : TTreeNode;
come lo coloro direttamente da codice ?

 come faccio? La proprietà canvas non la trovo
in che senso colorarlo? Intendi selezionarlo? In quel caso basta impostare
la proprietà Selected a true. 
Se invece vuoi fare altro penso che dovresti impostare qualche proprietà sul
nodo (per esempio usando la proprietà data), richiamare il repaint del
treeview e poi gestire il solto evento OncustomItemDraw
-- 
Lis
ICQ@Home #7317603sette     ICQ@Work #16285702tre
Mercatino: 
http://lis77.bravepages.com
 (aggiornato *con foto*: 16/06/03)

 treeview e poi gestire il solto evento OncustomItemDraw
Intendo colorare il testo del nodo. Esiste un modo senza fare il repaint e
quindi modificare l'evento OncustomItemDraw ?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 e quindi modificare l'evento OncustomItemDraw ?
no perchè al successivo ridisegno del nodo, verrà ancora richiamato 
OncustomItemDraw.
La soluzione sta nel gestire tutto da dentro OncustomItemDraw.
