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 :

conseil sur create form


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    839
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 839
    Points : 262
    Points
    262
    Par défaut conseil sur create form
    Bonjour,

    jusqu'a présent j'utilisais beaucoup cette syntaxe pour créer et accéder à une fiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Application.CreateForm(TForm49, Form49);
    form49.showmodal;
    form49.free;
    Le problème aujourd'hui et que j'aimerais utiliser le form.show au lieu de form.showmodal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Application.CreateForm(TForm49, Form49);
    form49.show;
    form49.free;
    Mais dans ce cas la ligne 'form49.free' ne sert à rien, car lorque l'on ferme la form 49, le control n'est pas rendu à la form appelante.

    D'ou ma question: comment liberer la memoire ou est ce qu'elle est automatiquement liberée à la fermeture de la form 49

    merci

  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
    Que c'est vilain !
    Tu devrais bannir l'utilisation de la variable globale automatique, c'est source de confusion, on voit souvent cette variable utilisée au lieu de Self

    Surtout que tu ne remets pas Form49 à nil, c'est un risque d'utiliser une référence libérée !


    TForm49 c'est un exemple, tu n'a pas TForm1, TForm2, ...TForm49 dans ton code ?

    un ShowModal élégant et sans risque de confusion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with TForm49.Create(nil) do
    try
      ShowModal();
    finally
      Free();
    end;
    Pour une TForm en Show non bloquant, cela se complique !

    Soit tu gères l'instance (Action en caHide, c'est le mode par défaut), MaForm est une variable si possible membre d'un autre objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if not Assigned(MaForm) then
      MaForm := TForm49.Create(Application); // libération auto à la fermeture appli via le Owner
     
    MaForm.Show(); // BringToFront();
    Pour éviter une utilisation d'une référence libérée, gérer OnDestroy permet de se protéger d'une future violation d'accès
    En mode caHide, ce n'est pas vraiment utile, juste en précaution
    En mode caFree, c'est indispensable !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm49.FormDestroy(Sender : TObject);
    begin
     if Sender = Form49 then
       Form49 := nil; // très important pour éviter les accès mémoires dangereux
    end;

    Voir le OnClose et caFree pour une libération implicite sur la fermeture via Close() ou ALT+F4.
    Attention, il faut penser que la référence doit être affecté à nil dans le Destructeur, idéalement une pattern Singleton ou Multiton est recommandé pour gérer les allocations et pour éviter l'utilisation de référence libérée

    En déplaçant la variable automatique de la partie interface à implementation, tu peux t'en servir comme Singleton

    Voici un code pour faire une sorte de pseudo singleton en D7 !

    Code Appelant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TForm49.ShowMe(); // appel d'une méthode de classe et non d'instance
    Code appelé !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class procedure TForm49.ShowMe();
    begin
      if not Assigned(Form49) then
         Form49:= TForm49.Create(Application); // libération auto à la fermeture appli via le Owner
     
      Form49.Show(); 
      Form49.BringToFront();
    end;
    Et pour gérer la libération automatique à la fermeture (en plus FormDestroy)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm49.FormClose(Sender : TObject; var Action: TCloseAction);
    begin
      if Sender = Form49 then
        Action := caFree;
    end;
    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 actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    839
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 839
    Points : 262
    Points
    262
    Par défaut réponse
    Bonjour,

    merci pour toutes ces précisions

    Je vais pouvoir corriger et faire du code propre maintenant. (mon prog a 72 fiches !!). Je ne m'étais jamais penché sur la question car c'était pas clairs du tout ces histoires de création.

    Concernant la création de la form modal, vous mettez 'nil' commer owner dans le processus de création. En cherchant des infos, j'ai vu que l'on pouvait mettre 'self' , 'nil' ou 'Application' dans le owner.
    Quel est l'intêret de mettre l'un ou l'autre ? Pour une form modal ou non modal ?

    merci

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Cela indique le Owner de l'objet que tu crées (la form dans ce cas)

    Nil : Pas de owner
    Self : La fenêtre ou la classe appelante
    Application : L'application est le owner.

    Cela sert surtout lors de la destruction des objets. Si par exemple on détruit une form1 qui a créé cette form2 avec comme Owner Self. Les deux form seront libérés. s'il y avait eu création avec Application alors seul al Form1 sera libéré.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par looping Voir le message
    Bonjour,

    merci pour toutes ces précisions

    Je vais pouvoir corriger et faire du code propre maintenant. (mon prog a 72 fiches !!). Je ne m'étais jamais penché sur la question car c'était pas clairs du tout ces histoires de création.

    Concernant la création de la form modal, vous mettez 'nil' commer owner dans le processus de création. En cherchant des infos, j'ai vu que l'on pouvait mettre 'self' , 'nil' ou 'Application' dans le owner.
    Quel est l'intêret de mettre l'un ou l'autre ? Pour une form modal ou non modal ?

    merci
    cf le point d'Owner
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Conseil sur la conception de ma mise en forme
    Par gaya102 dans le forum Mise en page CSS
    Réponses: 15
    Dernier message: 02/09/2009, 14h24
  2. conseil sur un form qui me sert de MessageDlg
    Par BuzzLeclaire dans le forum Langage
    Réponses: 4
    Dernier message: 01/03/2009, 22h56
  3. Besoin conseil sur la forme 3NF d'un exemple de relvar
    Par ctobini dans le forum Débuter
    Réponses: 3
    Dernier message: 17/06/2007, 00h01
  4. Recherche Livre / Conseils sur la conception de Base
    Par Yeuma dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 02/01/2004, 14h25

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