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 :

Dupliquer dynamiquement une form avec le code mais ... ?


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Dupliquer dynamiquement une form avec le code mais ... ?
    Bonjour à tous,

    Je souhaiterai dupliquer dynamiquement une form avec son code et ses composants mais, sans avoir à tout recrééer un par un.
    Est ce que c'est possible ?

    Merci pour vos réponses.
    Delphi 10.2 - Lazarus
    Utilisation de la VCL

  2. #2
    Membre émérite
    Bonjour,
    Depuis D7 il existe des modèles de fiches que tu peux modifier et dont tu peux hériter (Menu Fichier/Nouveau/Autres ...)

    A+
    Charly

  3. #3
    Membre émérite
    En complément, pour ajouter une fiche modèle : sur une de tes fiches, bouton droit et "Ajouter au référentiel"

    A+
    Charly

  4. #4
    Membre actif
    Une Form est un objet, dans le fenêtre de base proposée par l'EDI il s'appelle TFormX.
    Pour en créer dynamiquement il faut déclarer un objet
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    MaCopieTForm1 : TForm1;

    Le créer
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    MaCopieTForm1 := TForm1.create(self);
    MaCopieTForm1.show;

    A la fin il faudra la supprimer, c'est plus propre, même si le possesseur de cette nouvelle fenêtre (self) doit le faire lui même.

  5. #5
    Membre émérite
    Autre manière de dire la même chose que Bernard
    Une fiche est un objet dérivé de TForm
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type
      TForm1 = class(TForm)
       ...

    Form1: TForm1 est une variable qui reçoit l'adresse de l'instance créée

    donc tu peux parfaitement écrire
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Form1, Form1a : TForm1  
    ...  
      Application.CreateForm(TForm1, Form1);  
      Application.CreateForm(TForm1, Form1a); 
      Form1a.visible := true

    Donc tu ne dupliques pas dynamiquement une form avec son code et ses composants
    mais tu crées deux instances ou plus de cette form avec son code et ses composants
    sans avoir à tout recréer un par un.

  6. #6
    Expert éminent sénior
    les deux réponses sont correctes mais ne répondent pas à la même question...ceci dit celle-ci n'est pas claire

    la première réponse explique que l'on peut avoir un modèle de fiche de base avec tout son code et ses composants et en hériter dans une nouvelle fiche qui pourra modifier certains événements voir ajouter des composants...pour cela je préfère passer par les TFrame mais les deux sont possibles.

    la seconde réponse explique que l'ont peut instancier autant de fois que l'on veux une fiche. La première instance est généralement créé automatiquement car présente dans le .DPR par défaut, mais dans les options du projet il est possible de choisir les Form a créer automatiquement au démarrage du projet, ensuite on peut en effet créer d'autres instances sans problème.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre régulier
    Super, merci pour les réponses mais voyons comment éclaircir ma question ...

    La Form en question contient (entre autre) une StringGrid qui va recevoir une sorte d'extraction de données. Ensuite l'utilisateur peut interagir avec la grille par un certains nombre d'actions (boutons, clics, combobox(s) ...).

    l'idée n'est pas d'avoir une Form que je vais cloner avant de compiler, l'idée est plutôt de permettre à l'utilisateur de pourvoir créer autant de fois qu'il le souhaite cette form pour faire des extractions diverses et indépendantes les unes des autres c'est à dire simplement pouvoir "dupliquer" la Form autant de fois qu'il le désire en cliquant sur un simple bouton

    Voilà voilà
    Delphi 10.2 - Lazarus
    Utilisation de la VCL

  8. #8
    Membre émérite
    La solution que je t'ai proposé marche. Tu as besoin d'une première forme qui ouvrira les autres.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
      Application.CreateForm(TForm2, Form2); 
      Form2.visible := true


    Form2 est réutilisée plusieurs fois. Ce n'est pas un problème. c'est elle qui contient les tstringgrid et autres

  9. #9
    Expert éminent sénior
    Citation Envoyé par patrice@ Voir le message
    Super, merci pour les réponses mais voyons comment éclaircir ma question ...

    La Form en question contient (entre autre) une StringGrid qui va recevoir une sorte d'extraction de données. Ensuite l'utilisateur peut interagir avec la grille par un certains nombre d'actions (boutons, clics, combobox(s) ...).

    l'idée n'est pas d'avoir une Form que je vais cloner avant de compiler, l'idée est plutôt de permettre à l'utilisateur de pourvoir créer autant de fois qu'il le souhaite cette form pour faire des extractions diverses et indépendantes les unes des autres c'est à dire simplement pouvoir "dupliquer" la Form autant de fois qu'il le désire en cliquant sur un simple bouton

    Voilà voilà
    oui donc c'est bien de multiples instances de la même fiche.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      i: Integer;
    begin
      for i := 0 to 9 do
       TMaFiche.Create(Application);
    end;


    après, comme n'importe quel composant créé dynamiquement, soit elle est autonome (tu as par exemple un bouton Quitter qui ferme la fiche), soit tu dois garder une référence à celle-ci dans un TObjectList, dans un tableau dynamique, dans ce que tu veux en fait

    Mais alors c'est là qu'il ne faut pas faire ce que je vois souvent dans le code de débutant:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TMaFiche.BoutonQuitterClick(Sender: TObject);
    begin
      MaFiche.Release();
    end;


    ici "MaFiche" est la variable globale qui pointe (au mieux) sur une des instances de la fiche, mais pas forcément celle sur laquelle tu as cliqué

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TMaFiche.BoutonQuitterClick(Sender: TObject);
    begin
      Release(); // ou eventuellement Self.Release();
    end;


    tu peux même éventuellement faire ceci

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TMaFiche.FormDestroy(Sender: TObject);
    begin
      if Self = MaFiche then
       MaFiche := nil;
    end;


    mais la variable globale est peu utile dans le cas d'instances multiples, ceci est plus indiqué

    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
     
    var
      MesFiches: TObjectList<TMaFiche>;
     
    procedure TMaFiche.FormCreate(Sender: TObject);
    begin
      if MesFiches = nil then
       MesFiches := TObjectList<TMaFiche>.Create;
      MesFiches.Add(Self);
    end;
     
    procedure TMaFiche.FormDestroy(Sender: TObject);
    begin
      MesFiches.Extract(Self);
    end;
     
    initialization
    finalization
      MesFiches.Free;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

###raw>template_hook.ano_emploi###