Tiens voilà 2 procédure que j'ai fait, elles ne sont pas optimisées ni protégées mais elles marchent. Elles diffèrent de ce que tu demandais mais c'est une bonne base pour arriver à ce que tu veux...
Procedure ConstituerArbreRoot(StringArbre: String; TreeV: TTreeView);
{ StringArbre est de cette forme là : <coucou<c<moi>>><salut<:)><à toi>>
ca donnera en gros :
coucou
|- c
|- moi
salut
|- :)
|- à toi
Les crochets indiquent les éléments de l'arbre... le nom doit toujours etre
marké entre le '<' de départ et le '>' ou '<' de fin.}
Var
PosCrochet: Integer;
Function CreateTree_Recurse(StringArbre: String; Node: TTreeNode; TreeV: TTreeView): String;
Var
rItemRootData: rItemArbreRootData;
TmpNode: TTreeNode;
Nb, PosCrochet, PosCrochet2: Integer;
Begin
Result := StringArbre;
Nb := 1;
While True do
begin
If Result = '' Then Exit;
If (Result[1] = '>') and (Nb<1) Then
begin Result := Copy(Result, 2, MaxInt); Exit; end;
If Result[1] = '<' Then
begin Result := Copy(Result, 2, MaxInt); inc(Nb); end;
PosCrochet := pos('<', Result);
PosCrochet2 := pos('>', Result);
If PosCrochet = 0 Then PosCrochet := PosCrochet2;
If PosCrochet2 = 0 Then PosCrochet2 := PosCrochet;
If PosCrochet>PosCrochet2 Then PosCrochet := PosCrochet2;
If PosCrochet = 0 Then Exit;
rItemRootData := CreateInfoRootNode(Copy(Result, 1, PosCrochet-1));
If Result[PosCrochet] = '<' Then
begin
If Nb=0 Then
begin
inc(Nb);
AddChildRoot(Node, rItemRootData, TreeV);
Result := Copy(Result, PosCrochet+1, MaxInt);
end else begin
TmpNode := Node;
If rItemRootData.NomRepertoire <> '' Then TmpNode := AddChildRoot(Node, rItemRootData, TreeV);
Result := CreateTree_Recurse(Copy(Result, PosCrochet+1, MaxInt), TmpNode, TreeV);
dec(Nb);
end;
end else begin
dec(Nb);
AddChildRoot(Node, rItemRootData, TreeV);
Result := Copy(Result, PosCrochet+1, MaxInt);
end;
end;
End;
Begin
TreeV.Items.BeginUpdate;
PosCrochet := pos('<', StringArbre);
StringArbre := copy(StringArbre, PosCrochet+1, MaxInt);
CreateTree_Recurse(StringArbre, Nil, TreeV);
TreeV.AlphaSort;
TreeV.Items.EndUpdate;
End;
Function ConstituerStringDeArbreRoot(TreeV: TTreeView): String;
{ TreeV est de cette forme là :
coucou
|- c
|- moi
salut
|- :)
|- à toi
ca donnera en gros : <coucou<c<moi>>><salut<:)><à toi>>
Les crochets indiquent les éléments de l'arbre... le nom doit toujours etre
marké entre le '<' de départ et le '>' ou '<' de fin.}
Var
NodeFirst: TTreeNode;
Function CreateString_Recurse(Node: TTreeNode; TreeV: TTreeView): String;
Var
TmpNode: TTreeNode;
Begin
Result := CreateStringInfoRootNode(prItemArbreRootData(Node.Data)^);
TmpNode := Node.getFirstChild;
While TmpNode<>Nil do
begin
Result := Result+'<'+CreateString_Recurse(TmpNode, TreeV)+'>';
TmpNode := Node.GetNextChild(TmpNode);
end;
End;
Begin
Result := '';
NodeFirst := TreeV.Items.GetFirstNode;
While NodeFirst<>Nil do
begin
Result := Result+'<'+CreateString_Recurse(NodeFirst, TreeV)+'>';
NodeFirst := NodeFirst.getNextSibling;
end;
End;
Je viens de relire le code... C'est pas optimisé du tout... lol
Tout problème a sa solution... Mais en général, c'est jamais la bonne...