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

Langage Delphi Discussion :

[DELPHI 6] Comment passer des paramètres entre deux fiches ?


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut [DELPHI 6] Comment passer des paramètres entre deux fiches ?
    Bonjour à tous,

    Je part d'une fiche (rechercher) pour en créer une autre (détail).
    Et pour ça, j'aimerair passer l'id de l'élement concerné, à l'autre fiche directement lors de sa création.
    (Sans faire de spagettis, pas de (rechercher) dans les uses de (détail))

    dans (recherche), je crée ma fiche comme ceci:
    Application.CreateForm(TfrmDetail, frmDetail);

    Questions:
    - Comment faut-il la créer pour passer le paramètre ?
    - Faut-il faire une surcharge de formCreate dans (détail) pour y mettre un paramètre (et comment procéder) ou faut-il mettre le paramètre directement dans l'appel de la classe (et comment procéder) ?

    Merci d'avance.
    David.

  2. #2
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    tu peux faire cela comme ca :

    Dans ta form2 tu met une var membre fMaVar;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      Form2 = class(tForm)
        ...
      private
        fMaVar : Integer; // tu choisi ton type , Integer par exemple
      ...
      public
     
      end;
    ALors soit tu choisi de créer une procedure qui permet d'initialiser ta form avec le param, soit tu redéfinit le constructeur

    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
     
      TForm2 = class(tForm)
        ...
      private
        fMaVar : Integer; // tu choisi ton type , Integer par exemple
      ...
      public
        procedure Init( aMonParam : Integer);
      end;
     
    procedure TForm2.Init( aMonParam : Integer);
    begin
      fMaVar := aMonParam;
    end;
     
    // et donc l'appel dans Form1 sera comme suit
     
    Form1.Button1_Click(sender : TObject);
    var Frm2 : TForm2;
    begin
      Frm2 := TForm2.Create(self);
     
      try
       Frm2.Init(124); // je passe mon param puis j'affiche ma form
       Frm2.ShowModal; // tu l'affiche come tu veux .. le modal n'est pas oblig
      finally
        Frm2.Release;
      end;
    end;
    Soit en redéfini le constructeur
    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
     
      TForm2 = class(tForm)
        ...
      private
        fMaVar : Integer; // tu choisi ton type , Integer par exemple
      ...
      public
        constructor Create( AOwner: TComponent; aMaVar :Integer); reintroduce;
      end;
     
    constructor  TForm2.Create( AOwner: TComponent; aMaVar :Integer); 
    begin
      inherited Create(aOwner);
      fMaVar := aMonParam;
    end;
     
    // et donc l'appel dans Form1 sera comme suit
     
    Form1.Button1_Click(sender : TObject);
    var Frm2 : TForm2;
         i : integer;
    begin
      i := 676;
      Frm2 := TForm2.Create(self, i); // le param est dans le constructeur
      try
       Frm2.ShowModal; // tu l'affiche come tu veux .. le modal n'est pas oblig
      finally
        Frm2.Release;
      end;
    end;
    le fait de passer les param comme cela te permet d'éviter les vars globales dans ton prog (et tout les dangers qui s'en suivent)
    P.S Bien sûr ces sources ne sont que des PROPOSITIONS, tu peux tjr trouver mieux
    http://www.pocketmt.com GLCD Font Creator home site.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Crée une variable globale que tu renseigne dans ta fiche Recherche et que tu lis à la création ou à l'affichage de ta fiche Detail : Variable globale

  4. #4
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour Jérôme et octal,

    Merci de votre rapidité, ta réponse, octal, et ta première solution, Jérôme, ne me conviennent pas, en effet:
    le fait de faire le createForm(), execute en meme temps le show() et, de plus, dans le formCreate(), je fait des instructions qui ont besoin de ce paramètre.
    Je ne peut donc le faire en deux fois.

    J'ai donc opté pour ta deuxième solution Jérôme, sauf que:
    - A la place de reintroduce, j'ai mis overload.
    - dans le create(), j'ai inversé les instructions sinon la variable n'était pas encore initialisée dans le formCreate()
    fMaVar := aMonParam;
    inherited Create(aOwner);
    - Peux tu me dire si c'est propre ?
    David.

  5. #5
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    je peut savoir pourquoi tu veut absolument créer ta fiche avec un Application.CreateForm(TfrmDetail, frmDetail); plutot qu'en passant par le Create+Show ???? (c just pour savoir)

    maintenant si le fait que le onFormCreate se produit avant la fin du constructeur te derrange dans ma mesure ou il utilise ton param c'est que tu utilise une vieille version de Delphi (D3 probablement), sinon jette un coup d'oeil à la variable OldCreateOrder dans l'aide en ligne de delphi.
    http://www.pocketmt.com GLCD Font Creator home site.

  6. #6
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bin...

    En fait, je ne connais pas vraiment la différence, j'ai toujours fait comme ça.
    Je trouve ça plus court et ça évite de créer une variable inutile.

    Je suis ouvert à toute critique
    David.

  7. #7
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Citation Envoyé par dacid
    Bin...

    Je trouve ça plus court et ça évite de créer une variable inutile.

    Je suis ouvert à toute critique
    j'en suis pas si sûr ... parce en interne c depphi qui crée la variable.
    De plus t'as l'impression de pas créer de var parce que tu passe frmDetail en param
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.CreateForm(TfrmDetail, frmDetail);
    et frmDetail est automatiquement déclarée par Delphi (section var de l'interface) quand tu crée ton unité.
    plutot que d'utiliser cette var, il vaudrait mieux apprendre à créer ses propre variable et à les détruire dans des bloc Try Finally pour controler au mieux la gestion de la mémoire (dynamique) et mieux controller toutes les instance de tes classes.
    maintenant pour ton Overload et Reintroduce, sache que ton overload permet juste de Garder l'ancien constructeur visible et d'en créer un avec des params différent, alors que le reintroduce permet de masquer l'ancien et d'introduire le nouveau (l'ancien reste parfaitement appelable, le reintroduce pouvant être jumelé avec le overload). Cependant quand tu fait Application.CreateForm(TfrmDetail, frmDetail); tu n'apelle pas le nouveau constructeur avec tes nouveaux params (d'où mon apelle EXPLICITE à Frm2 := TForm2.Create(self, i); >>> nouveau construct) ...
    les sources du TApplication.CreateForm() montrent clairement ce qe fait cette méthode
    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
     
    procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
    var
      Instance: TComponent;
    begin
      Instance := TComponent(InstanceClass.NewInstance);
      TComponent(Reference) := Instance;
      try
        Instance.Create(Self);
      except
        TComponent(Reference) := nil;
        raise;
      end;
      if (FMainForm = nil) and (Instance is TForm) then
      begin
        TForm(Instance).HandleNeeded;
        FMainForm := TForm(Instance);
      end;
    end;
    elle crée l'instance qui est passée en deuxieme param MAIS PAS en utilisant TON constructeur Overloadé, elle apelle le constructeur par défaut
    on le voit bien dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     TComponent(Reference) := Instance;
      try
        Instance.Create(Self); // l'ancien constructeur
    http://www.pocketmt.com GLCD Font Creator home site.

  8. #8
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Fiouuuuuuf...
    Je ne t'en demandais pas tant !

    Je te remercie pour tout octal, tu as parfaitement répondu à ma question et tu as éclairé des coins que je trouvais sombre de Delphi.

    @micalement.
    David.

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

Discussions similaires

  1. comment passer des paramètres entre deux champs de formule ?
    Par PatricePatrice dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 13/01/2012, 07h03
  2. Faire passer des items entre deux zones de listes
    Par ludobado dans le forum Access
    Réponses: 8
    Dernier message: 04/05/2006, 18h33
  3. Comment passer des paramètre a OpenRecordset
    Par molarisapa dans le forum Access
    Réponses: 2
    Dernier message: 09/03/2006, 17h14
  4. [ADO.Net][VB.NET] Comment copier des données entre deux BDD différentes ?
    Par maddog2032 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 06/06/2005, 11h01
  5. comment faire des espaces entre deux liens ???
    Par baaps dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/03/2005, 09h53

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