IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

TreeView avec Table automatique


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 46
    Points : 45
    Points
    45
    Par défaut TreeView avec Table automatique
    Bonjour,
    Je voudrais faire un bouton qui permet de créer automatiquement le treeview à partir d'un tableau donné en 3 étapes :
    http://prntscr.com/7owk12
    Je pourrai le faire manuellement mais c'est beaucoup trop long... et ne permettrai pas de changer les données.
    Comment feriez vous pour que le treeview se développe automatiquement à partir de cette base là? (Avec des extensions de noeuds supplémentaire si on modifie le tableau?)
    Merci de votre aide

    Ps : J'ai déjà fais le treeview avec ce tableau manuellement sans m'en rendre compte ... ')
    Mon code si sa en intéresse certains et faites pas trop gaffes aux commentaires, je les mets toujours n'importe comment, MERCI <3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    Var
    Tempo_Noeud_Text : String;
    I, A, B, ID : Integer;
    RowCount, RowCountTempo, NOEUD_UN, NOEUD_Tempo : integer;
    Name_Noeud, Test : string;
    First_Noeud, Second_Noeud : Boolean;
    begin
      {Lire tableau}  //Lit les Numéros parents
        ADORequete.Active:=false;
        ADORequete.SQL.Clear;
        ADORequete.SQl.Add('SELECT Branche FROM Branches_1_Parents');
        ADORequete.Active:=true;
      {Tableau lu} //Nb de Ligne totales
        RowCountTempo := ADORequete.RecordCount;//Nombre total de données
      {Inits_Variables}
        First_Noeud := False;
        NOEUD_UN := 0;
      {GO}
     if(Arborescence.selected <> nil) then
      begin
        {Lire tableau} //Dans la boucle A
          ADORequete.Active:=false;
          ADORequete.SQL.Clear;
          ADORequete.SQl.Add('SELECT Parent FROM Branches_1_Parents');//Sélection le premier numéro
          ADORequete.Active:=true;
     
          NOEUD_Tempo := ADORequete.FieldByName('Parent').AsInteger;    //Prend ppv 0
        for A := 0 to RowCountTempo do  //Jusqu'a MAX 12??
        begin
          if(NOEUD_Tempo = NOEUD_UN) then //Si Premiere val lu = 0
          begin
            NOEUD_Tempo := ADORequete.FieldByName('Parent').AsInteger;    //Prend ppv 0
            ADO_Name.Active:=false;  // ADO_NAME POUR LE NOM ET ADOREQUETE POUR LE NUMERO
            ADO_Name.SQL.Clear;
            ADO_Name.SQl.Add('SELECT Branche FROM Branches_1_Parents where Parent ='''+NOEUD_Tempo.ToString+'''');//Sélection le premier numéro
            ADO_Name.Active:=true;
            Test := ADO_Name.FieldByName('Branche').Text;
            RowCount := ADO_Name.RecordCount;//le nombre de noeud à 0
              {Le premier NOEUD}
            if(First_Noeud = false)then
            begin
              for I := 1 to RowCount do//Boucle pour 1 Noeud
              begin
                Label2.Caption := ADO_Name.FieldByName('Branche').AsString;
                Name_Noeud := ADO_Name.FieldByName('Branche').AsString;
                Arborescence.Items.AddChild(Arborescence.Selected,Name_Noeud);
                ADO_Name.Next;
                ADORequete.Next;
              end;//FINI LES PARENTS 0, PASSE à 1
              First_Noeud := true;//Fini la construction de la base
              ADORequete.Next;
              NOEUD_Tempo := ADORequete.FieldByName('Parent').AsInteger;
              //NOEUD_Tempo := NOEUD_Tempo + 1;
              NOEUD_UN := NOEUD_UN + 1;
            end;
     
     
                {Le deuxième NOEUD}
            if(First_Noeud = true) then//Aprs que la base soit faites
            begin
              ADO_Name.Active:=false;  // ADO_NAME POUR LE NOM ET ADOREQUETE POUR LE NUMERO
              ADO_Name.SQL.Clear;
              ADO_Name.SQl.Add('SELECT Branche FROM Branches_1_Parents where Parent ='''+NOEUD_Tempo.ToString+'''');//Sélection le premier numéro
              ADO_Name.Active:=true;
    //        ADO_Name.FieldByName('Branche').Text;
              RowCount := ADO_Name.RecordCount;//On a 2
     
              for I := 1 to RowCountTempo do
              begin
                ADO_ID.Active:=false;  // ADO_NAME POUR LE NOM ET ADOREQUETE POUR LE NUMERO
                ADO_ID.SQL.Clear;
                ADO_ID.SQl.Add('SELECT ID FROM Branches_1_Parents');//Sélectionne l'ID
                ADO_ID.Active:=true;
                ID := ADO_ID.FieldByName('ID').AsInteger;
                ADO_ID.Next;
                test := ADO_ID.FieldByName('ID').ToString;//Revoir l'incrément auto ID, Now manuel
                if(ID = NOEUD_Tempo) then
                begin
                  for B := 1 to RowCount do
                  begin
                    Arborescence.Items.AddChildFirst((Arborescence.Selected),ADO_Name.FieldByName('Branche').Text);
                    ADO_Name.Next;
                    ADO_ID.Next;
                  end;
                  ADORequete.Next;
                  NOEUD_Tempo := ADORequete.FieldByName('Parent').AsInteger;
                  NOEUD_UN := NOEUD_UN + 1;//???
                end
                else
                begin
                  ID := ID + 1;
                end;
              end;
     
     
     
     
     
     
     
     
        {
              for I := 1 to RowCount do//Boucle pour 1 Noeud
              begin
                  ADO_ID.Active:=false;  // ADO_NAME POUR LE NOM ET ADOREQUETE POUR LE NUMERO
                  ADO_ID.SQL.Clear;
                  ADO_ID.SQl.Add('SELECT ID FROM Branches_1_Parents');//Sélectionne l'ID
                  ADO_ID.Active:=true;
                  ID := ADO_ID.FieldByName('ID').AsInteger;
      //            if(ID =
     
                  Label2.Caption := ADO_Name.FieldByName('Branche').AsString;
                  Name_Noeud := ADO_Name.FieldByName('Branche').AsString;
                  Arborescence.Items.AddChild(Arborescence.Selected,Name_Noeud);
                  ADO_Name.Next;
                  ADORequete.Next;
             end;//FINI LES PARENTS 0, PASSE à 1
             First_Noeud := true;//Fini la construction de la base
             ADORequete.Next;
             NOEUD_Tempo := ADORequete.FieldByName('Parent').AsInteger;
             //NOEUD_Tempo := NOEUD_Tempo + 1;
             NOEUD_UN := NOEUD_UN + 1;
          } end;//Fin If Second Noeud
          end
          else
          begin
            NOEUD_Tempo := NOEUD_Tempo + 1; //Si incrémentation discontinue
            NOEUD_UN := NOEUD_UN + 1;//...
          end;
        end;
      end;
    end;

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    A mon avis il y a certainement mieux en utilisant une fonction récursive.
    J'ai déjà écrit un programme de ce genre en D3 (donc il y a déjà des années de cela) et ne nécessitant qu'une seule requête et ce pour gérer des nomenclatures de produits.

    Il est certain que la structure de la table est très importante pour ce faire , dans mes données il y a trois champs concernant le treeview :
    la ligne (AbsoluteIndex), le code du parent et le niveau

    en gros pour dessiner un treeview j'ai une procédure principale et une procedure récursive

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    type TAnode = Record
       // données de l'objet j'y met entre autre un bookmark sur le Record
    end;
     
    procedure TForm1.Arbre
    var Anode : TTreeNode;
         DataNoeud : ^TAnode;
     
         procedure Enfants (ANode : TTreeNode,Niveau : Integer);
          var CNode : TTreeNode;
          begin
              // Allouer/Remplir objet DataNoeud;
              CNode:=TreeView.AddObject(nil,'',DataNoeud);
              // Dessin noeud 
              Query.Next;
              While not Query.EOF do
                 begin
                   if niveau>QueryPARENT.asInteger then break;
                   if Niveau=QueryPARENT.asInteger then
                      begin
                         // Allouer/Remplir objet DataNoeud
                          CNode:=TreeView.AddObject(nil,'',DataNoeud);
                         // Dessin Noeud 
                      end
                      else Enfants(Cnode,'',QueryPARENT.asInteger);
                 end;
             end;
    Begin
    Anode:=nil;
    // ouverture de la Query en précisant bien l'ordre (ligne absolue)
    TreeView.BeginUpdate;
    While not Query.EOF do
     begin
       if niveau=0 then 
          begin
            // Remplir l'objet DataNoeud
            Anode:=TreeView.AddObject(nil,'',DataNoeud);
            // Dessin Noeud
            Query.Next;
          end
      else Enfants(Anode,niveau);
     end;  
     end;
    TreeView.EndUpdate;
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 46
    Points : 45
    Points
    45
    Par défaut
    Par rapport à votre code, si j'ai bien compris, DataNoeud correspond au nom du nouveau noeud voulu mais comment je le remplis comme indiquer dans les commentaires si il est en TAnode, à moins que j'ai mal compris le DATANoeud, je le remplis avec le nom du noeud que je veux contenu dans le server non?
    Ma nouvelle base de données avec les niveaux (C'est plus logique enfaite )
    http://prntscr.com/7p2n8e
    Merci ,

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Albertus14 Voir le message
    si j'ai bien compris, DataNoeud correspond au nom du nouveau noeud voulu à moins que j'ai ma compris
    Non, vous avez mal compris.
    ce que je nomme Datanoeud est un Objet lié au noeud (d'où l'utilisation de AddObject et non de Add) vérifiez la syntaxe de AddObject et vous verrez que le deuxième argument est le "nom" du noeud
    Comment afficher les données alors ? en fait j'utilise une procédure pour remplir le texte et image du noeud en même temps que les données. Le commentaire Allouer/Remplir Objet Datanoeud remplace une fonction
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function NoeudDraw : ^TAnode;
    begin
     Result:=Allocmem(Sizeof(TAnode));
     Result.Record:=Query.GetBookmark;
     .....
    end;
    une autre procedure à utiliser après ajout permet ensuite de "dessiner" les données (je me permet de rajouter l'appel en commentaire sur le code déjà donné)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure DrawDataNode(Anode : TTreeNode);
    begin
     Anode.ImageIndex:= .....;
     ANode.Text:=Format(<un formatage>,[données de la Query]);
    end;
    Bien sur ce code est largement perfectible , il est très facile de fusionner les 2 codes proposé de façon à tout avoir en une seule fonction renvoyant un TTreeNode , à vous de jouer

    PS. vous pouvez joindre une image directement dans la discussion sans passer par un lien
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Travailler avec des tables automatiques
    Par SonnyFab dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/07/2010, 12h02
  2. Travailler avec des tables automatiques
    Par SonnyFab dans le forum Langage SQL
    Réponses: 0
    Dernier message: 29/06/2010, 14h37
  3. Alimenter un treeview avec les données d'une table
    Par typzea dans le forum VBA Access
    Réponses: 3
    Dernier message: 11/07/2008, 08h20
  4. Treeview et tables avec 2 champs Père et fils
    Par BEN NASR dans le forum Delphi
    Réponses: 4
    Dernier message: 14/05/2007, 16h48
  5. Comment synchroniser mon Treeview avec ma table
    Par Cazaux-Moutou-Philippe dans le forum WinDev
    Réponses: 2
    Dernier message: 21/10/2006, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo