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 :

fermer une Form Showmodal


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut fermer une Form Showmodal
    Bonjour à tous

    voici un code qui ne fonctionne pas, comme je voudrais

    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 TFPrincipal.Compacterunebase1Click(Sender: TObject);
    Var
      Chemin, Fichier: String;
    begin
      OpenDialog1.Title := 'Recherche des données';
      OpenDialog1.Filter := 'Fichier MDB|*.Mdb';
      if OpenDialog1.Execute then
      begin
        Chemin := ExtractFilePath(OpenDialog1.FileName);
        Fichier := ExtractFileName(OpenDialog1.FileName);
        Try
          StatusBar1.Panels[0].Text := 'Menu Fichier';
          FAttente := TFAttente.Create(Application);
          Try
            FAttente.ShowModal;
    //        FAttente.Release;
    //FAttente.Close;
            Application.ProcessMessages;
            Case VersionAccessDB(Chemin+Fichier) of
              7:  Begin
                    If Not CompactAccessDB(Chemin+Fichier,'4')
                    Then Showmessage('Le comptage n''a pas pu être réalisé.')
                    Else Showmessage('Le comptage terminé.')
                  end;
              8,9: Begin
                    If Not CompactAccessDB(Chemin+Fichier,'5')
                      then Showmessage('Le comptage n''a pas pu être réalisé.')
                      else Showmessage('Le comptage terminé.')
                   end;
              else
                Showmessage('Cette base de données n''ai pas gérée.');
            end;
     
            FAttente.Release;
            FAttente.Close;
          Finally
            FAttente.free;
          end;
        Except
          on E : Exception do
          Begin
            ShowMessage(E.ClassName + ' erreur soulevée : '+#13+#10+
            'Message : '  + E.Message       +#13+#10+
            'Unit : '     + Self.ClassName  +#13+#10+
            'Procedure : '+ 'Compacterunebase1Click'      +#13+#10+
            'Table : '    + '<Néant>'       +#13+#10+
            'Requete : '  + '<Néant>'       +#13+#10+
            '-----------------------------------------------------------------------'+#13+#10+
            'Votre demande n''est pas accessible pour le moment.'+#13+#10+
            'Si le problème persiste, merci de contacter votre revendeur');
          end;
        end;
      end;
    end;
    Le but, j'ouvre une fenetre en showmodal, avec aucun bordericons, mais j'aimerais que lorsque la procédure CompactAccessDB(Chemin+Fichier,'x') est terminé que cette form en showmodal se ferme tout seul.

    Le CompactAccessDB(Chemin+Fichier,'x') de trouve dans un unit séparer sans form.

    Comment puis-je porcéder ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Tu ne peux pas afficher ta fenêtre en ShowModal puisque l'exécution de ta procédure sera interrompue jusqu'à ce qu'elle soit fermée.

    Tu peux éventuellement faire un Show avec FormStyle à fsStayOnTop ou alors tu mets ton traitement de compactage dans la fenêtre modal.

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Effectivement...

    Mais cela règle pas mon problème.

    J'ai retiré dans mon dpr la création de ma form et j'ai changé comme tu le dit.
    j'ai mis mon programme dans la form


    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
    procedure TFPrincipal.Compacterunebase1Click(Sender: TObject);
    Begin
      CheminComplet := '';
      OpenDialog1.Title := 'Recherche des données';
      OpenDialog1.Filter := 'Fichier MDB|*.Mdb';
      if OpenDialog1.Execute then
      begin
        CheminComplet := OpenDialog1.FileName;
        Try
          StatusBar1.Panels[0].Text := 'Menu Fichier';
          FAttente := TFAttente.Create(Application);
          Try
            FAttente.Show;
    //        FAttente.Release;
          Finally
            FAttente.free;
          end;
    Voici la form Attente :

    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 TFAttente.FormActivate(Sender: TObject);
    begin
      Application.ProcessMessages;
     
      Case VersionAccessDB(chemincomplet) of
        7:  Begin
              If Not CompactAccessDB(CheminComplet,'4')
              Then Showmessage('Le comptage n''a pas pu être réalisé.')
              Else Showmessage('Comptage terminé.')
            end;
        8,9: Begin
              If Not CompactAccessDB(CheminComplet,'5')
                then Showmessage('Le comptage n''a pas pu être réalisé.')
                else Showmessage('Comptage terminé.')
             end;
        else
          Showmessage('Ce type de base de données n''ai pas gérée.');
      end;
      Self.Close;
    end;
    De cette façon j'ai bien ma form qui se voit + le message Showmessage, mais dés que je clique sur ok j'ai beau message d'erreur.

    Est-ce du au free de la form ?

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Je viens de voir que cela viens de mon self.Close de ma FAttente.

    Apparement cela marche bien.

    Merci, encore, encore, encore à toi ...lol

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Le debugger te montre que ça plante sur Close mais ça pourrait se planter n'importe où entre Show et la fin de Activate avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          Try
            FAttente.Show;
          Finally
            FAttente.free;
          end;
    Là, tu dois absolument mettre ShowModal .

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    re salut...

    Je suis obligé de faire un Free ? non... Sinon, àla prochaine ouverture de cette form je risque d'avoir une erreur non ?

    Je précise que je ne la créée pas dans le dpr de mon projet.

    je me trompe ?

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Oui tu dois faire un Free d'une façon ou d'une autre (mais tu n'aurais pas d'erreur, juste une fiche qui traîne en mémoire). Mais Show n'arrête pas la procédure principale. FAttente est libérée avant que la routine de compactage soit terminée ! D'où la violation par la suite !

    Tu mets le ShowModal et tu laisses le Close. Ou encore mieux, tu renvoi un ModalResult en fonction du résultat du compactage.

    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 TFPrincipal.Compacterunebase1Click(Sender: TObject);
    Begin
      CheminComplet := '';
      OpenDialog1.Title := 'Recherche des données';
      OpenDialog1.Filter := 'Fichier MDB|*.Mdb';
      if OpenDialog1.Execute then
      begin
        CheminComplet := OpenDialog1.FileName;
        Try
          StatusBar1.Panels[0].Text := 'Menu Fichier';
          FAttente := TFAttente.Create(Application);
          Try
            case FAttente.ShowModal of
              mrOk     : Showmessage('Comptage terminé.');
              mrCancel : Showmessage('Le comptage n''a pas pu être réalisé.');
              mrAbort  : Showmessage('Ce type de base de données n''ai pas gérée.');
            end;
          Finally
            FAttente.free;
          end;
    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
    const
      WM_COMPACTING = WM_USER;
     
    type
      TfAttente = class(TForm)
        procedure FormShow(Sender: TObject);
      private
        procedure WMCOMPACTING(var Message :TMessage); message WM_COMPACTING;
      end;
     
    var
      fAttente: TfAttente;
     
    implementation
     
    {$R *.dfm}
     
    procedure TfAttente.FormShow(Sender: TObject);
    begin
      PostMessage(Handle, WM_COMPACTING, 0, 0);
    end;
     
    procedure TfAttente.WMCOMPACTING(var Message: TMessage);
    const
      ModalRes : array[Boolean] of TModalResult = (mrCancel, mrOk);
    begin
      Application.ProcessMessages;
     
      Case VersionAccessDB(chemincomplet) of
        7:   ModalResult := ModalRes[CompactAccessDB(CheminComplet,'4')];
        8,9: ModalResult := ModalRes[CompactAccessDB(CheminComplet,'5')];
        else ModalResult := mrAbort;
      end;
    end;

  8. #8
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Sa marche nikel.

    Merci beaucoup Andy.

    J'aimerais juste une précision.

    TU dis que (form).free laisse une fenetre en mémoire, cela m'inquiete.

    Rassure moi, dans ce type de procédure ci-dessous (c'est un autre programme), est-ce qu'a chaque ouverture + close de la form par l'utilisateur, il reste en mémoire une fenetre ?

    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
    procedure TFormPrincipal.Socit1Click(Sender: TObject);
    begin
      TimerInsert.Enabled := False;
      TimerDelete.Enabled := False;
      Try
        FormIdentite := TFormIdentite.Create(Application);
        Try
          FormIdentite.ShowModal;
          FormIdentite.Release;
        Finally
          FormIdentite.free;
        end;
        StatusBar1.Panels[0].Text := 'Planning Light '+Commun.Version;
      Except
        on E : Exception do
        Begin
          ShowMessage(E.ClassName + ' erreur soulevée : '+#13+#10+
          'Message : '  + E.Message       +#13+#10+
          'Unit : '     + Self.ClassName  +#13+#10+
          'Procedure : '+ 'TFormPrincipal.Socit1Click'      +#13+#10+
          'Table : '    + '<Néant>'       +#13+#10+
          'Requete : '  + '<Néant>'       +#13+#10+
          '-----------------------------------------------------------------------'+#13+#10+
          'Votre demande n''est pas accessible pour le moment.'+#13+#10+
          'Si le problème persiste, merci de contacter votre revendeur');
        end;
      end;
      TimerInsert.Enabled := True;
      TimerDelete.Enabled := True;
    end;
    Sachant que la fenetre permet de saisier des données puis l'utilisateur soit clique sur un bouton Quitter (annuler) ou valider (pour enregistrer)
    Le Quitter j'ai my Modalresult := MrRetry
    Le valider j'ai my Modalresult := MrNone et fin de procédure Self.close
    Dans mon close je fais juste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TFormIdentite.FormClose(Sender: TObject;
      var Action: TCloseAction);
    begin
      ModuleDeDonneeSecondaire.ADOSociete.Close; // Fermeture de la table utilisé
    end;
    Peux-tu juste me dire si c'est correct ?

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    C'est juste dans le sens où tu as bien un ShowModal avant le Free.

    Maintenant tu fais deux Free successifs, puisque Release n'est rien d'autre qu'un Free Asynchrone (Par un PostMessage). Tu peux donc en supprimer un. Je suis même surpris qu'il n'y ait pas une violation sur l'un d'eux puisque FormIdentite est invalide dans l'un des cas .

    Le Release est plutôt utilisé lorsqu'une fiche veut se détruire elle-même.

    Cette histoire de Free me laisse d'ailleurs toujours un peu perplexe . C'est une méthode d'instance, mais ne génère pas d'exception dans le cas d'un TObject(nil).Free. Si Paul Toth passe par là et avait une petite explication à ce sujet, elle serait la bienvenue

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Cette histoire de Free me laisse d'ailleurs toujours un peu perplexe . C'est une méthode d'instance, mais ne génère pas d'exception dans le cas d'un TObject(nil).Free. Si Paul Toth passe par là et avait une petite explication à ce sujet, elle serait la bienvenue
    Salut,

    Je crois que je peux t'apporter une réponse :
    lorsque tu appelles une méthode d'objet, tu le fais à chaque fois à partir d'un objet (je sais, ça a l'air con comme ça... ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
              Obj.methode;
    { ou : }  {Self.}methode; //le Self peut être implicite
    Et comme on le sait, en Delphi, "les objets sont des pointeurs".
    Au moment de l'appel à "Obj.methode", Obj est un pointeur vers la zone de données de l'objet, et c'est la valeur explicite de Obj qui est passée à la méthode - ie: si dans ta methode tu fais des références à "Self", à l'exécution, Delphi interprète ça comme des appels à l'objet pointé par cette valeur.

    Deux exemples sur lesquels Free ne peut pas deviner tout seul qu'un pointeur non NIL pointe vers une zone déjà désallouée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure FreeFall;
      var
        LObj : TObject;
     
    begin
      LObj := TObject.Create;
     
      LObj.Free; //Free vérifie si "Self" vaut NIL, mais ne modifie pas la valeur du pointeur initial
      LObj.Free; //lors de ce deuxième appel, le pointeur "LObj" est toujours <> NIL
    end;
    On peut contourner ce premier cas en utilisant "FreeAndNil".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure FreeFall2;
      var
        LObj1, LObj2 : TObject;
     
    begin
      LObj1 := TObject.Create;
      LObj2 := LObj1;
     
      FreeAndNil( LObj1 ); //Avec cet appel, on a bien remis LObj1 à NIL
      FreeAndNil( LObj2 ); //mais LObj2 est toujours non NIL, tout en pointant vers une zone désallouée...
    end;
    Sous réserve de validation par Mr Paul Toth, bien sûr...
    Il aurait sûrement été plus clair que moi...
    *LeGEC*

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Merci pour ton intervention LeGEC.

    Je suis bien conscient que l'appel à une zone mémoire qui n'a pas été allouée ne peut qu'entraîner des problèmes. Mais je ne savais pas (ou alors l'ai étudié il y a très longtemps ) que l'accès à une méthode ne faisait pas intervenir l'instance d'objet proprement dite mais uniquement sa classe !

    Ainsi n'importe quelle méthode pourrait être protégée par un Self <> nil et se comporter finalement comme une méthode de classe (à l'exception du Self bien sûr).

    Il est même intéressant de constater qu'une méthode d'objet fonctionne sans erreur sur un TObject(nil) alors qu'une méthode de classe se plante lamentablement.

    Petite exemple pour illustrer:
    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
    type
      TObject1 = class(TObject)
        procedure Proc;
        class procedure ClassProc;
      end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Obj :TObject1;
    begin
      Obj := nil;
      Obj.Proc;               //Réussi
      Obj.ClassProc;          //Violation
     
      Obj := TObject1.Create;
      Obj.Proc;               //Réussi
      Obj.ClassProc;          //Réussi
      Obj.Free;
    end;

  12. #12
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Je commence à me demander si cette manière de faire est la bonne alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      Try
        FormIdentite := TFormIdentite.Create(Application);
        Try
          FormIdentite.ShowModal;
          FormIdentite.Release;
        Finally
          FormIdentite.free;
        end;
    Dois-je plutot utiliser FreeAndnil ?

    j'avoue que je mis perds avec tous cela....

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Pardon Buzz, je dérape un peu

    FormIdentite n'étant utilisé nulle part ailleurs que dans cette procédure, j'aurais tendance à simplifier l'ensemble par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with TFormIdentite.Create(Application) do
    begin
      ShowModal;
      free;
    end;

  14. #14
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    C'est pire que ce que je pensais.

    J'ai fouillé dans internet pour comprendre un peu plus.

    Il parrais que
    1) si, je fais la création dynamique en mettant un aOwner ici (Application) ou même (self) dans mon cas, alors ma form sera détruite automatiquement lorsque je fermerais mon application.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        FormIdentite := TFormIdentite.Create(Application);
        FormIdentite.ShowModal;
    2) si je ne déclare pas de propriétaire (nil) alors je dois utiliser (free)
    genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        FormIdentite := TFormIdentite.Create(nil);
        FormIdentite.free;
    Le probleme c'est que j'utilise plusieur fois cette fenetre sans pour autant fermer mon application !! Alors c'est le délire !! lol

    Il parait même que si l'utilisation de ma form crée dynamiquement à pour résultat d'être supprimé tout de suite après il est préférable de faire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Try
        FormIdentite := TFormIdentite.Create(Nil);
        Try
          FormIdentite.ShowModal;
        Finally
          FormIdentite.free;
        end;

    C'est pas mieux ainsi ?

  15. #15
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Dans les trois cas, tu peux libérer ta fiche quand bon te semble. Fixer un propriétaire ne t'interdit pas de détruire la fiche manuellement par un Free.

  16. #16
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Je suis d'accord avec toi.

    Mais les spécialistes (pas moi...lol) disent qui si je free en ayant faire
    Form.Create(Application) et que je ferme l'appli par la suite, il y a alors 2 demande de destruction !!!Qui peut poser problème (je vois pas lequel lolol).


    Bon à ce jour, je n'ai pas eu d'erreur ni à la compile ni à l'execution, mais je vais retirer ma ligne 'release' qui comme tu le souligne est apparement inutile.

    Je laisse ouvert quelque jour ce topic, si Paul THOT passe par là on c'est jamais. ensuite je le remettrais résolu.

  17. #17
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Il y a 2 demandes de destruction à la fermeture de l'application dans ce cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Form2 := TForm2.Create(Application);
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Form2.Free;
    end;
    Simplement parce que Application détruit les fiches dont il est propriétaire dans l'ordres inverse de la création. Au moment de Form1.Destroy, Form2 a déjà été détruite ! Form2 est donc une référence invalide.

    Mais nous ne sommes pas au moment de la destruction de l'application .

Discussions similaires

  1. Fermer une form au bout de 5 secondes
    Par gastoncs dans le forum VB.NET
    Réponses: 11
    Dernier message: 02/02/2007, 10h57
  2. [C# 2.0] Fermer une Form dans un événement
    Par Mast3rMind dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/11/2006, 11h05
  3. Fermer une forme automatiquement
    Par MiJack dans le forum Delphi
    Réponses: 4
    Dernier message: 02/08/2006, 09h19
  4. [VB6] Comment fermer une form en cliquant sur un boutton ??
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/04/2006, 19h05
  5. [Form close] Impossible de fermer une form
    Par valoji dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2006, 15h12

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