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éation dynamique de Forms


Sujet :

Delphi

  1. #1
    Membre régulier Avatar de Blaede
    Profil pro
    Inscrit en
    Août 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Points : 82
    Points
    82
    Par défaut Création dynamique de Forms
    Bonjour à tous,
    avant toute chose je voudrais préciser que je débute en Delphi et qu'il s'agit de mon premier post sur ce forum.


    Mon problème :
    J'ai sur la form principale une listbox contenant une liste de personnes et une autre contenant une autre liste de personnes. Le but est de sélectionner une personne dans chaque listbox, de click sur un bouton qui amène une nouvelle form et d'envoyer en paramètres à cette nouvelle form les nom des deux personnes (et d'autres paramètres mais peu importe).

    Ma question :
    Comment puis-je faire pour créer dynamiquement une nouvelle form à chaque fois que deux nouvelles personnes sont sélectionnées et que le bouton a été clické ? J'ai réussi en chipotant à créer une fenêtre à chaque click mais seule la première reçoit les paramètres des deux personnes sélectionnées, les autres form restent dans l'état d'initialisation...

    Je vous remercie d'avance pour les informations que vous pourriez m'apporter.
    Y a des jours, faut pas me chercher... et y a des jours tous les jours !

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    bonjour,

    considérons que la première se nomme Form1 avec les listes ListBox1 et ListBox2, et que la second fiche se nomme Form2
    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
     
    unit Unit1;
    ...
    type
     TForm1=class(TForm)
    ...
    implementation
     
    uses
     Unit2; 
     
    procedure TForm1.Button1Click(Sender:TObject);
    var
     f:TForm2;
    begin
     f:=TForm2.Create(Self);
     f.SetParms(ListBox1.Items[ListBox1.ItemIndex],ListBox2.Items[ListBox2.ItemIndex]);
     f.Show;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    unit Unit2;
     
    interface
    ..
    type
     TForm2=class(TForm)
     ...
     public
      procedure SetParms(const Nom1,Nom2:string);
    ...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre régulier Avatar de Blaede
    Profil pro
    Inscrit en
    Août 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Points : 82
    Points
    82
    Par défaut
    Un tout grand merci pour cette réponse !
    Cela semble en effet tout à fait clair mais malheureusement quelque chose semble encore s'opposer à ce que cela fonctionne dans mon application

    Je donne un extrait de mon code en espérant que l'erreur se trouve à l'intérieur...

    Unit 1 (TFChoose)
    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
    procedure TFChoose.BHitClick(Sender: TObject);
    var nom: string;
        F: TFCalcul;
     
    begin
      if (MobList.ItemIndex<>-1) AND (CharList.ItemIndex<>-1) then
      begin
      F:=TFCalcul.Create(self);
      nom:= ItemSelected(MobList);
      GetSelectedMob(nom);
     
      nom:= ItemSelected(CharList);
      GetSelectedChar(nom);
     
      F.FillForm(SelectedMob,SelectedChar);
      F.Show;
      end;
    end;
    Unit2 (TFCalcul)
    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
    unit Calcul;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DataModule, StdCtrls, Mask, DBCtrls, jpeg, ExtCtrls, Opponents;
     
    type
      TFCalcul = class(TForm)
        ...
     
      private
        { Private declarations }
      public
        procedure FillForm(SelectedMob: TMob; SelectedChar: TChar);
      end;
       ...
     
    var
      FCalcul: TFCalcul;
      ...
     
    implementation
     
    procedure FillForm(SelectedMob: TMob; SelectedChar: TChar);
    begin
       FCalcul.opponent.Caption:=Selectedmob.nom;
       ...
     
       FCalcul.character.Caption:=Selectedchar.nom;
       ...
    end;
    J'ai une erreur à la compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Error] Calcul.pas(89): Unsatisfied forward or external declaration: 'TFCalcul.FillForm'
    Encore merci !
    Y a des jours, faut pas me chercher... et y a des jours tous les jours !

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    et oui, le problème est bien dans le code indiqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure FillForm(SelectedMob: TMob; SelectedChar: TChar);
    begin
       FCalcul.opponent.Caption:=Selectedmob.nom;
       ...
     
       FCalcul.character.Caption:=Selectedchar.nom;
       ...
    end;
    je ne sais pas bien où est l'erreur entre "F.FillForm" et "procedure FillForm", soit FillForm est une procédure, soit c'est une méthode de classe, il faut choisir

    quoi qu'il en soit la présente du "FCalcul." dans le code fait que la seule instance référencée par FCalcul est concernée par le code, et non la variable locale F.

    si FillForm est bien une méthode de classe, il ne faut pas préfixer les membre de la classe. Si c'est pour bénéficier de la complétion de code, il faut alors utiliser Self (l'instance de l'objet dont la méthode est invoquée), et non FCalcul qui pourrait pointer sur une autre instance.

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    begin
     FCalcul:=TFCalcul.Create(Self); // ici FCalcul prend une valeur
     FCalcul.FillForm(a,b); // ici pas de soucis c'est toujours FCalcul 
     F:=TFCalcul.Create(Self); // nouvelle instance dans une nouvelle variable
     F.FillForm(a,b); // si je préfixe mon code avec FCacul c'est toujours la première instance qui est concernée :D
    end;
    donc la méthode peut s'écrire comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TFCalcul.FillForm(SelectedMob: TMob; SelectedChar: TChar);
    begin
       opponent.Caption:=Selectedmob.nom;
       ...
     
       character.Caption:=Selectedchar.nom;
       ...
    end;
    ou comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TFCalcul.FillForm(SelectedMob: TMob; SelectedChar: TChar);
    begin
       Self.opponent.Caption:=Selectedmob.nom;
       ...
     
       Self.character.Caption:=Selectedchar.nom;
       ...
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre régulier Avatar de Blaede
    Profil pro
    Inscrit en
    Août 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Points : 82
    Points
    82
    Par défaut
    Merci Merci Merci !
    Ca fonctionne parfaitement maintenant.

    Va vraiment falloir que je revois mon cours de programmation O.O.
    Y a des jours, faut pas me chercher... et y a des jours tous les jours !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/02/2008, 15h02
  2. création dynamique de forms
    Par jomree dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/05/2007, 13h48
  3. D7/création dynamique d'une Form
    Par jer64 dans le forum Delphi
    Réponses: 4
    Dernier message: 05/09/2006, 21h36
  4. Création dynamique de forms & multi-écran
    Par ArkSquall dans le forum Langage
    Réponses: 14
    Dernier message: 09/05/2006, 09h36
  5. [D7] Création dynamique de Form
    Par jer64 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 03/08/2003, 12h20

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