1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
{--- ConvertToTreeViewNode -----------------------------------------------------
Résout un conflit d'affectation entre TTree et TTreeNode
La classe personnalisée TTree (NTree.pas) manipule des nuds par le pointeur
PTreeNode vers TTreeNode.
Mais je veux utiliser le composant visuel TTreeView de Lazarus, le pointeur de
Noeud du composant nommé également TTreeNode mais dans une classe différente
pour gérer les nuds du composant TtreeView.
--------------------------------------------------------------------------------}
function TForm1.ConvertToTreeViewNode(TreeView: TTreeView; ParentItem: TTreeNode;
Node: PTreeNode): TTreeNode;
begin
if Node = nil then
Exit(nil);
{Ajoute le nud au TreeView}
if ParentItem = nil then
Result := TreeView.Items.Add(nil, Node^.Data) // Ajoute un nud racine
else
Result := TreeView.Items.AddChild(ParentItem, Node^.Data); // Ajoute un enfant
end;
{--- AfficherArbreDansTreeView -------------------------------------------------
- Utilisation d'une pile pour gérer les nuds logiques
-------------------------------------------------------------------------------}
procedure TForm1.AfficherArbreDansTreeView;
var
CurrentNode: PTreeNode;
TreeItem, ParentItem: TTreeNode;
NodeStack : TStack;
begin
{initialisations de TreeView}
TViewArbre.Items.Clear;
if FArbre.GetRoot = nil then
begin
ShowMessage('L''arborescence est vide.');
Exit;
end;
NodeStack := TStack.Create;
{Parcours de l'Arbre}
try
CurrentNode := FArbre.GetRoot;
ParentItem := nil;
while CurrentNode <> nil do
begin
{Convertit le nud logique en nud graphique}
TreeItem := ConvertToTreeViewNode(TViewArbre, ParentItem, CurrentNode);
{Si le nud a des enfants => Empile le parent et passe au premier enfant}
if CurrentNode^.Child <> nil then
begin
NodeStack.Push(CurrentNode); // Empile nud logique
ParentItem := TreeItem; // Le parent se focalise sur l'élément du TreeView
CurrentNode := CurrentNode^.Child; // Premier enfant
end
else if CurrentNode^.Sibling <> nil then
begin {Passe au frère suivant s'il existe}
CurrentNode := CurrentNode^.Sibling;
end
else if NodeStack.Count > 0 then
begin {Remonte dans la pile pour traiter les frères restants du parent courant}
CurrentNode := PTreeNode(NodeStack.Pop);
ParentItem := TViewArbre.Items.FindTopLvl(CurrentNode^.Parent^.Data);
end else
Break; // Fin du parcours si plus rien dans la pile.
end;
finally
NodeStack.Free; // Libère la pile.
end;
ShowMessage('Arborescence affichée dans le TreeView.');
end; |
Partager