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.
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.4.1 - Lazarus
Utilisation de la VCL
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
Mon site : http://lapaille.byethost24.com/index.htm
En complément, pour ajouter une fiche modèle : sur une de tes fiches, bouton droit et "Ajouter au référentiel"
A+
Charly
Mon site : http://lapaille.byethost24.com/index.htm
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
Le créer
Code : Sélectionner tout - Visualiser dans une fenêtre à part MaCopieTForm1 : TForm1;
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MaCopieTForm1 := TForm1.create(self); MaCopieTForm1.show;
Code : Sélectionner tout - Visualiser dans une fenêtre à part MaCopieTForm1.Free;
Autre manière de dire la même chose que Bernard
Une fiche est un objet dérivé de TForm
Form1: TForm1 est une variable qui reçoit l'adresse de l'instance créée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 type TForm1 = class(TForm) ...
donc tu peux parfaitement écrire
Donc tu ne dupliques pas dynamiquement une form avec son code et ses composants
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
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.
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.
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.4.1 - Lazarus
Utilisation de la VCL
La solution que je t'ai proposé marche. Tu as besoin d'une première forme qui ouvrira les autres.
Form2 est réutilisée plusieurs fois. Ce n'est pas un problème. c'est elle qui contient les tstringgrid et autres
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Application.CreateForm(TForm2, Form2); Form2.visible := true
oui donc c'est bien de multiples instances de la même fiche.
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
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;
Mais alors c'est là qu'il ne faut pas faire ce que je vois souvent dans le code de débutant:
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 MaFiche.Release(); end;
tu peux même éventuellement faire ceci
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;
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 procedure TMaFiche.FormDestroy(Sender: TObject); begin if Self = MaFiche then MaFiche := nil; end;
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;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager