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

Langage Delphi Discussion :

Positionnement sur un noeud d'un TreeView après mise à jour


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut Positionnement sur un noeud d'un TreeView après mise à jour
    Bonjour,

    Je souhaiterai me positionner sur un noeud (sur lequel j'ai effectué un double clic) qui ouvre un autre formulaire.
    Lorsqu'une mise à jour est effectué, le TreeView est rafraîchi et je souhaiterai me positionner directement sur le noeud modifié (celui sur lequel j'étais positionner avant la modification).
    Est-ce possible ? Comment dois-je procéder ?

    Voici la partie de mon code concerné :

    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
      // on efface la partie recherche de tâches client
      E_RaisonCli.Clear;
      E_VilleCli.Clear;
      DM_Tache.Q_Rech_Mat_Client.Close;
      CRDB_TachesCli.OnDblClick := nil;
     
      for i := 0 to TV_Taches.Items.Count - 1 do
      begin
        if TV_Taches.Items.Item[i].Selected then
        begin
          if LeftStr(TV_Taches.Items.Item[i].Text,8) = 'Tâche n°' then
          begin
            Sql := TV_Taches.Items.Item[i].Text+'      ';
            Task := '' ;
     
            for j := 10 to 19 do
            begin
              if (Copy(Sql, j, 1) < '0') or (Copy(Sql, j, 1) > '9') then
                break;
              Task := Task + Copy(Sql, j, 1);
            end;
     
            Tache := StrToInt(Task);
            TacheTrouvee := 1;
            F_Tache := TF_Tache.Create(Self);
            F_Tache.ShowModal;
            break;
          end;
        end;
      end;
     
      // rechargement du TreeView
      chargerTreeView(Sender);
      TV_Taches.FullExpand;
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Utilise la propriété Data lors du remplissage du noeud par chargerTreeView, tu stockes un pointeur sur un record dans lequel tu mémorises les informations pour identifier un noeud
    le Numero de Tache pourrait être dans ce record, cela éviterait d'utiliser le Text pour le retrouver !

    Ensuite, lors de rechargement de chargerTreeView, tu fais une copie de ce record, tu le passe en paramètre à chargerTreeView, lors des ajouts, si tu tombes sur le noeud correspond, tu le sélectionne et tu continues le chargement !

    Evidemment, les pointeurs de record devront être libérés !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    Merci pour ta réponse claire et précise, j'ai plus qu'à mettre en place.
    Peux-tu m'illustrer la première partie de ta réponse par du code stp ?

  4. #4
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Moi, je ferai tout simplement ça, éventuellement en désactivant la mise à jour visuelle, dans un bloc try..finally. :

    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
    var
    Node : TTreeNode ;
     
    [...]
    // Mémoriser le noeud sélectionné
    Node := TV_Taches.Selected ;  <---
     
    [...]
    
    // rechargement du TreeView
    chargerTreeView(Sender);
    // Se remettre sur le noeud
    TV_Taches.Selected := Node ;  <---
    
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    Merci pour ta réponse, en effet c'est + simple comme ça.
    Peux-tu être plus précis sur la désactivation de la mise à jour visuelle stp ?

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Simple mais faux !

    chargerTreeView va forcément faire un Clear pour effacer les Noeuds et en recréer d'autres !

    Le Node mémorisé sera donc libéré !

    Je vous laisse deviner la suite !

    Pour la Mise à Jour, il fait allusion à BeginUpdate et EndUpdate du TTreeNodes ainsi cela ne cherchera pas à dessiner les noeuds au fur et à mesure de leur création mais bien une seule fois à la fin du remplissage !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    Ok bon je vais me pencher sur les pointeurs du coup (je ne connais pas vraiment mais c'est l'occasion de voir).
    En faisant la méthode de tintinux, il se positionnait pas exactement sur le bon noeud, sur les tests que j'ai pu faire c'est en général 1 noeud au dessus ou 1 en dessous

  8. #8
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Regarde la méthode BeginUpdate de TTreeNodes ("BeginUpdate, ComCtrls.TTreeNodes" dans la doc de Delphi 2010)

    Elle permet d'éviter de réafficher chaque item un par un, en passant la main à Windows à chaque fois, ce qui peut accélèrer beaucoup le traitement.

    Il faut s'assurer que EndUpdate soit exécuté même en cas de plantage, ce qui s'obtient grâce à un bloc try..finally.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TV_Taches..Items.BeginUpdate;
    try
      chargerTreeView(Sender); 
      TV_Taches.FullExpand;
    finally
      TV_Taches.Items.EndUpdate;
    end ;
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    Merci pour les précisions tintinux mais ça n'a pas l'air de fonctionner correctement, il se repositionne un peu n'importe comment en procédant comme ça :
    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
      // on efface la partie recherche de tâches client
      E_RaisonCli.Clear;
      E_VilleCli.Clear;
      DM_Tache.Q_Rech_Mat_Client.Close;
      CRDB_TachesCli.OnDblClick := nil;
     
      for i := 0 to TV_Taches.Items.Count - 1 do
      begin
        if TV_Taches.Items.Item[i].Selected then
        begin
          // mémorisation du noeud actuel
          Node := TV_Taches.Selected ;
     
          if LeftStr(TV_Taches.Items.Item[i].Text,8) = 'Tâche n°' then
          begin
            Sql := TV_Taches.Items.Item[i].Text+'      ';
            Task := '' ;
     
            for j := 10 to 19 do
            begin
              if (Copy(Sql, j, 1) < '0') or (Copy(Sql, j, 1) > '9') then
                break;
              Task := Task + Copy(Sql, j, 1);
            end;
     
            Tache := StrToInt(Task);
            TacheTrouvee := 1;
            F_Tache := TF_Tache.Create(Self);
            F_Tache.ShowModal;
     
            // rechargement du TreeView
            TV_Taches.Items.BeginUpdate;
            try
              chargerTreeView(Sender);
              TV_Taches.FullExpand;
              TV_Taches.Selected := Node ;
            finally
              TV_Taches.Items.EndUpdate;
            end ;
     
            {chargerTreeView(Sender);
            TV_Taches.FullExpand;
            TV_Taches.Selected := Node ;    }
            exit;
          end;
        end;
      end;
    end;
    Du coup je vais voir la notion de pointeur quggéré par ShaiLeTroll, merci quand même

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    @drake56, Test ce code pour voir ce que ça donne
    Cela devrait mieux te faire comprendre le problème de faire un TreeView.Items.Clear et de conserver un Noeud !
    Tu as même de chance de n'avoir qu'un mauvais placement, une violation d'Accès pourrait surgir !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
           // rechargement du TreeView
            TV_Taches.Items.BeginUpdate;
            try
              ShowMessage(Node.Text); 
              chargerTreeView(Sender);
              TV_Taches.FullExpand; 
              ShowMessage(Node.Text); // c'est celui-ci le plus interessant  
              TV_Taches.Selected := Node ;
     
            finally
              TV_Taches.Items.EndUpdate;
            end ;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    J'ai testé avec le Clear, il me prend une ligne au hasard puis si j'enlève le Clear, le Node a bien la bonne valeur mais en effet, j'ai une violation d'accès.
    Je vais essayer de comprendre la méthode par un pointeur et merci pour le temps que tu m'accordes.

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    J'ai du mal avec les pointeurs dans mon cas, si quelqu'un aurait un peu de code pour m'aider je suis preneur.
    Puis dans mon cas, il va pas falloir une liste pour stocker les pointeurs ?

  13. #13
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    C'est sûr que si tu effaces le noeud sur lequel tu étais positionné, a fortiori tous les noeuds, tu ne peux pas y revenir...

    Si tu ne peux pas faire autrement, et si tu as du mal avec les pointeurs, et à condition que le texte de chaque noeud soit unique, tu peux parcourir tous les items jusqu'à ce que tu retrouves celui à partir duquel tu as cliqué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    texte_initial := TV.Selected.Text ;
     
    // ici tu fais saisir, et tu détruis et re-crée tout l'arbre
     
    TV.Selected := nil ;
    for i := 0 to TV.Items.Count-1 do
      if TV.Items[I].Text = Texte_Initial then
      begin
        TV.Selected :=  TV.Items[I];
        break ;
      end ;
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    Merci tintinux pour ta nouvelle suggestion que j'ai réussi à mettre en place puisque le début du noeud ne change jamais. En attendant ça va rester comme ça puis si les performances ne sont pas au rdv je reviendrai sur les pointeurs.

    Problème résolu

    Bonne journée

  16. #16
    Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    essayez de mettre TV_Taches.Items.Item[i].Selected:=True pour la selection de l'élément
    merci

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

Discussions similaires

  1. Comment se positionner sur un noeud d'un TTreeView ?
    Par Cazaux-Moutou-Philippe dans le forum Langage
    Réponses: 3
    Dernier message: 18/01/2008, 10h54
  2. Réponses: 4
    Dernier message: 16/05/2007, 15h39
  3. Réponses: 2
    Dernier message: 31/12/2006, 17h26
  4. Réponses: 2
    Dernier message: 19/02/2006, 12h46

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