Newsgroup: it.comp.lang.delphi
Titolo: TreeViewString aggiungere child al nodo voluto

Se creo 2 Button per creare Nodi Root e Child, va bene perche' il nodo 
e' selezionato;
se invece li creo da un ciclo, ottengo solo nodi root.
 
quello che non capisco e' perche' non seleziona il nodo,
questo il codice.
 
   PMyRec = ^TMyRec;
   TMyRec = record
     Caption: WideString;
     ImageIndex: Integer;
     Indice: Cardinal;
     IndiceAss: Cardinal;
 
-- ciclo per n voci deve risultare
--- Rooot
------ A
------ B
 
//crea il primo nodo root
if VirtualStringTree1.RootNodeCount = 0 then
   begin
     VirtualStringTree1.RootNodeCount := 
VirtualStringTree1.RootNodeCount + 1;
    end
 
else
    //deve creare un Child del nodo root
    //dopo GetLast -> Data.Caption = al testo del nodo root
    //ma VirtualStringTree1.Selected[Node]:=True non seleziona il nodo
    begin
      Node := VirtualStringTree1.GetLast;
      Data := VirtualStringTree1.GetNodeData(Node);
      //VirtualStringTree1.ClearSelection;
      VirtualStringTree1.Selected[Node]:=True;
      VirtualStringTree1.SetFocus;
 
      //il nodo non riuslta mai selezionato
     if Assigned(VirtualStringTree1.FocusedNode) then
      VirtualStringTree1.ChildCount[VirtualStringTree1.FocusedNode] := 
VirtualStringTree1.ChildCount[VirtualStringTree1.FocusedNode] + 1;
      //Node := VirtualStringTree1.AddChild(VirtualStringTree1.FocusedNode);
    end;
 
 
procedure Tfrm_TreeView.VirtualStringTree1InitNode(Sender: TBaseVirtualTree;
   ParentNode, Node: PVirtualNode; var InitialStates: 
TVirtualNodeInitStates);
var Data: PMyRec;
begin
   Data := Sender.GetNodeData(Node);
 
   //durante il ciclo risulta sempre nil
   if ParentNode = nil then
     begin
       Data.Caption := sVoceMenu; //'Nodo Root' + IntToStr(Node.Index);
       Data.ImageIndex := 1;
     end
   else
     begin
       Data.Caption := sVoceMenu; //'Nodo Child' + IntToStr(Node.Index);
       Data.ImageIndex := 1;
     end;
end;

 >Il 11/08/2012 09:05, Massimo Attoni ha scritto:
ho seguito un'alta via e crea i nodi come voluto
 
---> Root
----- Child
------- n child
----- Child
 
type
   PMyRec = ^TMyRec;
   TMyRec = record
     Caption: WideString;
     ImageIndex: Integer;
     Indice: Cardinal;
     IndiceAss: Cardinal;
   end;
 
procedure TForm1.Button3Click(Sender: TObject);
var Node, NodoRoot, NodoRif: PVirtualNode;
     i,x: integer;
begin
   //crea nodo root
   VirtualStringTree1.RootNodeCount := VirtualStringTree1.RootNodeCount + 1;
   Node := VirtualStringTree1.GetLast;
   VirtualStringTree1.Selected[Node]:=True;
 
   //Nodo root serve come riferimento per selezionarlo
   //quando serve senza scorrerli tutti
   NodoRoot := Node;
   NodoRif := Node;
 
   //aggiunge child al nodo root
   VirtualStringTree1.AddChild(NodoRif);
   VirtualStringTree1.Expanded[Node] := True;
 
   Node := VirtualStringTree1.GetLast;
   VirtualStringTree1.Selected[NodoRif]:=True;
   NodoRif := Node;
 
   //aggiungo n child
   for x := 0 to 20 do
    begin
      VirtualStringTree1.AddChild(NodoRif);
      //VirtualStringTree1.Expanded[Node] := True;
    end;
 
    //aggiungo un'altro child al nodo root
   if VirtualStringTree1.Selected[NodoRoot] then
     begin
      VirtualStringTree1.Selected[NodoRoot]:=True;
      VirtualStringTree1.AddChild(NodoRoot);
      //VirtualStringTree1.Expanded[Node] := True;
     end;
end;
 
 
procedure TForm1.VirtualStringTree1Change(Sender: TBaseVirtualTree;
   Node: PVirtualNode);
var Data : PMyRec;
     idx: Cardinal;
begin
   Node := VirtualStringTree1.FocusedNode;
 
   if Assigned(Node) then
     begin
       Data := Sender.GetNodeData(Node);
       Data.Indice := Node.Index;
       Data.IndiceAss := VirtualStringTree1.AbsoluteIndex(Node);
 
       Label1.Caption := Data.Caption + IntToStr(Data.Indice) +
                          ' - ' + IntToStr(Data.IndiceAss) +
                          ' child ' + IntToStr(Node.ChildCount) +
                          ' parent ' + IntToStr(Node.Parent.ChildCount);
 
       //evidenzia con colore diverso il nodo con figli
       if Node.ChildCount > 0 then 
VirtualStringTree1.Colors.FocusedSelectionColor := clSilver
       else VirtualStringTree1.Colors.FocusedSelectionColor := clBlue;
     end;
end;

> [...]
altro piccolo problema: I Font
 
seguendo un'esempio ho applicato al Evento OnPaintText,
ma applica sempre TargetCanvas.Font.Color := clBlue
 
iLivello e' una variabile locale per distinguere il livello del nodo
 
es:
--- Root     ---- livello 0  -> Navy + bold
---- Child   ---- livello 1  -> Navy + bold
------ Child ---- livello 2  -> blue
 
procedure Tfrm_TreeView.VirtualStringTree1PaintText(Sender: 
TBaseVirtualTree;
   const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
   TextType: TVSTTextType);
var Data: PMyRec;
begin
   Data := VirtualStringTree1.GetNodeData(Node);
 
   if (iLivello = 0) or (iLivello = 1) then
    begin
     TargetCanvas.Font.Color := clNavy;
     TargetCanvas.Font.Style := Font.Style + [fsBold];
    end
   else
    TargetCanvas.Font.Color := clBlue;
end;
 
---Esempio trovato
 
type
   PTreeData = ^TTreeData;
   TTreeData = record
     Column0: String;
     Column1: String;
     Column2: String;
   end;
 
procedure TForm1.VSTPaintText(Sender: TBaseVirtualTree;
   const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
   TextType: TVSTTextType);
Var
   Data: PTreeData;
begin
   Data := VST.GetNodeData(Node);
 
   if Data^.Column0 = 'sky' then
     TargetCanvas.Font.Color:=clBlue;
 
   if Column = 1 then
   begin
     TargetCanvas.Font.Color:=clRed;
     TargetCanvas.Font.Style:= Font.Style + [fsItalic];
   end;
 
   if Column = 2 then
   begin
//  ImageList1.Draw(Form1.Canvas,-1,-1,2); {draw top left of form, 3rd 
image of ImageList1??}
     TargetCanvas.Font.Size:= 9;
     TargetCanvas.Font.Color:=clHighlightText;
   end;
end;
 

> altro piccolo problema: I Font
 
era cosa da poco:
 
- aggiunto un membro "Livello" al Record
 
type
   PMyRec = ^TMyRec;
   TMyRec = record
     Caption: WideString;
     ImageIndex: Integer;
     Indice: Cardinal;
     IndiceAss: Cardinal;
     Livello: Integer;
end;
 
- modificato per leggere il livello del nodo
   Data.Livello := Sender.GetNodeLevel(Node);
 
ora si comporta come volevo.
 
procedure Tfrm_TreeView.VirtualStringTree1PaintText(Sender: 
TBaseVirtualTree;
   const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
   TextType: TVSTTextType);
var Data: PMyRec;
begin
   Data := VirtualStringTree1.GetNodeData(Node);
 
   Data.Livello := Sender.GetNodeLevel(Node);
 
   if (Data.Livello = 0) or (Data.Livello = 1) then
    begin
     TargetCanvas.Font.Color := clNavy;
     TargetCanvas.Font.Style := Font.Style + [fsBold];
    end
   else
    begin
     TargetCanvas.Font.Color := clBlue;
     TargetCanvas.Font.Style := Font.Style + [fsBold];
    end;
end;