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

 Delphi Discussion :

Forms en ShowModal et aussi en Show


Sujet :

Delphi

  1. #1
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut Forms en ShowModal et aussi en Show
    Bonjour

    Je vais tenter de planter le plus simplement le décor (car en effet ça plante ) :

    1. J'ai une Form Principale (Form1)

    2. J'ai une FormDeux secondaire placée en "Fiches disponibles" dans "Options du projet".
    Cette FormDeux est appelée exclusivement de la Form principale.
    Appel en non modal comme suit (obligatoire de pouvoir par exemple écrire dans un Edit de la Form principale) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    TFormDeux.Create(Application).Show;
    ...
    3. J'ai une autre FormTrois secondaire placée aussi en "Fiches disponibles" dans "Options du projet".
    Cette FormTrois est appelée exclusivement de la FormDeux.
    Appel cette fois en modal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      ...
       FormTrois := TFormTrois.Create(Self);
       with FormTrois do
       try
          ShowModal;
       Finally
         Release; //<-- ATTENTION! Une fiche ça se libère avec un release !
       end;
     ...
    Question toute simple : lorsque par exemple je clique sur le bouton de la FormTrois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    FormDeux.Edit1.Text := 'toto';
    ...

    Hé bien j'ai immédiatement une erreur de "Violation d'accès ..." ?

    J'ai même essayé d'appeler ces Forms secondaires à l'aide d'un appel style : "FormTruc.Show" et "ShowModal", mais idem ça plante !

    La FormDeux ne doit pas être convenablement créée face au code, mais moi je la vois bien

    Merci de vos éclairements, car je patauge lamentablement

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 68
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Release; //<-- ATTENTION! Une fiche ça se libère avec un release !
    N'est-ce pas plutôt " FormTrois.Free " ??

    Cordialement.

  3. #3
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Salut,
    Citation Envoyé par Faucon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Release; //<-- ATTENTION! Une fiche ça se libère avec un release !
    N'est-ce pas plutôt " FormTrois.Free " ??

    Cordialement.
    Non non, c'est bien un Release

    Pour t'en convaincre, regarde cette discussion

    A+

    J'ai essayer vite fait un bout de code chez moi, je ne sais pas j'ai bien cerner ton soucis :

    Dans Form1, j'ai un bouton qui crée en Show la Form2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Form2:=TForm2.Create(Self);
     Form2.Show;
     Form2.Edit1.Text:='toto';
    end;
    Dans Form2, j'ai un bouton qui crée en ShowModal la Form3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm2.Button1Click(Sender: TObject);
    begin
     Form3:=TForm3.Create(Self);
     Form3.ShowModal;
    end
    Ca fonctionne bien chez moi ce code, j'ai surement mal cerner ton soucis

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 68
    Par défaut
    Mille excuses..

    L'aide de Delphi7 est catégorique, c'est bien "Release" qui convient.
    pour libérer une fiche.

    Je vais vérifier mes programmes car je pense que j'ai toujours utilisé "Free".

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Citation Envoyé par Faucon Voir le message
    Mille excuses..

    L'aide de Delphi7 est catégorique, c'est bien "Release" qui convient.
    pour libérer une fiche.

    Je vais vérifier mes programmes car je pense que j'ai toujours utilisé "Free".
    Pas de soucis, moi aussi j'ai fait cette erreur! Après tout, on est là pour apprendre

  6. #6
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Citation Envoyé par Faucon Voir le message
    L'aide de Delphi7 est catégorique, c'est bien "Release" qui convient.
    pour libérer une fiche.
    Le release est différent du Free, dans le sens où il traite les messages en attente avant de libérer la fiche. Ce qui peut s'avérer important.

    Citation Envoyé par ero-sennin Voir le message
    Pas de soucis, moi aussi j'ai fait cette erreur!
    Moi itou !

    @+ Claudius

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 68
    Par défaut
    Après consultation du "Guide du développeur" Delphi7, vous savez c'est le
    bouquin qui fait 7 cms d'épaisseur, et bien à la page 9-7 à la rubrique
    "Création dynamique de fiche" l'exemple utilise aussi Form.Free.
    Idem aux pages 9-8 et 9-9.

    Je comprends maintenant pourquoi nous n'avons plus droit à un
    "Mode d'emploi" avec les nouvelles versions.

    Bonne fin de soirée.

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par Faucon Voir le message
    Après consultation du "Guide du développeur" Delphi7, vous savez c'est le
    bouquin qui fait 7 cms d'épaisseur, et bien à la page 9-7 à la rubrique
    "Création dynamique de fiche" l'exemple utilise aussi Form.Free.
    Idem aux pages 9-8 et 9-9.
    Ils n'ont pas dit que Free ne marchait pas, ils ont dit que c'était mieux d'utiliser Release
    Dans certains cas (DLL par exemple) il vaut mieux utiliser Free
    Pedro
    Aucune réponse aux sollicitations techniques par MP

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

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

  9. #9
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut Lumière... ;-)


    ero-sennin écrivait :
    Dans Form1, j'ai un bouton qui crée en Show la Form2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Form2:=TForm2.Create(Self);
     Form2.Show;
     Form2.Edit1.Text:='toto';
    end;
    Dans Form2, j'ai un bouton qui crée en ShowModal la Form3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm2.Button1Click(Sender: TObject);
    begin
     Form3:=TForm3.Create(Self);
     Form3.ShowModal;
    end
    Ca fonctionne bien chez moi ce code, j'ai surement mal cerné ton soucis
    Non, tu as très bien cerné mon blème et... ça fonctionne désormais impec !!!

    Merci, tu es un as aussi !


    A propos, qui peut me dire pour quelle raison en ce cas de Create :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FormX:=TFormX.Create(Self);
    Il n'y a pas de Free au dessous ?

  10. #10
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Je pense que c'est un oublie. Où alors il détruit la fenêtre plus tard dans un autre gestionnaire d'évènement.
    Et puis il vaut mieux utiliser Release pour les Forms.
    D'ailleurs je pense que l'erreur entre Release et Free se situe dans le fait que seules les Forms doivent être détruit par Release. Les composants ou objets classic eux c'est Free.

  11. #11
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Bonjour,

    bubulemaster écrivait :
    [...] Où alors il détruit la fenêtre plus tard dans un autre gestionnaire d'évènement. [...]
    Hé oui justement ; c'est ce point précis que je serais heureux de connaître, car déjà bien avant j'avais eu des blèmes en ajoutant un free sur pareille méthode.

    Bref, dans les règles de l'art, doit-on ajouter ou non ce free et pourquoi ?

    Merci d'éclairer ma lanterne


  12. #12
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FormX:=TFormX.Create(nil);
    Dans ce cas il ne faut pas oublier d'effectuer un release sur la form.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FormX:=TFormX.Create(Self);
    Dans ce cas si tu n'effectues pas de release explicite, c'est le Owner (donc Self) qui effectuera cette libération lors sa propre libération puisqu'il est le propriétaire de cet objet.

    @+ Claudius

  13. #13
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Merci Cl@udius, whaaaaaaaa !!! quelle errrrrrrrrudition

    Donc c'est bien ce dont je subodorais ; dans le cas en question, nul besoin d'un free puisque cette méthode "est elle".


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

Discussions similaires

  1. form show showmodal
    Par ouiouioui dans le forum Débuter
    Réponses: 3
    Dernier message: 31/08/2012, 18h44
  2. [BCB6]Appel d’une form depuis une form avec showmodal
    Par almisuifre dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/11/2006, 19h14
  3. Fenêtres: show, showmodal, hint, close ??
    Par Danae dans le forum Langage
    Réponses: 3
    Dernier message: 11/08/2005, 17h29
  4. [C#] Form : Quelles méthodes ? Close, Dispose, Show, Hide
    Par TheSeb dans le forum Windows Forms
    Réponses: 9
    Dernier message: 30/05/2005, 16h42
  5. [delphi 5 pro] Form.ShowModal, message d'erreur
    Par mariustrezor dans le forum Bases de données
    Réponses: 6
    Dernier message: 07/12/2004, 08h22

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