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 :

delete Form créée dynamiquement


Sujet :

C++Builder

  1. #1
    J P
    J P est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 10
    Points : 10
    Points
    10
    Par défaut delete Form créée dynamiquement
    A partir d'une Form principale je cree un certain nombre de form dynamiquement que je stocke dans un tableau de pointeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form [N]=new TForm(This);
    Je fais sur ces Form un certain nombre de choses sans probleme
    Mais pour les detruire apres usage?
    elles doivent etres fermée a partir d'elles même avec un bouton Fermer
    Button On Click Close();
    Mais pour les detruire reellement
    ou mettre le delete Form[N]
    J'ai essaye de detourner l'evenement OnClose de mes fenetres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form[N]OnClose=FermerFenetre;
    Comme vu dans "Remarque de developpement "gestion de fenetres enfants de Gilles Louise
    Mais si cela fonctionne tres bien en cliquant sur la petite croix du menu
    Avec un bouton le programme va bien a la fonction "FermerFenetre"
    Detruit la form Et veut retourner a une Form qui n'existe plus

    Quelques tuyaux me rendraient bien service
    MERCI

  2. #2
    Membre habitué

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 137
    Points : 161
    Points
    161
    Par défaut
    C'est plutôt un problème de conception que tu as...

    Tu dois savoir quand tu n'as plus besoin d'une fenêtre et à ce moment là la détruire. Une fenêtre fermé ne veut pas dire qu'elle doit être forcement détruite.

    En tout cas, tu ne peux pas les détruire dans l'évenement OnClose... sinon ça fait boom.

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Normalement il suffit de la fermer :

    Ajouter dans la OnClose de la fenêtre (donc prévoir une méthode ad hoc) :

    La fenêtre est libérée sans faire de delete.

    Si besoin est, on peut rajouter un flag pour déterminer si la fenêtre
    doit effectivement être libérée, cachée ou réduite... ici... ????
    Il faut dans ce cas gérer Action (voir l'aide pour TForm::OnClose)

    A plus !

  4. #4
    Nouveau membre du Club

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Points : 35
    Points
    35
    Par défaut delete Form créée dynamiquement
    Bonjour à tous

    JP a dit
    A partir d'une Form principale je cree un certain nombre de form dynamiquement que je stocke dans un tableau de pointeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form [N]=new TForm(This);
    Je fais sur ces Form un certain nombre de choses sans probleme
    Mais pour les detruire apres usage?
    elles doivent etres fermée a partir d'elles même avec un bouton Fermer
    Button On Click Close();
    Mais pour les detruire reellement
    ou mettre le delete Form[N]

    Henderson a répondu :
    Normalement il suffit de la fermer :

    La fenêtre est libérée sans faire de delete.
    Doit-on comprendre que la fenêtre créée dynamiquement aura ainsi été
    supprimée d'une TList dans laquelle on aura pu mettre son adresse, ou du tableau de pointeur de JP?

  5. #5
    J P
    J P est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Apparement Action =cafree ne semble pas libere la memoire pour des fiches crées dynamiquement.(Controle de la memoire utiliséé du pc ne bsisse pas a chaque fermeture)
    D'autre part si dans mon prog principal je refais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form[N]->Visible=true;
    Elle réapparait bien et est toujours active.
    En attendant a chaque fermeture de fiche je tiens a jour un tableau de fiches toujours utliles et je profite du passage dans un autre evenement de la fiche principale pour faire le delete des Forms inutiles et liberer des places dans mon tableau de pointeurs.(et de la memoire)
    Si quelqu'un a une "solution plus propre" Je suis pret a tester toutes les idées
    MERCI

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Pourtant chez moi ça fonctionne bien, dans la mesure où j'ai une violation d'accès
    lorsque je tente d'ouvrir l'une des fenêtres qui a été supprimée.

    Voici comment j'ai procédé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TForm *AForms[2];
    TSpeedButton *CloseButton;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    //Creation de deux fenêtres
    AForms[0] = Creerform();
    AForms[1] = Creerform();
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TForm* __fastcall TForm1::Creerform()
    {
    TForm *F = new TForm(Owner);
    F->SetBounds(10,10, 210, 210);
    F->OnClose = FormClose;
    CloseButton = new TSpeedButton(F);
    CloseButton->Parent = F;
    CloseButton->SetBounds(50,50, 80, 23);
    CloseButton->OnClick = CloseWindow;
    return F;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    //Ici je ne fais rien d'autre...
    Action = caFree;
    }
    Chacun des Speedbuttons pour la libération de la fenêtre utilise la même méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::CloseWindow(TObject *Sender)
    {
    TForm *F = (TForm *)((TSpeedButton*)Sender)->Owner;
    F->Close();
    }
    La form principale dispose de 2 Speedbuttons pour faire apparaître les deux forms créées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    AForms[0]->Show();    
    }
     
    void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
    {
    AForms[1]->Show();
    }
    A plus !

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    S'il y a quelque chose à faire suite à la fermeture, alors ça peut être fait dans la OnClose !

    Pour le test, je n'ai rien fait allant dans ce sens pour être sûr de provoquer la violation
    d'accès et montrer ainsi que la form est bien libérée.

    En affectant NULL aux pointeurs, j'aurais eu cette même violation d'accès mais sur le NULL
    et non pas suite à la libération de la form à cause d'une adresse vers un bloc mémoire invalide
    du fait de sa libération.

    A plus !

  8. #8
    J P
    J P est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Effectivement avec Action=caFree cela marche OK
    Hier soir j'avais du un peu me perdre dans mon code Mais ce matin tout est OK


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Form[N]->OnClose=FermerFiche; 
     
     
     
    void __fastcall TForm1::FermerFiche(TObject *Sender,TCloseAction &Action= 
    { 
    Action=caFree; 
    }
    Et tout est Ok

    Merci beaucoup
    JP


    Par contre des problemes pour trouver la balise [Resolu]
    En bas a gauche est dit dans les regles du forum. Mais.........
    Avec mes excuses.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Pour résolu... c'est fait !
    A plus !

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

Discussions similaires

  1. OpenGl rendering dans une form créée dynamiquement
    Par hey_monkey dans le forum Débuter
    Réponses: 5
    Dernier message: 14/12/2011, 12h07
  2. Identifier les form crées dynamiquement
    Par Coussati dans le forum Langage
    Réponses: 3
    Dernier message: 27/12/2009, 19h24
  3. Parcourir les elements d'une ligne crée dynamiquement dans un FORM
    Par redabadache3 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/12/2008, 15h30
  4. Réponses: 5
    Dernier message: 20/09/2007, 18h53
  5. [Excel] Charger une form créée dynamiquement dans un autre classeur
    Par spileo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/02/2007, 12h58

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