1. #1
    Membre averti
    Inscrit en
    juin 2012
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 229
    Points : 363
    Points
    363

    Par défaut TApplication.HandleException Access violation Incompréhensible

    Bonjour,

    J'ai modifié un programme compilé avec des versions plus anciennes de Lazarus avec la 1.6.2 et je m'en mords les doigts, le problème exposé ci-dessous survient tout autant avec la 1.6.4 et le svn du jour de la 1.6.8:

    J'ai cette fonction:

    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
     
    Function PopUp_Yes_No (   FWin:TForm; Mess:String ):Boolean;
     
    Begin
    //showmessage('1');
      FPopup_Yes_No:=TFPopup_Yes_No.Create(NIL);  // Créer une fenetre de confirmation Oui/Non.
    //showmessage('2');
      FPopup_Yes_No.Top:=FWin.Top+((FWin.Height-FPopup_Yes_No.Height) div 2);
      FPopup_Yes_No.Left:=FWin.Left+((FWin.Width - FPopup_Yes_No.Width) div 2);
     
      With FPopup_Yes_No do begin                  // Positionner la fenêtre popup.
        L_Mess.Caption:=Mess;
        ShowModal;
        result:=SB_OK.Tag=1;
        free;
      end;
    end;
    Tant qu'elle est utilisée seule ça marche mais lorsque je lui fait un appel avant d'utiliser celle-ci:

    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
     
      Procedure Set_PopUp_Export_Dbf ( W_Parent:TForm; T_Name:String; Typ_Export:Integer);        // Pop up radio boutons pour export DBF.
     
    Begin
      F_Popup_Rb:=TF_Popup_Rb.Create(NIL);      // Créer une fenetre de radio boutons avec les options de conversion de chaines.
     
      With F_Popup_Rb do begin                  // Positionner la fenêtre popup pour les options d'export.
        Top:=W_Parent.Top+20;;
        Left:=( W_Parent.Left+(W_Parent.Width div 2)-(F_Popup_Rb.Width div 2));
        Top:=(W_Parent.Top+(W_Parent.Height div 2)-(F_Popup_Rb.Height div 2));
        Width:=229;
        L_Table.Caption:=T_Name;
        Caption:='Exporte vers ';
     
        case Typ_Export of
          0: Begin
            With F_Popup_Rb.RG_PopUp do begin   // Initialiser popup pour export DBF.
              L_Table.Caption:=L_Table.Caption+' => DBF';
              Caption:='Options Export';
              Items.Add('Abandonner');
              Items.Add('Ajouter dans la table');
              Items.Add('Remplacer la Table');
              ItemIndex:=0;
              Rg_PopUp_Memo.visible:=False;
             end;
          end;
          1: Begin
            With F_Popup_Rb.RG_PopUp do begin   // Initialiser popup pour export DBF.
              L_Table.Caption:='';
              Caption:='Options';
              Items.Add('Choisir et ouvrir');
              Items.Add('Choisir et copier');
              Items.Add('Choisir et déplacer');
              Items.Add('Copier tout');
              Items.Add('Déplacer tout');
              Items.Add('Abandonner');
              ItemIndex:=0;
              Rg_PopUp_Memo.visible:=False;
             end;
           end;
          2:Begin
            With F_Popup_Rb.RG_PopUp do begin
            L_Table.Caption:=L_Table.Caption+' => CSV';
              Items.Add('Pas de conversion');
              Items.Add('UTF8 => Ansi');
              Items.Add('UTF8 Encode');
              Items.Add('UTF8 Decode');
              Items.Add('ANSI => Utf8');
              ItemIndex:=0;
            end;
          end;
        end;
      end;
    end;       // Note:  Le free est à la fin de la fonction d'export.
    Et que je l'appelle à nouveau pour demander si les fiches exportées doivent être effacées de la table d'origine j'ai ça dans le terminal au moment du create. même chose si je fais un if assigned ():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    TApplication.HandleException Access violation
      Stack trace:
      $00000000004D2A6D
      $000000000081EE53
      $00000000008B5CA8
      $00000000008248F3
      $0000000000505854
      $00000000005060AA
      $000000000042229F
      $0000000000567855
      $0000000000675C41
    Et je ne me l'explique pas du tout ? Je suis toujours en FPC 3.0.0 mais je ne pense pas que ça vienne de là.

  2. #2
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 281
    Points : 559
    Points
    559

    Par défaut

    Salut, as tu essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FPopup_Yes_No:=TFPopup_Yes_No.Create(FWin);
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FPopup_Yes_No:=TFPopup_Yes_No.Create(NIL);
    FPopup_Yes_No c'est une variable publique ? dans l'interface ? ou dans l'implémentation

    Vu que le 2eme fonctionne et que ton free est ailleurs du coup, essayes aussi ça, en sortant le free du with..do et en utilisant FreeAndNil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     With FPopup_Yes_No do begin                  // Positionner la fenêtre popup.
        L_Mess.Caption:=Mess;
        ShowModal;
        result:=SB_OK.Tag=1;    
      end;
      FreeAndNil(FPopup_Yes_);
    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  3. #3
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 996
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 996
    Points : 8 187
    Points
    8 187

    Par défaut

    Salut,

    je ne sais pas si ça a un rapport, mais moi j'en avais marre de voir traîner, dans mes codes, des choses comme //tmpBmp.Free; // AV garanti si décommenté malgré "if Assigned" dans le Close plus le fait qu'on peut lire tout et n'importe quoi à propos de Free, FreeAndNil, etc., sur le web, alors j'ai récemment pris le taureau par les cornes et je l'ai retourné (le web, pas le taureau, ) de fond en comble et... j'ai trouvé un tuto sympa avec une partie très intéressante, vers le milieu, juste avant "Declaring your own Classes" et ça donne ça (testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var
      bs:TBytesStream;
    begin
      bs := nil; //!\ /!\ /!\  LE truc ! avant Create /!\ /!\ /!\
    Autre exemple (notez mes commentaires) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    begin
      //if Assigned(tmpBmp) then  <-- ça vaut rien ce truc
      if tmpBmp <> nil then  //!\ /!\ /!\ Yes /!\
      try
        PaintBox1.Canvas.Draw(0,0, tmpBmp);
      finally
        //
      end;
    end;
    Voilà,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 407
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 407
    Points : 8 973
    Points
    8 973

    Par défaut

    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if Assigned(tmpBmp) then  <-- ça vaut rien ce truc
    if tmpBmp <> nil then  //!\ /!\ /!\ Yes /!\
    Ces deux lignes sont parfaitement identiques et la suite du code échouera la même chose si tmpBmp est dans les choux...

    Assigned est obligatoire par contre sur les variables procédurales puisque func <> nil reviendrait à tester le retour de la fonction (pour autant que ça compile bien sûr, que ce soit une fonction retournant un pointeur sinon Erreur : type incompatible).

    Pour le problème de mm_71, il faudrait voir ce qu'il y a dans les OnCreate/OnDestroy des deux fiches.

  5. #5
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 996
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 996
    Points : 8 187
    Points
    8 187

    Par défaut

    Citation Envoyé par Andnotor Voir le message
    Ces deux lignes sont parfaitement identiques et la suite du code échouera la même chose si tmpBmp est dans les choux...
    Cette réponse me laisse à penser que tu n'as pas (ou à peine) lu le lien que j'ai fourni. J'en reprends donc un tout petit bout (et j'y mets deux lignes en couleur et 2 mots en gras) :

    Before freeing the object’s memory, Free first ensures the object is not nil.
    Does this mean that the following will work ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          Var
            Student1 : TStudent;
          Begin
            // Forgot to instantiate TStudent
            Student1.Free;
    The answer depends upon the value of Student1 when the call to Free is made.
    Is Student1 nil? No.
    In Delphi, variables are not given initial values – the actual value of Student1 depends upon what is on the processor stack in the location occupied by Student1 when the routine is called.
    Now, the following will work
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          Var
            Student1 : TStudent;
          Begin
            Student1 := Nil;
     
            // Forgot to instantiate TStudent
            Student1.Free;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre averti
    Inscrit en
    juin 2012
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 229
    Points : 363
    Points
    363

    Par défaut


    Salut, as tu essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FPopup_Yes_No:=TFPopup_Yes_No.Create(FWin);
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FPopup_Yes_No:=TFPopup_Yes_No.Create(NIL);

    FPopup_Yes_No c'est une variable publique ? dans l'interface ? ou dans l'implémentation
    C'est une fiche indépendante:

    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
    unit popup_yes_no;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Forms,  Buttons, StdCtrls;
     
    type
     
      { TFPopup_Yes_No }
     
      TFPopup_Yes_No = class(TForm)
        L_Mess: TLabel;
        SB_Cancel: TSpeedButton;
        SB_OK: TSpeedButton;
        procedure B_CancelClick(Sender: TObject);
        procedure B_OkClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end; 
     
    var
      FPopup_Yes_No: TFPopup_Yes_No;
     
    implementation
     
    { TFPopup_Yes_No }
    procedure TFPopup_Yes_No.FormShow(Sender: TObject);
    begin
      SB_OK.Tag:=0;
    end;
     
    procedure TFPopup_Yes_No.B_OkClick(Sender: TObject);
    begin
      SB_Ok.Tag:=1;
      Close;
    end;
     
    procedure TFPopup_Yes_No.B_CancelClick(Sender: TObject);
    begin
      SB_Ok.Tag:=-1;
      Close;
    end;
     
    initialization
      {$R *.lfm}
     
    end.
    Et je l'utilise quand nécessaire en l'ajoutant dans la close use des fiches concernées. ( Je fais pareil pour toutes les fenêtres annexes du programme histoire de ne pas bourrer la mémoire).

    Vu que le 2eme fonctionne et que ton free est ailleurs du coup, essayes aussi ça, en sortant le free du with..do et en utilisant FreeAndNil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     With FPopup_Yes_No do begin                  // Positionner la fenêtre popup.
        L_Mess.Caption:=Mess;
        ShowModal;
        result:=SB_OK.Tag=1;    
      end;
      FreeAndNil(FPopup_Yes_);
    A+
    J'ai essayé les deux mais c'est pareil. Mais je me suis peut-être mal exprimé. Le popup fonctionne parfaitement partout SAUF dans l'exportation de fichier. Le cycle est le suivant:

    Popup_Yes_no => Oui OK
    Pop_Up du choix du mode d'export => OK
    Exportation des fichiers => OK
    Retour sur Popup_Yes_no pour demander si on efface les fiches originelles => Crash au moment de le créer.

    Si je répond non au moment de l'export popup_yes_no se ferme et se rouvre autant de fois que je veux. C'est dans le parcours de l'export qu'il se passe quelque chose qui me plante.

  7. #7
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 449
    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 : 2 449
    Points : 3 850
    Points
    3 850

    Par défaut

    salut

    bon à savoir pour les fenêtres, il faut préférer release que free ... le release attend la fin des message pour ce fermer
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Membre averti
    Inscrit en
    juin 2012
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 229
    Points : 363
    Points
    363

    Par défaut

    Bon...

    Je progresse mais je n'y comprend rien ! On dirait qu'il y-a un os dans les clauses 'uses, j'essaye d'expliquer:

    Toutes les fonctions répétitives sont dans des fiches indépendantes.
    La fenêtre principale qui reste omniprésente à donc dans sa clause uses 'fonctions_standard' cette dernière ayant 'popup_yes_no' dans son uses
    Donc normalement chaque fiche ayant 'fonctions_standard' dans son uses doit aussi trouver implicitement popup_yes_no ce qui est d'ailleurs toujours le cas.
    MAIS !!! La fiche 'fonctions_dbf_delete' ( Aussi dans le uses de la fenêtre principal pose un problème incompréhensible pour moi. Elle à comme les autres 'fonctions_standard' dans son uses et toutes ses fonctions ayant un appel à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ((isdeleted) or ( PopUp_Yes_No( FWin, 'Supprimer cette fiche ?'))) Then
    Fonctionnent parfaitement sauf un qui provoque le crash.
    Pour voir je rajoute 'PopUp_Yes_No' dans le uses de 'fonctions_dbf_delete', du coup toutes les appels à popup_yes_no doivent devenir fonctions_standard.popup_yes_no ??? Et le crash est toujours la !
    Dans la fonction incriminée je remplace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (fonctions_standard.PopUp_Yes_No (FWin, cMess ) )Then begin
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //ShowMessage(IntToStr(FWin.Top));
      FPopup_Yes_No:=TFPopup_Yes_No.Create(FWin);  // Créer une fenetre de confirmation Oui/Non.
    //  FPopup_Yes_No.Top:=FWin.Top+((FWin.Height-FPopup_Yes_No.Height) div 2);
    //  FPopup_Yes_No.Left:=FWin.Left+((FWin.Width - FPopup_Yes_No.Width) div 2);
      With FPopup_Yes_No do begin 
        L_Mess.Caption:=cMess;
        ShowModal;
        Confirm:=SB_OK.Tag=1;
        free;
      end;
    Et ici surprise ! Le popup fonctionne mais fwin.top et consorts provoquent l'accès violation alors qu'il passe très bien dans toutes les autres fonctions.
    L'apel est fait comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DelAll_InDBF(FBouq_Select_01,  MyDbf, NIL, IntToStr(NbExport)+
                                  ' Enregistrements exportés'+chr(10)+chr(13)+
                                   'Effacer les enregistrements exportés ?');
    Et voici ce qui précède l'appel au pop_up:
    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
     
    Procedure DelAll_InDBF (FWin:TForm; Dbf1:TDbf; Dbg1:TDBGrid;cMess:String );
    var
      i:Integer;
      StatRO: Boolean;
      Confirm, S_Del:Boolean;
      NbToDel:String;
    Begin
      If cMess='' then begin
        if (Assigned(Dbg1)) AND (Dbg1.SelectedRows.Count>0) then NbToDel:=IntToStr(Dbg1.SelectedRows.Count)
        else NbToDel:=IntToStr(dbf1.ExactRecordCount);
        cMess:='Supprimer les '+NbToDel+' enregistrements'+chr(10)+chr(13)+'sélectionnés ?';
      end;
     
    //ShowMessage(IntToStr(FWin.Top));
    Ce n'est quand même pas le if assigned qui ferait tout planter ??????
    Je nage dans un océan de perplexité et je vais déposer mes neurones au congel pour qq. heures.

  9. #9
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 996
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 996
    Points : 8 187
    Points
    8 187

    Par défaut

    Citation Envoyé par mm_71 Voir le message
    Ce n'est quand même pas le if assigned qui ferait tout planter ??????
    Oui et non : comme je l'ai expliqué et vécu, et comme je te le reproduis, regarde, ça surprend :

    Nom : bmp_free_assigned.png
