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

Langage Delphi Discussion :

Erreur d'access violation à la fermeture d'une Fiche modale


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut Erreur d'access violation à la fermeture d'une Fiche modale
    Salut à tous,

    Dans une fiche MDIChild, j'appel une fiche en mode modale.
    Voici le code de la fiche modale:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
      TFrm_SAccessoire = class(TForm)
        Rz_tconso: TRzCheckTree;
        Label1: TLabel;
        Btn_ok: TRzBitBtn;
        Btn_cancel: TRzBitBtn;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Rz_tconsoStateChange(Sender: TObject; Node: TTreeNode;
          NewState: TRzCheckState);
      private
        FListConso: TStrings;
        procedure SetListConso(const Value: TStrings);
       { Déclarations privées }
      public
        { Déclarations publiques }
        property ListConso  : TStrings read FListConso write SetListConso;
        function Execute : Boolean;
      end;
     
    var
      Frm_SAccessoire: TFrm_SAccessoire;
     
    implementation
     
    {$R *.dfm}
     
    {-------------------------------------------------------------------------------
                                  PRIVATE
    --------------------------------------------------------------------------------}
    procedure TFrm_SAccessoire.SetListConso(const Value: TStrings);
    begin
      FListConso := Value;
    end;
    {-------------------------------------------------------------------------------
                                  PUBLIC
    --------------------------------------------------------------------------------}
    function TFrm_SAccessoire.Execute: Boolean;
    begin
      ShowModal;
      Result := ModalResult = mrOk;
    end;
    {-------------------------------------------------------------------------------
                                    EVENT HANDLER
    --------------------------------------------------------------------------------}
    procedure TFrm_SAccessoire.FormCreate(Sender: TObject);
    begin
      FListConso  := TStringList.Create;
    end;
    {------------------------------------------------------------------------------}
    procedure TFrm_SAccessoire.FormDestroy(Sender: TObject);
    begin
      FListConso.Free;
    end;
    {------------------------------------------------------------------------------}
    procedure TFrm_SAccessoire.Rz_tconsoStateChange(Sender: TObject;
      Node: TTreeNode; NewState: TRzCheckState);
    begin
      if (FListConso.IndexOf(Node.Text) <> -1) and (NewState = csunChecked) then
      begin
        FListConso.Delete(FListConso.IndexOf(Node.Text));
        if Not FListConso.Count > 0 then
          FListConso.Add('Aucun');
      end;
      if (ListConso.IndexOf(Node.Text) = -1) and (NewState = csChecked)then
      begin
        If FlistConso.IndexOf('Aucun') <> -1 then
          FListConso.Delete(FListConso.IndexOf('Aucun'));
        FListConso.Add(Node.Text);
      end;
    end;
    {------------------------------------------------------------------------------}
    En faites, j'ai un TrzCheckTree; et chaque fois que l'on coche ou décoche dedans, j'ajoute ou retire le caption coché/décoché
    maintenant voici mon code appelant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      With TFrm_SAccessoire.Create(Nil) do
      try
        ListConso   := Lb_axconso.Items;
        if Execute then
           Lb_axconso.Items.Text  := ListConso.Text;
       finally
        Release;
      end;
    Mais j'ai un message de violation d'accès à la sortie de ce code.
    D'où ma question, dois je effectuer un release sur la fiche modal ou le simple clic sur le bouton qui a le modal result à mrOk ferme la fiche.

    Merci de votre patience.

    Andry
    On progresse .....

  2. #2
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Le seul pb que je voie est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TFrm_SAccessoire.SetListConso(const Value: TStrings);
    begin
      FListConso := Value;
    end;
    Là tu ne "remplis" pas ta liste FListConso ; tu te contentes de faire pointer FListConso vers le TStrings désigné vers Value. Du coup, lorsqu'après ton Execute, tu fais la manoeuvre inverse... ça pourrait être l'orgine du pb.

    Il faudrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FListConso .Assign (Value);
    NB : Je ne garantis pas que ton pb vienne effectivement de là
    Roland

  3. #3
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Salut,

    D'après moi, il n'est pas nécessaire de mettre release.

    Si tu l'enlèves, tu as toujours la violation d'accès ?
    CV :
    - LinkedIn
    - Viadeo

  4. #4
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Citation Envoyé par yobenzen
    Salut,
    D'après moi, il n'est pas nécessaire de mettre release.
    Je dis peut-être une bêtise, mais je suis étonné de ta réponse. On vient de créer une instance de la fiche, en plus avec un Owner à nil. Qui va se charger de la libération de la mémoire ?
    Roland

  5. #5
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    J'ai déjà eu des erreurs biazrre avec Release et En remplaçant par Destroy (plus bourrin) ça marche... release attend en fait que tous les traitements de la fiche soient terminées avant de faire un Free... Alors que Destroy... détruit
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  6. #6
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Citation Envoyé par rsc
    Citation Envoyé par yobenzen
    Salut,
    D'après moi, il n'est pas nécessaire de mettre release.
    Je dis peut-être une bêtise, mais je suis étonné de ta réponse. On vient de créer une instance de la fiche, en plus avec un Owner à nil. Qui va se charger de la libération de la mémoire ?
    Non c'est moi...
    J'ai été un peu vite...
    En effet tu as raison.

    Il faudrait testé sans ou avec un Destroy seulement pour voir s'il s'agit d'un problème de composant qui ne serait pas déconnecté/fermé (comme des composants d'accès aux bases de données par exemple).
    Si cela ne fonctionne pas, alors il s'agirait d'un accès à un composant déjà supprimé...

    Je ne vois pas trop d'où la violation d'accès pourrait venir...
    CV :
    - LinkedIn
    - Viadeo

  7. #7
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Alors,
    J'ai modifié en consequence le code :
    1ère modification : plus d'appel à Release.
    2ème modification : utilisation de Assign.
    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
    17
    18
     
      With TFrm_SAccessoire.Create(Nil) do
      begin
        ListConso   := Lb_axconso.Items;
        if Execute then
        begin
        {
          Lb_axconso.Items.Text  := ListConso.Text;
        }
          Lb_axconso.Items.Assign(ListConso);//Lb_conso : TListBox
        end;
      end;
     
    procedure TFrm_SAccessoire.SetListConso(const Value: TStrings);
    begin
      {FListConso := Value}
      FListConso.Assign(Value);
    end;
    Bon là j'ai plus d'erreur de violation d'accès, mais un doute subsiste dans ma tête.
    S'il est vrai que l'assignation de ModalREsult à mrOk ou mrCancel detruit la fiche alors, l'erreur est bien justifié car j'essaie de detruire une deuxième fois FListConso dans release.
    L'aide de Delphi n'est pas très claire à ce sujet :
    Pour fermer une fiche modale,affectez une valeur non nulle àsa propriétéModalResult.
    Est ce que Fermer veut dire detruire ou juste rendre invisible.
    Pour le moment, ça marche et je teste en profondeur pour verifier.
    Je cloture pas le topic pour le moment.

    Andry
    On progresse .....

  8. #8
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Est ce que Fermer veut dire detruire ou juste rendre invisible.
    Non ! Dans la mesure où tu crées dynamiquement une fiche, il faut bel et bien que tu détruises toi-même ta fiche. Puisqu'il semble que Release (*) pose des problèmes, utilise Free ou Destroy.

    (*) De toutes façons, si je comprends bien l'aide, l'emploi de Release ne se justfie qu'à l'intérieur d'un gestionnaire d'événement (p.e. si tu veux détruire une fiche non modale dans son OnClose). Si je me tropme qqn peut-il me corriger ?
    Roland

  9. #9
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    rsc;

    Effectivement j'ai remodifier le code comme suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      With TFrm_SAccessoire.Create(Nil) do 
      try 
        ListConso   := Lb_axconso.Items; 
        if Execute then 
        begin 
        { 
          Lb_axconso.Items.Text  := ListConso.Text; 
        } 
          Lb_axconso.Items.Assign(ListConso);//Lb_conso : TListBox 
        end; 
      finally
         Free;
      end;
    et plus d'erreur de violation d'accès.
    C'est qui est bizarre c'est que j'ai deux autres fiches modales que j'utilise comme celle la, à l'exception près que les propriétés sont de types string ou integer que j'utilise avec release, mais j'ai pas d'erreur.
    L'erreur vient en faites donc de la destruction de la propriété de type TStrings.
    Bizarre.

    A+
    On progresse .....

  10. #10
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    J'ai tester plusieurs fois et n'as pas constaté de problème.
    Merci à vous tous.
    Je cloture le topic

    Bon dev
    On progresse .....

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

Discussions similaires

  1. [WD15] Erreur système : Access violation (GPF)
    Par itsanta dans le forum WinDev
    Réponses: 39
    Dernier message: 22/03/2012, 18h40
  2. Réponses: 1
    Dernier message: 10/02/2012, 11h20
  3. [Lieur Erreur] Fatal: Access violation. Link terminated.
    Par aiolia_aiolos dans le forum C++Builder
    Réponses: 8
    Dernier message: 29/07/2008, 12h25
  4. Réponses: 2
    Dernier message: 20/11/2007, 10h38
  5. Réponses: 2
    Dernier message: 19/04/2007, 14h30

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