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

Composants FMX Delphi Discussion :

TreeView : rafraîchissement aprés un Sort


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 095
    Par défaut TreeView : rafraîchissement aprés un Sort
    Bonjour,

    Je fais un sort d'une Treeview, et j'ai un problème de rafraîchissement du treeview. J'ai essayé les repaint, realigncontent, invalidate, invaliderect, handlemessage et autre processmessage, sans succès !

    Ma fenêtre utilise un stylebook, est-ce que c'est lui qui pourrait poser un problème ?
    Quelle est la bonne solution pour que le contenu de ma Treeview se mette à jour ?

    Merci d'avance de vos suggestions.

    Voici le code du tri et de son appel :
    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
     
    function TfrmMain.SortItemsText(Left, Right: TFMXObject): Integer;
    begin
      Result := CompareText((Left as TTreeViewItem).Text, (Right as TTreeViewItem).Text);
    end;
     
    /////////////////////////////////////////////////////////////////
    procedure TfrmMain.btnTrieClick(Sender: TObject);
    begin
      TreeArbo.BeginUpdate;
      try
        TreeArbo.Sort(SortItemsText);
        //TreeArbo.Canvas.BeginScene;
        //TreeArbo.Canvas.Clear(0);
        //TreeArbo.Canvas.EndScene;
        // TreeArbo.RealignContent;
        //TreeArbo.InvalidateRect(RectF(0,0,TreeArbo.Width, TreeArbo.Height));
        //Self.Invalidate;
      finally
        TreeArbo.EndUpdate;
      end;
     
    //  Application.ProcessMessages;
     
    //  Application.HandleMessage;
    end;

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    perso, je parierai sur un BeginUpdate ... EndUpdate et absolument pas les "repaint, realigncontent, invalidate, invaliderect, handlemessage et autres processmessage"
    mais je vois qu'ils sont dans le code.

    Il va falloir que je me fasse un essai pour m'en assurer.

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Alors après quelques essais, je n'ai toujours pas trouvé comment créer un TFMXObjectSortComparer
    Pour l'instant, ce que je peux dire, c'est qu'il est facile de faire un tri des racines tout simplement en écrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm16.BtnSortClick(Sender: TObject);
     begin
    TreeView1.BeginUpdate;
    try
     TreeView1.Sorted:= True;
    finally
      Treeview1.EndUpdate;
    end;
    end;
    et que l'on peut changer le comportement "basique" du tri en ordre alphabétique croissant en créant un évènement OnCompare,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function TForm16.TreeView1Compare(Item1, Item2: TTreeViewItem): Integer;
    begin
     // ordre décroissant
     Result := CompareText(Item2.Text, Item1.Text);
    end;
    un test
    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
    procedure TForm16.AddRootClick(Sender: TObject);
    var item : TTreeviewItem;
    begin
      treeview1.BeginUpdate;
      Item := TTreeViewItem.Create(Self);
      item.Tag:=Random(40);
      Item.Text := generatext+' '+Item.Tag.ToString;
      Item.Parent := TreeView1;
      Item.OnApplyStyleLookup:=chkApplyStyleLookup;
      treeview1.EndUpdate;
    end;
     
    function TForm16.generatext: String;
    var i,l : integer;
    const ac = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    begin
    l:=Random(10);
    result:=EmptyStr;
     
    for I := 0 to l do
     result:=result+Ac[Random(Length(ac)-1)+1];
    end;
     
    // Tri en fonction du Tag (ordre ascendant)
    function TForm16.TreeView1Compare(Item1, Item2: TTreeViewItem): Integer;
    begin
     Result := Item1.Tag- Item2.tag;
    end;

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    À tête reposée, j'ai retenté de faire un tri avec un TFMXObjectSortComparer

    soit ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Treeview1.Sort(function (Left, Right: TFMXObject): Integer
                         begin
                           result:=CompareText((Left as TTreeViewItem).Text, (Right as TTreeViewItem).Text); 
                         end);
    soit en créant au préalable la fonction

    et je constate la disparition (affichage) d'éléments

    avant / après
    Nom : Capture.PNG
Affichages : 178
Taille : 2,2 Ko / Nom : Capture_1.PNG
Affichages : 181
Taille : 1,9 Ko

    Toutefois, si je rajoute un élément, liste précédente apparait triée (les élément(s) disparu(s) réapparaissent), le nouvel élément en dernier

  5. #5
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 095
    Par défaut
    J’ai exactement le même phénomène de disparition d’éléments après le sort, d’où ma recherche pour rafraîchir l’affichage de mon Treeview !

    Si tu as une solution, je suis preneur

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Pour l'instant, je ne vois que la solution de mon post #3 avec Treeview.Sorted=true; agrémentée si le tri est différent d'un tri alphabétique ascendant d'un code de l'évènement onCompare du treeview.
    Et encore, cela ne fonctionne que pour les éléments racines !

    Mes recherches m'ont bien fourni un code censé trier l'ensemble de l'arborescence
    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
    function TForm16.SortText(Left, Right: TFMXObject): Integer;
    var l,r : integer;
    begin
        l:=Left.Tag;
        r:=Right.Tag;
        Result := l-r; //CompareText((Left as TTreeViewItem).Text, (Right as TTreeViewItem).Text);
    end;
     
    procedure TForm16.SortTree(Item: TFmxObject; Comparer: TFmxObjectSortCompare);
    var
        I: Integer;
      begin
        // if we are in the initial call of this procedure, a tree view object is passed
        if Item is TTreeView then
        begin
          // sort the tree's top level nodes first
          Item.Sort(Comparer);
          // then recursively call this procedure for each top level node
          for I := 0 to TTreeView(Item).Count - 1 do
            SortTree(TTreeView(Item).Items[I], Comparer);
        end
        else
        // recursive calls of this procedure are passing tree nodes, which is this case
        begin
          // recursively call this procedure for each of this node's child
          for I := 0 to TTreeViewItem(Item).Count - 1 do
            SortTree(TTreeViewItem(Item).Items[I], Comparer);
          // and sort this node's children
          Item.Sort(Comparer);
        end;
    end;
    mais comme le Treeview.Sort(Compare) ne fonctionne pas c'est sans objet

Discussions similaires

  1. Réponses: 5
    Dernier message: 07/08/2015, 15h23
  2. TreeView : lenteur après migration sous .Net 2.0
    Par Ideal_Du_Gazeau dans le forum C#
    Réponses: 5
    Dernier message: 03/03/2010, 10h04
  3. Réponses: 2
    Dernier message: 18/07/2006, 09h29
  4. [C#][.Net 2.0] donner focus à Combobox, après click sur treeview
    Par Harry_polin dans le forum Windows Forms
    Réponses: 3
    Dernier message: 17/02/2006, 22h27

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