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 :

Violation access lors de la suppression (free) d'un TabSheet créé dynamiquement


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Par défaut Violation access lors de la suppression (free) d'un TabSheet créé dynamiquement
    Bonjour,
    J'ai un probleme dans mon code et malgré les innombrables messages de forum indiquant le même problème que moi, je n'ai pas réussi à corriger le bug.
    Je vous le soumets donc :

    Je crée des TabSheet dynamiquement dans un PageControl1 et l'utilisateur, en cliquant sur le bouton BSupprimer (créé dynamiquement lui aussi dans chaque TabSheet) peut supprimer celui la.
    La suppression du tabsheet actif fonctionne, mais a la fin de la fonction, j'obtiens un Access Violation.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TFDonneesMissions.BSupprimerOnclick(Sender: TObject);
    var
        i:integer;
    begin
    if Pagecontrol1.PageCount<>0 then
                    begin
                    showmessage('etape_1');
                    i:=PageControl1.ActivePage.PageIndex;
                    PageControl1.ActivePage.Free;
                    PageControl1.ActivePageIndex  :=(i-1);
    showmessage('etape_2');
    end;
    Je vois bien mes 2 messages etape_1 et etape_2, et lors de étape_2, mon TabSheet a bien disparu. Tout est parfait, mais dès que je clique sur Ok du showmessage, j ai un access violation.
    Cet access violation n'apprait pas si j'enleve le PageControl1.ActivePage.Free;

    Savez vous d'ou cela vient et comment je peux faire pour que ca tourne sans probleme?
    Merci beaucoup pour votre aide.
    Julie

  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
    Salut!

    Si le bouton supprime le tabsheet qui, lui, supprime le bouton, il est normal que ça plante. Un objet ne peut pas se détruire lui même. La raison est qu'une fois l'objet détruit, l'application doit terminer d'exécuter la méthode qui a effectué la destruction et comme celle-ci a été libérée par la destruction de l'objet auquel elle appartenait, ton application tente d'accéder à de la mémoire à laquelle il n'a plus droit. PAF! Access violation!

    Le truc est simple : si tu créés dynamiquement ton bouton, ne passe pas le TabSheet en paramètre du constructeur mais passe un objet dont la durée de vie n'est pas en lien avec le bouton (TButton.Create(self) par exemple). Comme ça, quand le TabSheet va se détruire, il ne détruira pas le bouton.

    Bon dev!

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Par défaut
    Salut,
    Merci pour ta réponse.
    Je n'avais pas du tout pensé a ce que tu me dis (à cette histoire que je supprime mon bouton en meme temps que mon TabSheet).
    Très bonne remarque, elle me servira a partir de maintenant dans mes creation dynamique

    Mais dans mon code de creation de bouton, je le mets deja en self :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Bsuppr:=TBitBtn.create(self);
    Bsuppr.name:='BSupprimer'+inttostr(FDonneesMissions.PageControl1.PageCount-1);
    Bsuppr.left:=270;
    Bsuppr.top:=12*40;
    Bsuppr.Width:=150;
    Bmp := TBitmap.Create;
    Bmp.LoadFromFile('icones/icone_supprimer2.bmp');
    Bsuppr.Glyph:= Bmp;
    Bsuppr.caption:='Supprimer cette mission';
    Bsuppr.parent:=FDonneesMissions.PageControl1.Pages[FDonneesMissions.PageControl1.PageCount-1];
    Bsuppr.onclick:=FDonneesMissions.BSupprimerOnclick;
    Le probleme vient surement de mon parent qui prend le tabSheet comme paramètre, mais s il ne le prend pas, comment puis faire apparaitre mon bouton BSuppr dans mon onglet?

    Merci

  4. #4
    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
    Tu as raison j'ai des Abstract Error quand je tente de supprimer le parent du bouton (le TabSheet).

    J'ai réglé le problème (c'est plus un patch qu'une solution en fait) en changeant le Parent du bouton pour self et en rendant ce dernier invisible avant la suppression.

    Bon dev!

  5. #5
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Par défaut
    Citation Envoyé par slimjoe
    Tu as raison j'ai des Abstract Error quand je tente de supprimer le parent du bouton (le TabSheet).

    J'ai réglé le problème (c'est plus un patch qu'une solution en fait) en changeant le Parent du bouton pour self et en rendant ce dernier invisible avant la suppression.

    Bon dev!

    Salut,
    J ai essayé, mais si je mets parent a self, mon bouton n apparait pas dans mon TabSheet. Et si je change le parent juste avant de supprimer le bouton, j ai qd meme mon access violation (meme en mettant le bouton.visible a false).
    Une autre idee s il vous plait?

    Merci !
    @ toute

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    la solution pour s'autodetruire est de passer par les message
    le sujet a deja ete maintes fois aborder

    @+ Phil

    PS :voir ici

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/09/2011, 17h12
  2. [AC-2003] Plantage access lors de la suppression
    Par Don_guichotte dans le forum Access
    Réponses: 1
    Dernier message: 30/10/2009, 09h31
  3. Réponses: 1
    Dernier message: 09/07/2005, 18h16
  4. Probleme lors d'une suppression
    Par DrTank dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/04/2005, 17h38
  5. Combler les trous lors d'une suppression dans une table
    Par Billybongjoe dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 08/04/2004, 14h02

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