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 :

Ouverture d'une fiche via un clique sur un bouton..


Sujet :

Delphi

  1. #1
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut Ouverture d'une fiche via un clique sur un bouton..
    Bonjour bonjour !

    Pour faciliter une future intégration, je souhaite ouvrire une fiche suite à un clique sur un bouton... La fenêtre affichée au démarrage est toute simple : deux boutons permettant chacun l'affichage d'une fenêtre.

    Dans un premier temps, cette fenêtre en ouvrait une autre à l'évènement 'OnCreate'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TF_Nav.FormCreate(Sender: TObject);
    begin
        Application.CreateForm(TForm1,Form1);
    end;
    Ici, Form1 s'affiche donc dès le lancement de l'application.

    Maintenant, je souhaite procèder via des boutons (étant donné qu'une deuxième fiche vien compléter le projet). j'ai donc quelque chose de cette forme là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TF_Nav.Button1Click(Sender: TObject);
    begin
        Application.CreateForm(TForm2, Form2);
    end;
     
    procedure TF_Nav.Button2Click(Sender: TObject);
    begin
        Application.CreateForm(TForm1,Form1);
    end;
     
    procedure TF_Nav.FormCreate(Sender: TObject);
    begin
        //Application.CreateForm(TForm1,Form1);  
    end;
    Petite incompréhension, cela ne fonctionne pas... Auriez vous des pistes?

    Merci par avance,

    ZenZiTone.

  2. #2
    Membre averti
    Avatar de Pascal Fonteneau
    Profil pro
    gérant
    Inscrit en
    Février 2007
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : gérant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2007
    Messages : 139
    Points : 352
    Points
    352
    Par défaut Pas trop compliqué je pense
    Pour commencer, ton projet contient 2 fiches (disons Form1 et Form2). vérifie cela dans les options du projet écran Fiches. Ces 2 fiches doivent être en autocréation (liste de gauche de mémoire).
    La fiche placée en première ligne (form1) sera affichée au lancement du programme. La seconde sera créée mais non affichée. c'est a toi de le faire avec du code.

    Exemple : Dans le onclic d'un bouton avec le code suivant :

    Ou encore


  3. #3
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Bonjour,

    En regardant dans les options du projet,
    j'ai la fiche contenant les boutons dans la colonne de gauche ("Fiches crées automatiquement") et les Form1 et Form2 dans la colonne de droite (Fiches disponible). En faisant un .show ou .showmodal, le résultat est correct.
    Ce que je ne comprend pas c'est qu'au début, lorsque je n'avais que Form1, la fiche apparaissait bien lorsque le CreateForm était fait dans l'appel du OnCreate de la fiche contenant les boutons (La fiche s'appelle Nav). Le fait est que je n'ai pas changé les options et que Form2 existait déjà (mais je ne l'appelais pas..). Sauriez-vous pourquoi?

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 946
    Points : 123
    Points
    123
    Par défaut
    bonjour,
    pourquoi recréer la fiche form1' ou form2' à chaque appui sur un bouton. ce que tu devrais faire c'est la creation des 2 fiches form1 et form2 dans l’événement oncreate de la fiche nav et qu'ensuite avec les boutons les appeler par show ou showmodal.
    et pour répondre à ta question vérifie dans le fichier source '.dpr' l'ordre de creation de tes fiches

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 562
    Points : 3 956
    Points
    3 956
    Par défaut
    Salut, salut!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TF_Nav.FormCreate(Sender: TObject);
    begin
        Application.CreateForm(TForm1,Form1);
    end;
    N'affiche pas la Form1, se contente de l'instancier et de l'ajouter dans une liste détenue par Application à la création d'une fiche TF_Nav. Donc, si ta fenêtre TF_Nav est créée plusieurs fois, il en va de même pour TForm1. Cela n'est peut-être pas gênant mais peut être source de comportements bizzares voire de bug si ce n'est pas explicitement prévu.

    Le fait de répéter cette instruction dans les événements click renforce ce que je viens de conter. Donc tu te retrouves avec quelques instances de TForm1 en mémoire qui en sont plus accessibles par la variable Form1, dommage... enfin l'objet Application fera le ménage à la fermeture du programme mais c'est une source de problème potentielle (consommatio de mémoire pour commencer)

    Comme il te l'as déjà été dit, pour afficher : Form1.Show ou Form1.ShowModal selon ce que tu souhaite.

    Je pense qu'un petit tour dans l'aide en ligne pour "découvrir" ce que font Application.CreateForm, TForm.Show et TForm.ShowModal te sera très profitable.

    @+

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 671
    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 671
    Points : 25 481
    Points
    25 481
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    j'ai la fiche contenant les boutons dans la colonne de gauche ("Fiches crées automatiquement") et les Form1 et Form2 dans la colonne de droite (Fiches disponible).
    C'est bien !

    Supprime pour être sur d'avoir un code correcte les variables Form1 et Form2
    Si ton code les utilisait remplace par Self dans toutes les méthodes de TForm1 et TForm2

    Ensuite c'est très simple

    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
    procedure TF_Nav.Button1Click(Sender: TObject);
    begin
        with TForm2.Create(nil) do
        try
          ShowModal()
        finally
          Free();
        end;
    end;
     
    procedure TF_Nav.Button2Click(Sender: TObject);
    begin
        with TForm1.Create(nil) do
        try
          ShowModal()
        finally
          Free();
        end;
    end;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 532
    Points
    13 532
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Ce que je ne comprend pas c'est qu'au début, lorsque je n'avais que Form1, la fiche apparaissait bien lorsque le CreateForm était fait dans l'appel du OnCreate de la fiche contenant les boutons (La fiche s'appelle Nav).
    Parce que TF_Nav n'était pas considérée comme la fiche principale par TApplication, même si c'était bien la première figurant dans le dpr

    Le principe est le suivant : Application.CreateForm crée la fiche et contrôle si Application.MainForm est définie. Si ce n'est pas le cas, elle devient la fiche principale et Application se charge de forcer son affichage (en fonction de ShowMainForm).
    Seulement l'événement OnCreate de la première fiche survient avant le contrôle du MainForm. Le deuxième appel à CreateForm va donc entraîner le même test et puisque MainForm vaut toujours nil, Form1 devient la fiche principale. C'est elle qui est automatiquement affichée

  8. #8
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    C'est bien !

    Supprime pour être sur d'avoir un code correcte les variables Form1 et Form2
    Si ton code les utilisait remplace par Self dans toutes les méthodes de TForm1 et TForm2
    Les variables Form1 et Form2 faut les supprimer de leurs unités (U_Form1, U_Form2)?

    Pour le bout de code que tu propose, cela fonctionne bien. Pour les besoin de mon application c'est plus adapté que de créer les fiches dans le OnCreate de U_Nav et les afficher avec un clique sur le bouton car dans une même instance je peux être emmené à répéter la procédure (il s'agit en fait d'un formulaire) proposée dans Form1 plusieurs fois.

  9. #9
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Parce que TF_Nav n'était pas considérée comme la fiche principale par TApplication, même si c'était bien la première figurant dans le dpr

    Le principe est le suivant : Application.CreateForm crée la fiche et contrôle si Application.MainForm est définie. Si ce n'est pas le cas, elle devient la fiche principale et Application se charge de forcer son affichage (en fonction de ShowMainForm).
    Seulement l'événement OnCreate de la première fiche survient avant le contrôle du MainForm. Le deuxième appel à CreateForm va donc entraîner le même test et puisque MainForm vaut toujours nil, Form1 devient la fiche principale. C'est elle qui est automatiquement affichée
    Merci pour ces informations. Cependant, j'ai quelques petites questions:

    Lorsque je fais voir le source (clique droit sur le .exe du projet) j'ai le code qui suit :

    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
    program P_Test;
     
    uses
      Forms,
      Form1 in 'Form1.pas' {F_Form1},
      U_Nav in 'U_Nav.pas' {F_Nav},
      Form2 in Form2.pas' {F_Form2};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TF_Nav, F_Nav);
      Application.Run;
    end.
    Est-ce que le fait que Form1 soit définit en premier dans les uses engendre ta remarque :
    Si ce n'est pas le cas, elle devient la fiche principale et Application se charge de forcer son affichage (en fonction de ShowMainForm).
    ?

    Aussi, à quel moment le contrôle du MainForm apparaît?

  10. #10
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Les options de ton projet te permettent de préciser quelle fiche est considérée comme la fiche principale de l'application.

    Sur quelle version de Delphi es-tu ?

  11. #11
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Les options de ton projet te permettent de préciser quelle fiche est considérée comme la fiche principale de l'application.

    Sur quelle version de Delphi es-tu ?
    Embarcadero® RAD Studio XE Version 15.0.3953.35171

  12. #12
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    alors, options projet/Fiches et la liste en haut te ppermet de définir la fiche principale

  13. #13
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Bah justement, j'avais déjà fais la manip' ! En mettant F_Nav en principale et les autres en disponible...

    D'où la question à Andnotor à propos de ce qu'il disait :
    Le principe est le suivant : Application.CreateForm crée la fiche et contrôle si Application.MainForm est définie. Si ce n'est pas le cas, elle devient la fiche principale et Application se charge de forcer son affichage (en fonction de ShowMainForm).
    Seulement l'événement OnCreate de la première fiche survient avant le contrôle du MainForm. Le deuxième appel à CreateForm va donc entraîner le même test et puisque MainForm vaut toujours nil, Form1 devient la fiche principale. C'est elle qui est automatiquement affichée

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 532
    Points
    13 532
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Est-ce que le fait que Form1 soit définit en premier dans les uses engendre ta remarque : ?
    Non. C'est le fait de créer la deuxième fiche depuis OnCreate de la première en utilisant Application.CreateForm. Si tu la créais par TForm1.Create, le comportement serait différent et F_Nav resterait la fiche principale.

    Citation Envoyé par ZenZiTone Voir le message
    Aussi, à quel moment le contrôle du MainForm apparaît?
    Dans Application.CreateForm.

    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
    procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
    var
      Instance: TComponent;
    begin
      // Set flag that TCustomForm constructor can read, so it knows if it's being
      // created as a main form or not (required when MainFormOnTaskbar is True)
      FCreatingMainForm := (FMainForm = nil) and InstanceClass.InheritsFrom(TForm);
      Instance := nil;
      try
    {$IF DEFINED(CLR)}
        Instance := InstanceClass.Create(Self);
        Reference := Instance;
    {$ELSE}
        Instance := TComponent(InstanceClass.NewInstance);
        TComponent(Reference) := Instance;
        try
          Instance.Create(Self); //<-- Création de la fiche (et appel de OnCreate)
        except
          TComponent(Reference) := nil;
          Instance := nil;
          raise;
        end;
    {$ENDIF}
    
        if (FMainForm = nil) and (Instance is TForm) then  //<-- Test du MainForm
        begin
          TForm(Instance).HandleNeeded;
          FMainForm := TForm(Instance);  //<-- Initialisation du MainForm
          if MainFormOnTaskBar then
            SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE);
          ChangeAppWindow(Handle, not MainFormOnTaskBar, not MainFormOnTaskBar);
        end;
      finally
        if (FMainForm = nil) and (Instance is TForm) then
          TForm(Instance).FCreatingMainForm := False;
      end;
    end;

  15. #15
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 671
    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 671
    Points : 25 481
    Points
    25 481
    Par défaut
    C'est pour cela qu'hier j'ai mis un exemple avec TForm1.Create, directement le constructeur au lieu du CreateForm !

    Si tu veux une fenêtre qui existe en permanence, il ne faut ni la libérer ni faire ShowModal mais plutôt show



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TF_Nav.FormCreate(Sender: TObject);
    begin
      TForm1.Create(nil).Show();
    end;
    Dans le OnClose du TForm1, il faut mettre caFree comme Action !
    Cela libéra la fenêtre si on la ferme (obligatoirement avec la syntaxe que je viens de fournir

    autre variante


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TF_Nav.FormCreate(Sender: TObject);
    begin
      FForm1 := TForm1.Create(Self)
      FForm1.Show();
    end;
    FForm1 est une variable privée de TF_Nav
    TF_Nav (représenté par Self) est le Owner de FForm1 et donc libéra la fenêtre








    tu n'es pas en MDI par hasard ??

  16. #16
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2012
    Messages : 111
    Points : 171
    Points
    171
    Par défaut
    bon jour
    juste une petite remarque
    si je veux q'une fiche secondaire soit afficher directement apre le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Application.CreateForm(TForm2,Form2);
    je mets la propriété visible de cette fiche a true
    A+

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/02/2013, 23h05
  2. [Flex4] Affichage d'une page lorsqu'on clique sur le bouton
    Par web.ikram dans le forum Flex
    Réponses: 5
    Dernier message: 06/02/2011, 00h14
  3. afficher une image lorsque je clique sur un bouton
    Par moithibault dans le forum Tkinter
    Réponses: 4
    Dernier message: 06/06/2010, 11h32
  4. [JPanel] inserer une image quand on clique sur un bouton
    Par the_ugly dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 19/12/2006, 13h41
  5. Afficher une TextArea quand on clique sur un bouton
    Par Goozisan dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 26/11/2006, 20h44

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