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 confirm�
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    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 confirm�
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    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 confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    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 confirm�
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    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 confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    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 confirm�
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    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 Expert
    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
    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 Expert
    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
    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 confirm�
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    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 confirm�
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    D�tails du profil
    Informations personnelles :
    Localisation : France

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

  11. #11
    Membre Expert
    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
    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 confirm�
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    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