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

C++Builder Discussion :

TTreeView ascenseur qui clignote lors du rafraichissement


Sujet :

C++Builder

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut TTreeView ascenseur qui clignote lors du rafraichissement
    Bonjour,

    j'utilise XE7 c++.
    j'ai un TTreeView que je rafraîchis toutes les secondes. Je lui ai mis sa propriété doubleBufferd à true, ainsi que celle de la form qui le contient.
    Et malgré le beginUpdate et endUpdate, l'ascenseur "clignote" à cause du fullExpand semblerait il (si je le met en commentaire, plus de clignotement).

    Du code tout simple pour reproduire le problème, à mettre dans un timer de 1sec :
    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
     
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
            TreeViewAlarm->Items->BeginUpdate();
    	TreeViewAlarm->Items->Clear();
     
    	TTreeNode * node = NULL;
    	for (int i = 0; i < 200; i++)
    	{
    		node = TreeViewAlarm->Items->Add(node, "toto"  + IntToStr(i));
    	}
     
    	for (int i = 0; i < 200; i++)
    	{
    		TreeViewAlarm->Items->AddChild(node, "titi"  + IntToStr(i));
    	}
     
    	TreeViewAlarm->FullExpand(); // -> si je mets cette ligne en commentaire, plus de soucis
     
    	TreeViewAlarm->Items->EndUpdate();
    	TreeViewAlarm->Invalidate();
    }
    Voilà, si quelqu'un a une idée pour résoudre ce problème, merci d'avance !!!

    Pascale38

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    En fait le fait même de rafraîchir un treeView (ou une liste) qui a un ascenseur semble compliqué...
    En effet, l'ascenseur remonte systématiquement à chaque rafraîchissement ... Normal...
    Je ne sais pas comment gérer ça ? (pas d'événement OnScroll...)
    Quelqu'un a t'il déjà été confronté à ce genre de besoin et si oui quelle solution a été adoptée ?

    merci pour votre aide !!

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Ton truc me semble bizarre : en mettant BeginUpdate et EndUpdate, tu bloques tout rafraîchissement.

    Donc comme ton appel à FullExpand est à l'intérieur cela devrait ne rien faire ou alors être fait 1 seule fois.

    Moi je dirais, que comme la VCL/ win32 gère le rafraîchissement de façon très "naïve", je mettrais cet appel après l'appel Invalidate.


    Sinon,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        XXX->VertScrollBar->Position = 0;
        XXX->HorzScrollBar->Position = 0;

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    merci foetus oui moi aussi je trouve ça bizarre,
    mais copie/colle le code et tu verras...
    En même temps, le begin et end update sont fait sur les items, pas sur le treeView...
    Donc pas nécessairement sur la scrollbar...???

    J'ai essayé de sortir le FullExpand, pas mieux...
    Visuellement c'est même pire...

    Et sinon malheureusement je n'ai pas de propriété HorzScrollBar dans mon treeView

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Tu vas lutter: il faut prendre le premier nœud est faire un appel MakeVisible.
    TTreeNode.MakeVisible

    Avec un TTreeView tu n'as pas accès aux ascenseurs ... et tu ne peux pas changer la hauteur des lignes

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Je suis la championne de la lutte

    Sauf que je dois rafraîchir ma liste, donc régulièrement je vide mon treeView et je le reremplis avec mes nouvelles données.
    Et je veux garder la position de mon scroll.
    Donc je ne vois pas comment utiliser MakeVisible puisqu'à chaque fois tous mes nœuds sont effacés...
    (ou alors j'ai pas compris )
    C'est pour ça que la position du scroll me semblait une solution...
    De toutes façons cette ascenseur qui clignote c'est trop laid...
    Bref pour l'instant je n'ai pas de solution.... Pour aucun de mes 2 problèmes...

  7. #7
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    ce comportement est parfaitement normal
    si tu utilise ce composant de cette manière
    En principe on ajoute a chaque fois de nouveaux éléments sans effacer les anciens
    de plus en principe il doit toujours y avoir un Root Principal auquel on ajoute des enfants;

    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
     
    TreeViewAlarm->Items->Clear();
    	//;
    	TTreeNode * Node;
    	TreeViewAlarm->Items->Add(NULL,"RootNode");
    	Node=TreeViewAlarm->Items->Item[0];
    	TreeViewAlarm->Items->BeginUpdate();
    	for (int i = 0; i < 2000; i++)
    	{
    		TreeViewAlarm->Items->AddChild(Node,"ChildNode1");
    		Node = TreeViewAlarm->Items->Add(Node, "RootNodeToto"  + IntToStr(i));
     
    	}
    	TreeViewAlarm->Items->EndUpdate();
    //	for (int i = 0; i < 200; i++)
    //	{
    //		TreeViewAlarm->Items->AddChild(node, "titi"  + IntToStr(i));
    //	}
    	TreeViewAlarm->FullExpand();
    	Node=TreeViewAlarm->Items->Item[Lastpos];// LastPos contient le dernier élément de la TreeView
    	TreeViewAlarm->TopItem=Node;

    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  8. #8
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    le code suivant minimise le défaut de rafraichissement

    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
     
     
    // dans le .h de ta classe Tform
    // ajoute le membre privé suivant
    TTreeNode * Node;
     
     
    // je simule l'initialisation de la TreeView via un bouton
    void __fastcall TForm10::Button1Click(TObject *Sender)
    {
    	TreeViewAlarm->Items->Add(NULL,"RootNode");
    	TreeViewAlarm->Items->AddChild(Node,"ChildNode");
    	Node=TreeViewAlarm->Items->Item[0];
    	Timer1->Enabled=true;
    }
    // le code dans ton Timer
    void __fastcall TForm10::Timer1Timer(TObject *Sender)
    {
    	int lastPos;
    	lastPos=(TreeViewAlarm->Items->Count-1)/2;
    	TreeViewAlarm->Items->BeginUpdate();
    	Node=TreeViewAlarm->Items->Item[lastPos];// LastPos contient le dernier élément de la TreeView
    	TreeViewAlarm->TopItem=Node;
    	TreeViewAlarm->FullExpand();
    	for (int i = 0; i < 20; i++) {
    	  Node = TreeViewAlarm->Items->Add(Node, "RootNodeToto"  + IntToStr(lastPos));
    	  TreeViewAlarm->Items->AddChild(Node,"ChildNodeToto"+IntToStr(lastPos));
    	  lastPos=(TreeViewAlarm->Items->Count-1)/2;
    	}
    	TreeViewAlarm->Items->EndUpdate();
     
     
    }
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Bonjour DjmSoftware et merci pour tes réponses.
    Donc si je n'utilise pas le composant de la bonne manière, comment dois je l'utiliser ou quel composant utiliser
    pour pouvoir rafraîchir toutes les secondes sans que cela clignote ?
    C'est vraiment cela mon besoin.

    Et de garder la position de mon ascenseur entre chaque refresh.

    merci !

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Et merci pour le TopItem, je n'avais pas vu cette propriété jusque là !!!

  11. #11
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    a tu essayé le dernier code que j'ai posté?
    celui-ci résolu le problème du clignotement
    quand au fait de faire un refresh toutes les secondes c'est inutile
    le composant TreeView est capable de contenir des dizaines de milliers d'éléments
    on pourrait par contre imaginer que déclencher par un autre Timer ou un événement une partie des contenu de la TreeView soit effacée après au préalable fait une sauvegarde des éléments

    Je ne connais pas l'utilité de ton application, mais quand à moi je préfère utiliser des événements se déclenchant en fonction d'un contexte qu'un Timer
    n'oublie pas que ta TreeView est bloquée toutes les secondes par ton Timer
    l'utilisateur final aura donc de la peine à utiliser le composant



    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Points : 79
    Points
    79
    Par défaut
    Re,
    oui j'ai testé ton code mais tu ne fais que "ajouter" des noeuds et ça ne correspond pas à ce que je cherche
    En fait mon besoin de "refresh" n'est nullement lié à un problème de taille de mon treeView, mais vraiment à rafraîchir mes noeuds (ajout ou suppression de noeuds).
    J'affiche des alarmes, qui apparaissent et disparaissent, et je dois refléter régulièrement l'état réel des alarmes (toutes les secondes ou 2 secondes peu importe).
    Afin de ne pas avoir à chercher les alarmes à enlever et à ajouter, le plus simple c'est de vider la liste et de la reremplir avec les alarmes qui viennent d'être remontées.
    C'est bien plus simple et ça marche très bien, je le fais déjà dans des listes mais dont je connais la taille max donc pas d'ascenseur.
    Là avec l'ascenseur et le problème de clignotement, et bien ma technique ne peut pas être utilisée, c'est trop laid ce clignotement .

    En tout cas merci DjmSoftware pour ton temps et ton aide.

Discussions similaires

  1. Les images clignotes lors du Mouse over
    Par The Bat ! dans le forum C++Builder
    Réponses: 4
    Dernier message: 30/05/2005, 10h37
  2. Ou trouver les informations qui defile lors du boot ?
    Par piff62 dans le forum Administration système
    Réponses: 2
    Dernier message: 17/03/2005, 17h19
  3. [BPW] Affichage clignotant lors de redimensionnement fenêtre
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 24/04/2004, 00h01
  4. [Linux]Avoir le curseur qui clignote
    Par Yabo dans le forum C
    Réponses: 2
    Dernier message: 06/07/2003, 13h46

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