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 :

Créer une Form à partir de son nom


Sujet :

Delphi

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut Créer une Form à partir de son nom
    Je reprends une application où les écrans sont créés en dynamique à partir des options d'un menu.
    A ctuellement le code ressemble à cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If Option = 'Form1' Then
       Form1 := Tform1.Create(Self);
    If Option = 'Form2' Then
       Form2 := Tform2.Create(Self);
    If Option = 'Form3' Then
       Form3 := Tform3.Create(Self);
    etc...
    Donc pour 100 écrans 100 lignes et à chaque nouvel écran il faut ajouter un IF
    Je recherche un moyen de faire cela en générique.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    Je viens de tomber sur la solution de waskol proposé le 10/05/06 sur un problème équivalent.

    http://www.developpez.net/forums/sho...mique+variable

    Tu dois pouvoir l'adapter, en regardant aussi du coté de la faq sur la création de des coposants dynamiques.


    Je viens de réaliser l'exemple suivant qui je pense pourra t'aider

    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
     
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,strutils;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
     
        TabForm:array[0..99] of Tform; // Voir la solution de Wascol
     
      end;
     
    var
      Form1: TForm1;
     
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
     
    Option: string;
    Form_Number:integer;
     
    begin
     
      Option := 'Form2';
     
      Form_Number := strtoint(rightstr(Option,1));
     
      TabForm[Form_Number-1] := tform.Create(Self);
       try
        TabForm[Form_Number-1].Showmodal;
     
       finally
         TabForm[Form_Number-1].Free;
       end;
     
    end;

    A+

    Pitango
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 15
    Points
    15
    Par défaut autre solution
    Taguer les Fiches de 0 à 99 et utiliser un tableau de types de fiches

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var MyFormClasses: array[0..99] of TFormClass;

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabForm[Form_Number-1] := tform.Create(Self);
    Je vais bien créer une Form mais elle va être vide.
    Moi ce que je voudrais c'est que le TForm.Create soit un TFormUn.Create ou un TFormDeux.Create.

    Ou alors une fois la form créée il faut faire autre chose en plus ?
    Compte tenu que toutes form sont déclarées dans les USES en tête du code est-ce qu'il n'y a pas un moyen d'analyser cela.
    J'insiste un peu parce que le nombre d'écran est vraiment très important

  5. #5
    Membre habitué Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Points : 144
    Points
    144
    Par défaut
    Salut,
    J'ai déjà eu ce problème il y a un moment maintenant alors je vais essayer de faire marcher ma mémoire

    Alors déjà dans chaque fiche qui doit pouvoir être appeler, il faut ajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Initialization
      RegisterClass(TMaForm)
     
    Finalization
      UnRegisterClass(TMaForm)
    Ce qui veut dire que dans ton .dpr tu dois avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.Initialize
    ....
    Application.Finalize
    Et une fois que tes class sont recenser, il me semble que tu peux faire une creation en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetClass('TMaForm').Create(self)
    Voilà donc comme je le disais, tout ça c'est de mémoire et non testé, j'ai peut être oublié quelque chsoe mais en tout cas, cherche dans cette direction, ça marchais très bien

    Bon courage

    Le bonheur n'est pas au bout du chemin, le bonheur est le chemin
    Il existe 10 sortes de personnes, ceux qui comprennent le binaire et les autres...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Désolé Delphi-ne, je n'avais pas compris ta demande

    A+

    Pitango
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  7. #7
    Membre habitué Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Points : 144
    Points
    144
    Par défaut
    A vérifier aussi mais il me semble aussi qu'avec ma méthode, il n'est pas utile d'ajouter les form appelées dans la clause Uses de la Form appelante. (Très pratique : moi j'avais environs 150 forms appelées )

    Le bonheur n'est pas au bout du chemin, le bonheur est le chemin
    Il existe 10 sortes de personnes, ceux qui comprennent le binaire et les autres...

  8. #8
    Expert éminent sénior
    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 : 61
    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
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut Delphi-ne

    Tu peux essayer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TFormMain.CreateFormByName(FormName: string);
    var
      AForm: TForm;
    begin
      Application.CreateForm(TFormClass(FindClass('T' + FormName)), AForm);
      AForm.Show;
    end;
    Bien sûr comme le précise Guile, il faut que tes classes soient enregistrées.

    @+ Claudius.

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Merci,
    Si j'arrive à faire marcher cela ce sera vraiment très bien

    Au niveau de chaque feuille j'ai placé ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    uses SysUtils, etc...;
     
    {$R *.DFM}
     
    Initialization
      RegisterClass(ToFormS01);
     
    Finalization
      UnRegisterClass(ToFormS01);
     
    end.
    Par contre ou j'ai un doute c'est au niveau du code de projet
    Le projet est une DLL et je ne sais pas où ecrire les Initialize. Je ne peux pas attacher à Application.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exports DLL_Initialise, DLL_Ferme;
     
    begin
    Application.Initialize
    et comment initialiser ToFormS01 ?
    Application.Finalize
    end.
    En plus Initialize est bien trouvé en méthode de Application mais pas Finalize (en D6)

  10. #10
    Expert éminent sénior
    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 : 61
    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
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut,

    Au niveau des DLLs je ne sais pas trop , mais dans une application nul besoin de demander un Initialize ou Finalize des forms explicitement.

    Tu peux constater que les sections initialization et finalization sont automatiquement appelées à l'ouverture et à la fermeture de l'appli.
    Même si l'une des forms n'est pas créée au démarrage.

    Mais pour en revenir aux DLLs, tu peux faire le test en mettant un breakpoint sur le RegisterClass et sur le UnRegisterClass d'un de tes forms pour t'assurer du même comportement.

    @+ Claudius

  11. #11
    Membre habitué Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Points : 144
    Points
    144
    Par défaut
    Il ne faut pas Initialiser spécifiquement "ToFormS01" ou tes autres Forms
    En fait Application.Initialize lance la Partie Initialization de toutes les fiches qui font parties de ton projet.
    Par contre pour Application.Finalize, j'ai peut être dit une bétise, il est possible que ça n'existe pas Désolé, j'écris de mémoire
    Par contre, j'y connais pas grand chose en Dll. Pour ça je ne pexu pas t'aider
    Il existe 10 sortes de personnes, ceux qui comprennent le binaire et les autres...

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    En fait au niveau de chaque form j'ai ajouté les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Initialization
      RegisterClass(TypeForme);
     
    Finalization
      UnRegisterClass(TypeForme);
    Pour utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Var
       oForm : TForm
    Begin
       Application.CreateForm(TFormClass(FindClass(pNomEcran)), oForm);
    Ca marche parfaitement. Merci beaucoup à tous les deux.

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 02/02/2009, 18h06
  2. Réponses: 10
    Dernier message: 26/06/2008, 11h25
  3. Réponses: 7
    Dernier message: 29/11/2006, 11h32
  4. [VBA] Lancer une form à partir de son nom
    Par truman dans le forum Général VBA
    Réponses: 28
    Dernier message: 18/05/2006, 14h41
  5. Récupérer une variable à partir de son nom ...
    Par CynO dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/10/2005, 16h59

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