Affichages : 47
Taille : 18,5 Ko

    Par contre, en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      bmp := TBitmap.Create;
    //  bmp.Free;
      FreeAndNil(bmp);
      if assigned(bmp) then ShowMessage('bmp assigné !');
    le ShowMessage n'apparait plus.

    Mais si je fais le truc idiot suivant, pensant être protégé [?] par le assigned :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      bmp.Free;
      if assigned(bmp) then begin
        ShowMessage('bmp assigné !'); // vu
        bmp.Width:=12345; // paf ! SIGSEGV
      end;
    Paf !
    Je pense que tu as une embrouille dans ce genre-là.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 449
    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 : 2 449
    Points : 3 850
    Points
    3 850

    Par défaut

    salut

    c'est un classique ... le système ne vide pas l'espace mémoire après le free
    plusieurs cause peuvent en être la cause
    - le traitement du message un peu long
    - une erreur muette dans les ancêtre qui annule la libération de l'instance
    - le descendant qui a coupé héritage de la destruction

    le freeandnil est utilisé a bonne escient ici
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  11. #11
    Membre averti
    Inscrit en
    juin 2012
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 229
    Points : 363
    Points
    363

    Par défaut

    Je pense que tu as une embrouille dans ce genre-là.
    Je ne sais pas trop puisque mon if assigned concerne une table de BDD théoriquement sans rapport avec une fenêtre. Dans ton exemple il me semble ( Ça me dépasse un peu quand même ) que free libère l'emplacement mémoire du bmp mais conserve l'adresse de son emplacement donc il reste assigné et dans ton troisième exemple tu vas chercher une valeur dans un emplacement vide alors que freeandnil liquide tout.

  12. #12
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 281
    Points : 559
    Points
    559

    Par défaut

    Citation Envoyé par mm_71 Voir le message
    Et voici ce qui précède l'appel au pop_up:
    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
     
    Procedure DelAll_InDBF (FWin:TForm; Dbf1:TDbf; Dbg1:TDBGrid;cMess:String );
    var
      i:Integer;
      StatRO: Boolean;
      Confirm, S_Del:Boolean;
      NbToDel:String;
    Begin
      If cMess='' then begin
        if (Assigned(Dbg1)) AND (Dbg1.SelectedRows.Count>0) then NbToDel:=IntToStr(Dbg1.SelectedRows.Count)
        else NbToDel:=IntToStr(dbf1.ExactRecordCount);
        cMess:='Supprimer les '+NbToDel+' enregistrements'+chr(10)+chr(13)+'sélectionnés ?';
      end;
     
    //ShowMessage(IntToStr(FWin.Top));

    Ce n'est quand même pas le if assigned qui ferait tout planter ??????
    Je nage dans un océan de perplexité et je vais déposer mes neurones au congel pour qq. heures.

    Elle ou la partie qui t'affiches ta boite de dialogue ici ???? parce que là en appelant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DelAll_InDBF(FBouq_Select_01,  MyDbf, NIL, IntToStr(NbExport)+
                                  ' Enregistrements exportés'+chr(10)+chr(13)+
                                   'Effacer les enregistrements exportés ?');
    C'est sure tu ne verras rien.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  13. #13
    Membre averti
    Inscrit en
    juin 2012
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 229
    Points : 363
    Points
    363

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Elle ou la partie qui t'affiches ta boite de dialogue ici ???? parce que là en appelant

    C'est sure tu ne verras rien.
    Elle suit juste après ces lignes, et comme dit plus haut ce n'est pas que je ne vois rien c'est que ça provoque un crash inexplicable. J'ai enfin trouvé le responsable, je passe en paramètre l'objet FORM de ma fiche principale dans la variable fWin pour aligner les popups en fonction de la taille et position de cette fenêtre principale.
    Et ce qui ne va pas c'est que dans un seul et unique ensemble de fonctions qui me servent à exporter fWin perd les pédales quelque part et un bête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    showmessage ( inttostr ( fWin.top))
    Me fait une erreur de handle avec violation access. Et comme je n'arrive pas à trouver le point précis ou ça se produit dans tout mon fouillis de fonctions je vais gagner du temps en réécrivant mes pop ups sous une autre forme.

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 407
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 407
    Points : 8 973
    Points
    8 973

    Par défaut

    Citation Envoyé par Jipété Voir le message
    Is Student1 nil? No. Maybe !
    In Delphi, variables are not given initial values – the actual value of Student1 depends upon what is on the processor stack in the location occupied by Student1 when the routine is called.
    Et pour illustrer cette dernière phrase :
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Proc1;
      Proc2;
    end;
     
    procedure TForm1.Proc1;
    var
      Obj1 :TObject;
    begin
      Obj1 := nil;
    end;
     
    procedure TForm1.Proc2;
    var
      Obj2 :TObject;
    begin
      //Pas de VA, Obj2 utilise le même emplacement que Obj1 mis à nil précédemment
      Obj2.Free;
    end;
    Sinon, j'ai effectivement parcouru cet article en diagonale (et encore) mais quand je vois ceci :

    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
    Var
      Student1 : TStudent;
      StringListl : TStringList;
     
    Begin
      Student1 := Nil;
      StringList1 := Nil;
     
      Try 
        StringListl := TStringList.Create;
        Student1 := TStudent.Create;
        // Work with Student1 & StringList1
      Finally
        Student1.Free;
        StringList.Free;
      End
    je me dis que le gars n'a pas tout compris ou est un gros flemmard
    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
    Begin
      StringListl := TStringList.Create;
     
      Try 
        Student1 := TStudent.Create;
     
        Try 
          // Work with Student1 & StringList1
        Finally
          Student1.Free;
        End  
     
      Finally
        StringList.Free;
      End
    Citation Envoyé par mm_71 Voir le message
    Et ce qui ne va pas c'est que dans un seul et unique ensemble de fonctions qui me servent à exporter fWin perd les pédales quelque part et un bête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    showmessage ( inttostr ( fWin.top))
    Me fait une erreur de handle avec violation access.
    fWin est déclaré dans deux unités et l'ordre des uses est différent par rapport aux autres, tu accèdes au mauvais fWin.

  15. #15
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 996
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 996
    Points : 8 187
    Points
    8 187

    Par défaut

    Citation Envoyé par Andnotor Voir le message
    mais quand je vois ceci [bout de code] je me dis que le gars n'a pas tout compris ou est un gros flemmard
    Un truc cool serait que tu nous expliques ce que tu vois et qu'un boulet newbie comme moi ne voit pas...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 407
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 407
    Points : 8 973
    Points
    8 973

    Par défaut

    Soyons simplement logique : pourquoi vouloir libérer un objet qui n'existe pas ?
    On le sait si la création échoue (exception), pourquoi vouloir aller plus loin à tout prix (Free) ?

    On crée l'objet et ensuite on s'assure qu'il soit déchargé dans tous les cas par un bloc try..finally mais la création ne doit pas être LE problème, elle doit être externe au bloc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Obj := TObject.Create;
     
    Try 
      ...
    Finally
      Obj.Free;
    End;
    Pourquoi flemmard ?
    Parce que ça lui évite d'imbriquer des blocs try..finally.

    Tu aimes le beau français, j'aime le beau code et ajouter des initialisations bidons plutôt que de se passer d'un appel plus qu'inutile n'en est pas (même si ça fonctionne)

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/08/2014, 12h34
  2. Réponses: 5
    Dernier message: 13/12/2008, 12h12
  3. Réponses: 7
    Dernier message: 22/02/2005, 13h07
  4. [DELPHI][PROECEDURES STOCKES] Access violation
    Par All Jinx dans le forum Bases de données
    Réponses: 6
    Dernier message: 14/05/2004, 15h57
  5. Réponses: 3
    Dernier message: 22/05/2002, 09h37

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