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 VCL Delphi Discussion :

Détruire une Frame a partir d'un de ses boutons [FAQ]


Sujet :

Composants VCL Delphi

  1. #1
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Par défaut Détruire une Frame a partir d'un de ses boutons
    Tout est dans le titre du sujet.
    J'ai une frame qui a un bouton et je voudrais que quand je clique dessus la frame se détruise (Free).

    Je sais bien que ce n'est pas trés catholique, mais si il y avait une petite astuce pour faire cela....


    Cordialement.

  2. #2
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut Re: Détruire une Frame a partir d'un de ses boutons
    Citation Envoyé par rvzip64
    Tout est dans le titre du sujet.
    J'ai une frame qui a un bouton et je voudrais que quand je clique dessus la frame se détruise (Free).

    Je sais bien que ce n'est pas trés catholique, mais si il y avait une petite astuce pour faire cela....


    Cordialement.
    Salut!

    Un objet ne peut pas se détruire lui même. Si un bouton qui est membre d'une class tente de détruite l'objet duquel il fait partie tu vas avoir droit à des beaux Access Violation (puisque la procédure OnClick du bouton va tenter de se terminer APRÈS que l'objet ait été détruit et comme l'objet est détruit, l'espace mémoire de OnClick n'est plus disponible pour ton application).

    Lorsque que j'ai eu à faire quelque chose de semblable, j'ai utilisé un objet TObjetList que j'ai construit dans le parent de mon objet (dans ton cas, ça serait ta fiche qui contient le frame) en m'assurant que la propriété OwnsObjects de TObjectList soit à True.

    Ensuite, place dans l'ObjectList l'instance de ton frame (monObjectList.Add(monFrame)). Sur le click du bouton, au lieu de mettre monFrame.Free, mets monFrame.Visible := false.

    Enfin, à la destructiion de ta fiche, n'oublie pas de détruite ton ObjectList qui va alors détruire TOUS les frame qu'il va contenir.

    Je ne dis pas que c'est une solution miracle (ni qu'elle est optimisée pour tes besoins précis), mais elle fonctionne.

    Bon dev!

    -Slimjoe

  3. #3
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    c'est vrai c'est jamais joli les solutions pour faire ca

    une solution assez utilisée est:

    tu peux mettre un timer dans ton composant propriétaire dédié à cela
    qui est désactivé par défaut
    lorsque tu cliques sur le bouton, tu actives le timer (il faut qu'il soit accessible de puis la frame)
    puis dans le timer, tu détruits la frame et tu le désactives lui meme...

    un petit processmessage sur la frame avant de la fermer ne fait pas de mal aussi.

    mais si tu as une autre solution pour détruire ta frame du dehors de manière plus catholique, ce sera une meilleure solution

    bon courage !
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    La méthode Release n'est-elle pas indiquée dans ce cas ?

  5. #5
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Citation Envoyé par Laurent Dardenne
    La méthode Release n'est-elle pas indiquée dans ce cas ?
    Je ne crois pas qu'il y ait de Release sur un TFrame

    Mais un Release sur la fiche qui possède le frame par exemple pourrait probablement fonctionner....

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par slimjoe
    Je ne crois pas qu'il y ait de Release sur un TFrame
    Tu as raison j'ai dit une ânerie !

  7. #7
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 4
    Par défaut
    Moi j'emploie une méthode qui consiste à Poster un message à la fiche principale avec le Handle de la Frame en parametre.

  8. #8
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Par défaut
    C'est a dire picoti ???
    tu aurais un exmple a me donner s'il te plait ?

  9. #9
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 4
    Par défaut
    Dans l'evenement OnClick de la frame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PostMessage((Owner as TForm).Handle, WM_CLOSE_FRAME, 0, 0);
    Dans la fiche principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // ----------------- interface ------------------
    procedure WMCloseFrame(var msg: TMessage); message WM_CLOSE_FRAME;
    ...
    public
      ma_frame : TFrame;
     
    // -------------- implementation---------------
    ma_frame := TFrame.Create(self)
    ...
    procedure TForm1.WMCloseFrame(var msg: TMessage);
    begin
      FreeAndNil(ma_frame);
    end;

  10. #10
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 66
    Par défaut
    Salut,

    Il y a un tutoriel sur la gestion d'un systeme de fenetrage à base de frames sur Borland Code Central :
    Dynamic windowing system using frames (ENG & FR)
    http://cc.borland.com/Item.aspx?id=18798

    Ou sur mon site :
    http://www.xtralog.com/docs/delphi_frames.zip

    Didier

  11. #11
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Par défaut
    Merci tout le monde , je vais regarder ça et je vous tiens au courant.

  12. #12
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Par défaut
    Bon je regardé les exemplse, cela semble convenir a mon probleme

    Par contre , j ai un petit probleme qui se pose sur la procédure pour fermer le cadre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TFPrincipal.WMFermerCadre(var msg : TMessage);
    begin
    	FreeAndNil(select_frame);
    end;
    En effet , la l'exemple est simple, on affiche une seule frame a la fois,
    or , moi j en ai une bonne quantité.

    Ne serait il pas possible de renvoyer a travers le message le frame a détruire ?

  13. #13
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 66
    Par défaut
    Citation Envoyé par rvzip64
    Bon je regardé les exemplse, cela semble convenir a mon probleme

    Par contre , j ai un petit probleme qui se pose sur la procédure pour fermer le cadre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TFPrincipal.WMFermerCadre(var msg : TMessage);
    begin
    	FreeAndNil(select_frame);
    end;
    En effet , la l'exemple est simple, on affiche une seule frame a la fois,
    or , moi j en ai une bonne quantité.
    Rien n'empêche de créer un tableau ou une liste de frames.

    Citation Envoyé par rvzip64
    Ne serait il pas possible de renvoyer a travers le message le frame a détruire ?
    Rajoutes le Handle de la frame dans le parametre du message comme ça tu pourra le comparer aux frames existants.

  14. #14
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Par défaut
    Oui c'est une solution.
    Et a partir du Handle ce n est pas possible de détruire la frame, sans la comparait a celle stocké dans un tableau ?

  15. #15
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Par défaut
    Bon ta suggestion de tableau ma donnée une idée,j'ai pondu ça .
    Je suis pas sur que ça soit le mieux qui existe , mais c'est autonaume.

    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
     
    procedure TFPrincipal.WMFermerCadre(var msg : TMessage);
    var
      loop:integer;
    Begin
      for loop:=0 To Componentcount-1 do
      begin
        if Components[loop] is Twincontrol then
        begin
          if Twincontrol(Components[loop]).Handle=msg.WParam then
          begin
            Components[loop].Free;
          end;
        end;
      end;
    end;

  16. #16
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 66
    Par défaut
    Citation Envoyé par rvzip64
    Bon ta suggestion de tableau ma donnée une idée,j'ai pondu ça .
    Tout à fait, j'allais te suggérer de passer par Components[]
    :-)

    Bonne continuation avec les frames !

    Didier

  17. #17
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Par défaut
    C'est parfait merci a tous.

    Je suis preneur quand meme si vous avez une idée pour simplifier la procédure de destruction.

  18. #18
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 66
    Par défaut
    Citation Envoyé par DidiLogic Voir le message
    Salut,
    Il y a un tutoriel sur la gestion d'un systeme de fenetrage à base de frames sur Borland Code Central :
    Dynamic windowing system using frames (ENG & FR)
    Actualisation du lien :
    http://codecentral.embarcadero.com/Item/18798

  19. #19
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    J'ai codé un truc dans ce genre mais valable seulement si la frame est enfant de la fenêtre principale.
    Il suffit de faire un Close de l'application et le OnCloseQuery de la MainForm gère en vérifiant si la frame existe.
    Si oui, la frame est supprimée.
    Simple et pas cher. Et sans doute adaptable à des cas un peu plus compliqués

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/01/2008, 08h46
  2. Rafraichir une Frame a partir d'un lien ?
    Par sara21 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/05/2007, 18h24
  3. fermer une frame a partir d'une autre frame
    Par zekmek dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/10/2006, 13h31
  4. Récupérer adresse url d'une frame a partir d'une autre
    Par ok07 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 08/08/2006, 23h53
  5. [rechargement d'une frame mère à partir d'une frame fille]
    Par Lady_jade dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/12/2005, 11h02

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