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 :

intanciation de form et erreur à la réouverture (Action:=caFree)


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut intanciation de form et erreur à la réouverture (Action:=caFree)
    Bonjour à tous,

    (Difficile de mettre un titre de discussion.)

    J'ai une form créée dans le source (petit clin d’œil à SergioMaster qui m'a guidé dans le SplashScreen ce we)
    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
     
    uses
      Forms,
      Lettrage in 'Lettrage.pas' {Lettre},
      ...//...
     
    {$R *.RES}
     
    begin
      Application.Initialize;
      // Acceuil au lancement du logiciel
      Acceuil := TAcceuil.Create(nil);
      Acceuil.Show;
      Acceuil.Update;
      Application.Title := 'BLABLABLA';
      Application.CreateForm(TLettre, Lettre);
      ...//...
      Acceuil.free;
      Application.Run;
    end.
    J'appelle cette forme via un bouton sur une form principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TPrincipale.BitBtn6Click(Sender: TObject);
    begin
        Lettre.Show;
    end;
    Je souhaite l'intancier via un Lettre.PopupMenu
    J'ai donc le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TLettre.NewInstance1Click(Sender: TObject);
    begin
         TLettre.Create(Application).Show;
    end;
    Et j'ai lu dans les tutos qu'il fallait mettre Action:=caFree dans le onClose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TLettre.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
        Action := caFree;
    end;
    Ça fonctionne bien, sauf quand je rappelle ma form initiale par le clic sur le menu principal : là j'ai une bonne grosse erreur de violation d'accès.

    J'imagine que le caFree a libéré la mémoire de la fiche "mère", donc il me faudrait Action:=caFree dans la TLettre "fille" mais pas le mettre chez la "mère"

    Mais comment faire ?
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Acceuil.free est en trop dans le DPR si cela passe par l'Action caFree dans un TAcceuil.FormClose
    Non parce que votre sujet mélange Acceuil et Lettre, c'est confus.

    Attention la référence Lettre peut être invalide après un Action caFree dans un TLettre.FormClose
    D'ailleurs, Lettre ne reçoit pas le TLettre.Create donc probablement invalide et TLettre crée une autre TLettre ? curieux !

    Action caFree c'est a utiliser avec parcimonie, mieux vaut maitriser le cycle de vie et les références, vous devriez revoir tout ça, faire explicitement vos Free et éviter toute Action caFree pour une fenêtre dont vous utiliser la référence.
    Ah et surtout supprimer Lettre et Acceuil dans leur unité respective, utiliser des variables locales et Self
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut
    Bonsoir Grand Maitre

    Acceuil.free est en trop dans le DPR si cela passe par l'Action caFree dans un TAcceuil.FormClose
    Acceuil est un SplashScreen, j'ai vu ça ce we avec SergioMaster + tutos de Paul TOTH qui répondais dans un post.
    Donc je détruis acceuil juste avant le run.
    Ce n'est pas comme ça qu'il faut faire ?

    Attention la référence Lettre peut être invalide après un Action caFree dans un TLettre.FormClose
    Oui c'est ce qu'il me semble, c'est le caFree qui met le basard.

    D'ailleurs, Lettre ne reçoit pas le TLettre.Create donc probablement invalide et TLettre crée une autre TLettre ? curieux !
    Heuu, si, il le reçoit, non ? Ce n'est pas ça ? dans le source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :16: Application.CreateForm(TLettre, Lettre);
    TLettre crée une autre TLettre ?
    Heuu, c'est comme ça que j'ai compris les divers post que j'ai lu pour intancier une fiche complète Ce n'est pas comme ça qu'il faut faire ?

    La création se passe bien, je n'ai pas repéré de soucis. A priori il semblerait que ce soit le caFree de la fiche TLettre. Mais si je ne le mets pas, que j'intance la fiche, et que je détruit la ou les fiches filles créées, elle ne vont pas rester en memoire quelque part ? J'ai lu qu'il ne fallait surtout pas oublier de mettre caFree pour être sur du coup mais uniquement dans les fiches filles.

    Mais alors, comment intancier une fiche complète et lui rajouter un caFree ou alors être sur qu'elle libère les ressources lorsqu'on la ferme ?
    Je viens de voir dans des discutions self.free ou self.release ou FreeAnNil(self), mais il semblerait que les avis soient partagés, certains disent qu'il faut utiliser ceci, d'autre celà, et au milieu, je ne comprends plus rien ...
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par patrice@ Voir le message
    J'ai une form créée dans le source (petit clin d’œil à SergioMaster qui m'a guidé dans le SplashScreen ce we)
    Pas assez bien apparament, ou alors j'ai merdé quelque part dans mon tutoriel.
    Donc je détruis acceuil juste avant le run.
    c'est plus ou moins ce que j'ai indiqué, mais comme elle est détruite et libérée pas de cafree nécessaire, c'est même le contraire.

    Ça fonctionne bien, sauf quand je rappelle ma form initiale par le clic sur le menu principal : là j'ai une bonne grosse erreur de violation d'accès.
    Là je ne suis pas, la forme initiale acceuil ou TLettre ?

    J'imagine que le caFree a libéré la mémoire de la fiche "mère",
    cette fiche mère c'est ? A priori une forme principale donc, la seule qui ne devrait pas être détruite à sa fermeture (bizarre, fermer la fenêtre principale ferme le programme normalement)
    donc il me faudrait Action:=caFree dans la TLettre "fille" mais pas le mettre chez la "mère"
    je ne comprend pas Tlettre appelle d'autres Tlettre ? Comment ?

    Mais comment faire ?
    au pire en ne faisant cafree que si la fenêtre n'a pas de parent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not assigned(Parent)  then Action:=cafree; // non testé
    Déjà il faudrait savoir s'il s'agit d'un programme MDI ou pas

    Mais alors, comment intancier une fiche complète et lui rajouter un caFree ou alors être sur qu'elle libère les ressources lorsqu'on la ferme ?
    C'est un choix, soit on utulise un bloc Try Finally
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var aLettre : TLettre;
    begin
    aLettre:=Tlettre.Create(self); 
    Try
       aLettre.Show;
    Finally
       aLettre.Free; 
    end;
    Soit en utilisant action := cafree du OnClose

    Je viens de voir dans des discussions self.free ou self.release ou FreeAndNil(self), mais il semblerait que les avis soient partagés
    et il manque DisposeOf et Destroy
    FreeAndNil serait (or gestion mémoire ARC) le mieux AMHA puisque dans ce cas on est sur que le pointeur sur la forme détruite ne sera pas/plus assigné.

    Mais, il faut être curieux quand on a les sources et regarder ce que font ces diverses instructions per exemple :
    - DisposeOf vérifie si la gestion ARC est active dans ce cas c'est cette gestion qui est utilisée pour libérer la mémoire, sinon appelle Free.
    - Free appelle Destroy (si ce n'est pas du ARC)
    - FreeAndNil, copie l'objet (forme ou autre) dans un objet temporaire, met le pointeur de l'objet à nil et fait un free de l'objet
    - Release me semble le pire, utilisant un postmessage ne garanti en rien que le pointeur soit détruit (faut faire confiance à Windows)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut
    Bonjour SergioMaster,

    Pas assez bien apparemment, ou alors j'ai merdé quelque part dans mon tutoriel.
    non non ... c'est l'élève qui à merdé mais où ? il a l'air de bien fonctionner mon splashScreen

    La méthode employée est celle du SDI, donc des fenêtres flottantes.

    Ok ok, je me suis très mal exprimé car il y a 2 choses bien différentes qui sont mélangées
    On oublie la fiche Acceuil qui ne pose aucun soucis en soit (je ne suis pas contre un correctif de ma méthode si elle ne semble pas bonne mais mon questionnement n'est pas sur le SplashScreen)

    En reprenant ton tuto "Techniques d'enchainement de formes" et d'autres réponses trouvées, je me suis essayé (c'est ma 1ere fois, et comme toutes les 1eres fois ...) à l’instanciation de fiche sur une fiche qui est créé dans le source.

    Reprenons : je créé Lettre dans le source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    uses
      Forms,
      Lettrage in 'Lettrage.pas' {Lettre},
      ...//...
     
    {$R *.RES}
     
    begin
      Application.Initialize;
      Application.CreateForm(TLettre, Lettre);
      ...//...
      Application.Run;
    end.
    Dans cette fiche j'ai un bouton pour intancier cette fiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TLettre.NewInstance1Click(Sender: TObject);
    begin
         TLettre.Create(Application).Show;
    end;
    Donc elle se duplique elle même.

    Pour info, avant de lire les tutos, j"avais une autre procédure qui passait par une variable FormClone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TLettre.NewInstance1Click(Sender: TObject);
    Var
       FormClone: TLettre;
    begin
       Application.CreateForm(TLettre, FormClone);
       FormClone.visible := true
    end;
    Peut être est-ce mieux de faire comme la 2ème procédure ?
    Je laisse la possibilité à l'utilisateur de créer autant de clone qu'il veut.

    Ce qui m'a alerté c'est quand je lis qu'il ne faut surtout pas oublier de libérer les fiches créées d'où l'emploi du caFree dans le onClose.

    Ma question est donc : suis je obligé de mettre une commande quelconque dans un évènement des fiches créées dynamiquement pour être sur de libérer les ressources ou est ce que je n'ai pas besoin car elle se libère naturellement à leur fermeture ?
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par patrice@ Voir le message
    La méthode employée est celle du SDI, donc des fenêtres flottantes.
    celle dont je suis le moins fan !
    Ma question est donc : suis je obligé de mettre une commande quelconque dans un évènement des fiches créées dynamiquement pour être sur de libérer les ressources ou est ce que je n'ai pas besoin car elle se libère naturellement à leur fermeture ?
    un ReportMemoryLeaksOnShutdown serait le juge suprême
    mettre dans le projet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReportMemoryLeaksOnShutDown:=True;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut
    celle dont je suis le moins fan !
    Oui, j'ai lu ... mais pour le moment je ne me sent pas au niveau du docking

    Entre les 2 méthodes de clonage de fiche, y en a t-il une meilleure que l'autre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TLettre.NewInstance1Click(Sender: TObject);
    Var
       FormClone: TLettre;
    begin
       Application.CreateForm(TLettre, FormClone).Show;
       FormClone.visible := true
    end;
    ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure TLettre.NewInstance1Click(Sender: TObject);
       TLettre.Create(Application).Show;
    end;
    Ou une autre méthode peut être ?
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par patrice@ Voir le message
    Oui, j'ai lu ... mais pour le moment je ne me sent pas au niveau du docking
    entre SDI et Docking il y a MDI


    Entre les 2 méthodes de clonage de fiche, y en a t-il une meilleure que l'autre ?
    Ou une autre méthode peut être ?
    Ben déjà dans la première je ne suis pas sur que FormClone.visible soit nécessaire
    Ensuite je serais plus partant pour englober dans un bloc try except end (juste au cas où)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    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 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    il existe un tuto ici

    PS : De plus il est préférable pour le form d'utiliser "Release" plutôt que "free"
    afin de laisser finir tout les événements avant de fermer la fenêtre complètement


    PS2: Perso j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.CreateForm(...);
    que dans le fichier DPR
    je trouve bien plus simple de faire voici un code permettant l'ouverture que d'une seul fenêtre en MDI de même type
    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
     
    procedure TMainFrm.ActionFrmClick(Sender: TObject);
    var
      count : integer;
      i : integer;
      found : boolean;
    begin
      count := Pred(MDIChildCount);
      found := False;
      if   MDIChildCount > 0 Then
      begin
        i := 0;
        while (i <= count) and Not(found) do
        begin
           if  MDIChildren[i] is TActionFrm Then
           begin
             found := true;
             TActionFrm(MDIChildren[i]).Show;
           end;
          Application.ProcessMessages;
          inc(i);
        end;
      end;
      if not(found) Then
        TActionFrm.Create(Self).Show;
    end;
    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

  10. #10
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut
    Merci Anapurna,
    Nous parlons bien de ce tuto avec SergioMaster (c'est lui qui l'a fait )

    TFrm.Create(Self).show
    begin
    TLettre.Create(Self).Show
    end;
    Ok, ShaiLeTroll parlait d'utiliser Self, peut être faisait il allusion à ça. Ok, c'est noté.

    entre SDI et Docking il y a MDI
    Du coup là c'est moi qui n'aime pas, à l'heure des écrans multiples se retrouver coincé dans une fenêtre ...
    Mais je vais faire un gestionnaire de fenêtre histoire de les retrouver si elles sont cachée ... je verrais ça plus tard

    PS : De plus il est préférable pour le form d'utiliser "Release" plutôt que "free"
    Ok pour le Release Anapurna, à mettre dans le onClose ?
    Aie, j'ai mis Self.Release dans le onclose de ma fiche mère, du coup, quand je la ferme (la fiche mère) toutes les filles close aussi!
    Bon ... je ne mets rien ...

    Ben déjà dans la première je ne suis pas sur que FormClone.visible soit nécessaire
    Ensuite je serais plus partant pour englober dans un bloc try except end (juste au cas où)
    Oui j'ai vu l'erreur, mais je ne pouvais plus modifier mon message ... le application.createForm (...).Show ne fonctionne pas, .Show à enlever.
    Et ça ne fait pas de mal le try except end

    Punaise, pas simple de comprendre le clonage des fiches. Il n'y a pas un tuto quelque part qui reprend tout ça ??? (cherché, pas trouvé)
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par patrice@ Voir le message
    Ok, ShaiLeTroll parlait d'utiliser Self, peut être faisait il allusion à ça. Ok, c'est noté.
    Pas de tout, je parlais de bannir les variables globales

    Personnellement, il y a tellement de proposition contradictoire dans ce sujet, cela mélange SDI et MDI, cela ne prend en compte le besoin d'avoir une référence ou non sur les fenêtres.



    Citation Envoyé par anapurna Voir le message
    PS : De plus il est préférable pour le form d'utiliser "Release" plutôt que "free"
    afin de laisser finir tout les événements avant de fermer la fenêtre complètement
    Cela dépend ce que l'on fait
    Si la libération est faite par un gestionnaire de la fenêtre lui même, Release est nécessaire mais franchement c'est un cas rare
    Si la libération est géré par un Owner c'est inutile
    Si la libération est géré par l'appelant (une variable membre du parent), c'est inutile



    Arrêtez de proposer tout et n'importe quoi !
    La première question est "quelle est le cycle de vie des fenêtres et le besoin de référencement des instances ?"
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    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 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    regarde le code 'release' du 'tform' celui-ci fait un free au final mais laisse tout les événement en cours se terminer
    afin d’éviter un accès a un element précédemment détruit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TCustomForm.CMRelease;
    ...
      Free;
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TCustomForm.Release;
    ...
      PostMessage(Handle, CM_RELEASE, 0, 0);
    ...
    d’ailleurs l'option CAFree du CloseAction lui même fait un release
    voici deux exemple assez parlant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TCustomForm.CloseModal;
    ....
        case CloseAction of
          ....
          caFree: Release;
        end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TCustomForm.Close;
    ...
      if CloseAction <> caNone then
       ...    
      else Release;
    ...
    ShaiLeTroll je suis d'accord avec toi c'est des cas très particulier
    mais plutôt que faire un free (dans le cas ou tu dois le faire) ... il est préférable de faire un "release" c'est tout ce que j'ai dit

    Ok pour le Release Anapurna, à mettre dans le onClose ?
    Aie, j'ai mis Self.Release dans le onclose de ma fiche mère, du coup, quand je la ferme (la fiche mère) toutes les filles close aussi!
    Bon ... je ne mets rien ...
    non malheureux dans le juste un
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Application.CreateForm n'a d'utilité que pour la toute première fiche créée puisque cette méthode fixe la fiche principale. Par la suite, TMyForm.Create suffit.

    Citation Envoyé par patrice@ Voir le message
    quand je la ferme (la fiche mère) toutes les filles close aussi!
    Normal, fermer la fiche principale équivaut à terminer l'application


    Pour arriver à tes fins, il te faut une première fiche (qui peut être masquée) qui servira de gestionnaire pour les fiches secondaires (TLettre) et qui ne se terminera que lorsque la dernière TLettre sera fermée.


    @Anapurna

    Le problème est la pile d'appel : une méthode de l'objet appelle une autre méthode du même objet et ainsi de suite. Au retour de ces méthodes et si l'objet a été libéré (donc la pile et le tas), tous les pointeurs sont dans les choux conduisant presque inévitablement à des VA. Release qui est une libération asynchrone permet de palier ce problème et est obligatoire lorsqu'un objet veut se libérer lui-même (ou libérer l'un de ses parents ce qui revient au même). Dans tous les autres cas, il n'a aucun avantage sur Free (mais ne dérange pas).

    Perso je n'utilise jamais caFree qui nous fait perdre la maitrise des éléments.

Discussions similaires

  1. Réponses: 28
    Dernier message: 30/07/2008, 17h33
  2. Forms 6i : Erreur interne lors de la compilation
    Par Veve44 dans le forum Forms
    Réponses: 4
    Dernier message: 10/10/2005, 14h22
  3. FORMS et erreur ORA-XXXXX
    Par Nounoursonne dans le forum Forms
    Réponses: 2
    Dernier message: 06/10/2005, 21h01
  4. [FORMS][6i] Erreur non explicitée
    Par badara1 dans le forum Forms
    Réponses: 15
    Dernier message: 13/05/2005, 10h56
  5. [Forms 6i] Erreur FRM-30187 : longueur ?
    Par macben dans le forum Forms
    Réponses: 13
    Dernier message: 08/11/2004, 15h45

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