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 :

D�truire un bouton sur son OnClick [FAQ]


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    21
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Par d�faut D�truire un bouton sur son OnClick
    Bonjour,

    La question est dans le sujet. J'ai cr�e dynamiquement un bouton que j'aimerais pouvoir d�truire sur son �v�nement OnClick. Avec ce que j'ai d�j� fait, j'ai une violation d'acc�s lorsque le code de l'�v�nement OnClick se termine (ce qui me para�t logique, vu qu'� ce moment l�, le bouton qui a appel� ce gestionnaire d'�v�nement n'existe plus).

    Comment faire ?

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de Gilles Lou�se
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par d�faut
    En principe, on ne peut pas d�truire l'objet sur son clic, c'est une erreur dite abstraite, c'est comme si l'objet se suicidait puisqu'une m�thode d'instance de classe est cens�e d�truire sa propre instance donc in fine se suicider. La POO n'autorise pas le suicide, la mort d'un objet est toujours ext�rieure. La question avait �t� d�j� pos�e sous une autre forme (http://www.developpez.net/forums/viewtopic.php?t=21060). Ce qu'il faut faire, c'est simplement de jouer sur la visibilit� de l'objet, donc de le rendre invisible sur le OnClick.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Button1->Visible=false;
    }
    Sinon, si vous voulez vraiment d�truire l'objet, il faudra le d�truire de l'ex�trieur. En principe �a ne sert � rien car la visibilit� seule suffit � r�soudre 99% des cas.

    � bient�t
    Gilles

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    21
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Par d�faut
    Tout d'abord, merci de votre r�ponse. Je me doutais bien de ce genre de r�ponse (malheureusement pour moi !).

    Je vais essayer d'expliquer pourquoi je voulais d�truire ce bouton.

    En fait, mon programme se compose d'une feuille et d'un ScrollBox dessus. J'ai une m�thode qui cr�e dynamiquement dans ce ScrollBox des TImage, des TLabels en pagaille et quelques TButton. Cette m�thode affiche tout cela selon le r�sultat d'une requ�te SQL (donc la quantit� de tout ces objets dans le scrollbox n'est pas d�termin�). Sur le OnClick d'un de ces boutons (mais � terme aussi sur le OnClick de certains Labels et Images), la base de donn�e est modifi�e. J'ai par cons�quent besoin de rafraichir l'affichage et donc de relancer cette m�thode. C'est pourquoi j'avais �crit sur ce OnClick ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    ScrollBox1->DestroyComponents();
    MaMethodeQuiMeRefaitToutLaffichage();
    Ce syst�me m'aurait particuli�rement bien all� (facile, rapide � �crire, lisible). Avec le principe du Visible=false, il va falloir g�rer le tout bien plus lourdement : garder un pointeur en m�moire sur l'ensemble des composants cr�es (des listes chain�s), effacer certains, en cr�er d'autres suivant ce qu'il y a � rafraichir... Bref, pas simple...

    Ne serait-il pas possible de contourner ce probl�me ? Puisque la destruction doit venir de l'ext�rieur, un syst�me message Windows ajout� dans la file des messages sur le OnClick/un gestionnaire d'�v�nement sur ce message qui ferait le rafraichissement, serait-il possible et �l�gant ?

    Merci encore.

  4. #4
    Membre Expert
    Avatar de Gilles Lou�se
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par d�faut
    Je comprends ce que vous voulez dire et j'ai eu un probl�me similaire. Pour ma part, je passe alors par le OnPaint de la Form principale li� � un flag. Je commence par d�clarer un flag de destruction dans la classe principale.

    J'initialise le flag dans la construction de la Form principale.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
    FlagDestroy=false;
    }
    Sur le clic du bouton, je rends le bouton invisible et je mets le flag � vrai.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    FlagDestroy=true;
    Button1->Visible=false;
    }
    Ceci a pour effet de forcer le OnPaint de la Form principale car le bouton dispara�t, il faut donc bien redessiner la Form sans le bouton. Dans ce OnPaint, je teste le flag. Si le flag est � true, je d�truis l'objet et je remets le flag � false.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
    if (FlagDestroy)
       {
       delete Button1;
       FlagDestroy=false;
       ShowMessage("Le bouton a été détruit");
       }
    }
    Dans un OnPaint normal, il ne se passe rien mais quand vous cliquez sur le bouton, le message s'affiche ce qui est la preuve que le bouton a bien �t� d�truit. Maintenant que vous �tes s�r que le bouton a �t� d�truit, vous enlevez �videmment le message.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
    if (FlagDestroy)
       {
       delete Button1;
       FlagDestroy=false;
       }
    }
    � bient�t
    Gilles

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    21
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Par d�faut
    C'est pas b�te du tout comme syst�me. Ca rejoint un peu ce � quoi je pensais (en ajoutant un message windows) mais en nettement plus simple.

    Merci beaucoup

    A bient�t.

  6. #6
    Membre chevronn� Avatar de nemo69500
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    639
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 639
    Par d�faut
    tu fais

    ou ce qui est mieux


+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Enregistrer un son � partir d'un bouton sur le guide
    Par fleurrouge dans le forum Interfaces Graphiques
    R�ponses: 3
    Dernier message: 29/06/2009, 17h56
  2. D�truire un bouton sur lequel on vient de cliquer
    Par gazier20 dans le forum Langage
    R�ponses: 13
    Dernier message: 15/12/2005, 22h33
  3. R�ponses: 2
    Dernier message: 15/06/2005, 23h56
  4. R�ponses: 3
    Dernier message: 09/12/2004, 11h49
  5. R�ponses: 8
    Dernier message: 02/06/2004, 17h54

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