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

Delphi Discussion :

Un contrôle visuel peut-il s'auto-détruire


Sujet :

Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut Un contrôle visuel peut-il s'auto-détruire
    Je crée dynamiquement un bouton tout simple 'Button1'.

    Lorsqu'on clique dessus, j'accomplis certaines actions, et finalement je voudrais le détruire.

    Si je termine le gestionnaire 'Onclick' par un 'Button1.free', il y a plantage ce qui peut paraître normal.
    Est-ce que je peux faire autrement?

  2. #2
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Il faut impérativement détruire le bouton après que tout le code du bouton ait été effectué, ce qui inclut l'évènement OnClick et ce qu'il y a encore après (dans le code source de TButton). Sinon, il y a exécution d'un code sur une instance qui n'existe plus, d'où le plantage.

    Solution 0 : pourquoi détruire le bouton, alors qu'il suffit de le rendre invisible en mettant sa propriété visible à false ?

    Solution 1 : écrire un gestionnaire Application.OnIdle (voir doc). Dans ce getstionnaire, tester une valeur booléenne, si elle est true, détruire le bouton et mettre la valeur à false. Dans le gestionnaire OnClick, mettre la valeur booléenne à true pour prévenir l'application qu'elle devra détruire le bouton.

    Solution 2 : Envoyer un message personnalisé à la fiche (avec PostMessage), associé à un gestionnaire de la fiche qui détruira le bouton. Normalement le code devrait être exécuté après retour du code-bouton.

  3. #3
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    Citation Envoyé par CapJack
    Il faut impérativement détruire le bouton après que tout le code du bouton ait été effectué, ce qui inclut l'évènement OnClick et ce qu'il y a encore après (dans le code source de TButton). Sinon, il y a exécution d'un code sur une instance qui n'existe plus, d'où le plantage.

    Solution 0 : pourquoi détruire le bouton, alors qu'il suffit de le rendre invisible en mettant sa propriété visible à false ?

    Solution 1 : écrire un gestionnaire Application.OnIdle (voir doc). Dans ce getstionnaire, tester une valeur booléenne, si elle est true, détruire le bouton et mettre la valeur à false. Dans le gestionnaire OnClick, mettre la valeur booléenne à true pour prévenir l'application qu'elle devra détruire le bouton.

    Solution 2 : Envoyer un message personnalisé à la fiche (avec PostMessage), associé à un gestionnaire de la fiche qui détruira le bouton. Normalement le code devrait être exécuté après retour du code-bouton.
    entièrement d'accord !

    sinon avec une form, il y a la méthode Release qui permet de détruire la form par elle même. je me suis donc penché un peu sur les sources (unité Forms) et j'ai constaté que CapJack avait pratiquement deviné comment la VCL l'implémente, il s'agit d'un postmessage vers la form elle même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TCustomForm.Release;
    begin
      PostMessage(Handle, CM_RELEASE, 0, 0);
    end;
    couplée à un gestionnaire pour le message CM_RELEASE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
        procedure CMRelease(var Message: TMessage); message CM_RELEASE;
    ...
    procedure TCustomForm.CMRelease;
    begin
      Free;
    end;
    et le tour est joué.
    alors une autre piste de solution serait de te créer un bouton à toi (héritant de TButton) qui implémenterais cette fameuse méthode Release, exactement comme pour TCustomForm.

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut
    Merci pour vos réponses très claires et bien documentées.
    Je vais essayer tout cela.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/05/2013, 08h44
  2. [BCB2007] Gestion des contrôles visuels
    Par Teaniel dans le forum C++Builder
    Réponses: 2
    Dernier message: 02/07/2010, 10h00
  3. Contrôle intra\extranet pour redirection auto
    Par Dr.Wily dans le forum Débuter
    Réponses: 9
    Dernier message: 04/03/2009, 12h43
  4. Réponses: 6
    Dernier message: 10/06/2008, 16h55
  5. Un Sender peut-il s'auto-détruire lors d'un onClick?
    Par Flo. dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/07/2002, 10h31

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