Structure arboressente

jhonne2 Messages postés 2 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 4 juillet 2004 - 4 juil. 2004 à 15:23
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 - 5 juil. 2004 à 11:25
bonjour

je vous un procedure dans delphi qui transforme

structure comme par exemple : GN ( DET(la) ADJ(petit) N(chat) )

on arbre graphique comme par exemple :

....................GN
......................|
___________________________________
|......................|............................|
DET..................ADJ........................N
|.......................|...........................|
la....................petit.......................chat

3 réponses

Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
5 juil. 2004 à 10:53
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...
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
5 juil. 2004 à 11:21
oula j'ai pas viré le code superflus... je recommence :

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
    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;
      If Result[PosCrochet] = '<' Then
      begin
        If Nb=0 Then
        begin                                    
          inc(Nb);
          TreeV.Items.AddChild(Node, Copy(Result, 1, PosCrochet-1));
          Result := Copy(Result, PosCrochet+1, MaxInt);
        end else begin
          TmpNode := Node;
          TmpNode := TreeV.Items.AddChild(Node, Copy(Result, 1, PosCrochet-1));
          Result := CreateTree_Recurse(Copy(Result, PosCrochet+1, MaxInt), TmpNode, TreeV);
          dec(Nb);
        end;
      end else begin
        dec(Nb);
        TreeV.Items.AddChild(Node, Copy(Result, 1, PosCrochet-1));
        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;


voilà la première : celle qui constitue l'arbre en fonction de la string

Tout problème a sa solution... Mais en général, c'est jamais la bonne...
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
5 juil. 2004 à 11:25
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 := Node.Text;
    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;


voilà la deuxième : celle qui constitue la string en fonction de l'arbre

Tout problème a sa solution... Mais en général, c'est jamais la bonne...
0
Rejoignez-nous