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

    Homme Profil pro
    Inscrit en
    mai 2003
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2003
    Messages : 88
    Points : 79
    Points
    79
    Par défaut 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
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    décembre 2006
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : décembre 2006
    Messages : 1 609
    Points : 2 415
    Points
    2 415
    Par défaut
    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
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    décembre 2006
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : décembre 2006
    Messages : 1 609
    Points : 2 415
    Points
    2 415
    Par défaut
    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
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    juin 2002
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : juin 2002
    Messages : 278
    Points : 229
    Points
    229
    Par défaut
    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
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    mars 2006
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : mars 2006
    Messages : 1 201
    Points : 2 257
    Points
    2 257
    Billets dans le blog
    6
    Par défaut
    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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    7 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 7 534
    Points : 24 876
    Points
    24 876
    Par défaut
    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

    Homme Profil pro
    Inscrit en
    mai 2003
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2003
    Messages : 88
    Points : 79
    Points
    79
    Par défaut
    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
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    mars 2006
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : mars 2006
    Messages : 1 201
    Points : 2 257
    Points
    2 257
    Billets dans le blog
    6
    Par défaut
    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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    7 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 7 534
    Points : 24 876
    Points
    24 876
    Par défaut
    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

Discussions similaires

  1. Tabulation dans une form avec entrée
    Par Cl@rk dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/05/2008, 13h09
  2. Réponses: 5
    Dernier message: 30/01/2008, 21h24
  3. Réponses: 3
    Dernier message: 23/02/2006, 16h17
  4. Impression d'une form avec controle MSHFlexGrid
    Par felix14 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/01/2006, 18h59
  5. modifier une CBitmap avec du code
    Par kor6k dans le forum MFC
    Réponses: 4
    Dernier message: 04/12/2005, 16h15

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