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 :

Passer une forme (TForm) en paramètre.


Sujet :

Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut Passer une forme (TForm) en paramètre.
    Bonjour à tous.
    J'ai deux formes (Form1 et Form2) équipées des mêmes composants (Button1, etc...) et une unité sans forme (Tools) qui contient les procédures communes aux deux formes. Je veux modifier dynamiquement et de façon identique les composants de ces deux formes. Voici une partie de mon code :
    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
     
    // dans Unit1
    Modifier(Form1) ; 
     
    // dans Unit2
    Modifier(Form2) ;
     
    // dans Tools
    procedure Modifier(Forme) : // Forme :Tform
    begin
      if Forme.Caption = ‘Form1’ then
        begin
          with Form1 do
            begin
              Button1.Left:=100;
              // suite de la liste des modifications
            end ;
         end ; 
       if Forme.Caption = ‘Form2’ then
        begin
          with Form2 do
            begin
              Button1.Left:=100;
              // suite de la liste des modifications
            end ;
         end ;
    end;
    Ça fonctionne, mais ce n’est pas élégant ! J’aimerais ne pas avoir deux fois la liste des modifications, d’où un code du genre :
    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
     
    // dans Unit1
    Modifier(X) ; // X ?
     
    // dans Unit2
    Modifier(Y) ; // Y ?
     
    // dans Tools
    procedure Modifier(Z) : // Z ?
    begin
      with Z do
        begin
          Button1.Left:=100;
          // suite de la liste des modifications
        end;
    end;
    Mais que mettre à la place de mes X, Y et Z ??? Merci d’avance de vous pencher sur mon cas

    Cordialement,

    Alain
    Ce qui est simple et évident pour soi-même ne l'est pas forcément pour les autres... et réciproquement !

  2. #2
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    Bonjour à tous,

    à votre place, j'utiliserais la propriété tableau Components :

    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
     
    procedure Modifier(Form : TForm);
    var i : integer;
    begin
      For i:=0 to Form.ComponentCount-1 do
      begin
        if TButton(Form.Components[i]).Name = 'Button1' then
        begin
          With TButton(Form.Components[i]) do
          begin
            ...
          end;
        end;
        if TButton(Form.Components[i]).Name = 'Button2' then
        begin
          With TButton(Form.Components[i]) do
          begin
            ...
          end;
        end;
      end;
    ou encore

    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
     
    procedure Modifier(sender : TObject);
    var i : integer;
    begin
      For i:=0 to TForm(sender).ComponentCount-1 do
      begin
        if TButton(TForm(sender).Components[i]).Name = 'Button1' then
        begin
          With TButton(TForm(sender).Components[i]) do
          begin
            ...
          end;
        end;
        if TButton(TForm(sender).Components[i]).Name = 'Button2' then
        begin
          With TButton(TForm(sender).Components[i]) do
          begin
            ...
          end;
        end;
      end;
    à utiliser dans les 2 cas de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Modifier(Form1);
    Modifier(Form2);

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut
    Merci "Disciple" ( mais en l'occurrence, vous êtes plutôt le "Maître" )

    J'essaie vos solutions et vous tiens au courant.
    Ce qui est simple et évident pour soi-même ne l'est pas forcément pour les autres... et réciproquement !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut
    Votre premier code fonctionne parfaitement ( à condition de remplacer les [0] par des [i] ).

    Quant à votre second code, le compilateur n'apprécie pas l'expression TForm(sender) .

    Merci pour votre aide qui en outre m'ouvre de nouvelles perspectives.

    Bonne soirée.

    Cordialement,

    Alain le "disciple"
    Ce qui est simple et évident pour soi-même ne l'est pas forcément pour les autres... et réciproquement !

  5. #5
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    Merci "Disciple" ( mais en l'occurrence, vous êtes plutôt le "Maître" )
    Je sais, je sais...

    Votre premier code fonctionne parfaitement ( à condition de remplacer les [0] par des [i] ).
    oula oui, j'ai fait des essais et j'ai oublié de les remplacer... honte à grand maître

    Quant à votre second code, le compilateur n'apprécie pas l'expression TForm(sender)
    Bizarre, chez moi il accepte.

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Perso, je reverrai l'architecture de tes formes. Je mettrai une classe de base qui contient les composants communs, que j'heriterai en Form1 et Form2 pour les spécificités
    Attention, il faut qu'ils soient dans des unités différentes pour qu'ils puissent avoir leur propre dfm modifiables dans Delphi.
    Dis moi si es intéressé et que tu ne sais pas comment créer des TForm hérités (il y a quelques spécificités si tu veux le faire à la main sans passer par nouveau->Fiche [hérité])
    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
     
    type
      TFormBase = class(TForm)
        Button1: TButton;
        ...
        procedure Modifier; virtual;
      end;
     
      TForm1 = class(TFormBase)
        procedure Modifier; override;
      end;
     
      TForm2 = class(TFormBase)
        procedure Modifier; override;
      end;
    ...
     
    procedure TFormBase.Modifier;
    begin
      //comportement commun aux 2 forms
      Button1.Left := 100;
    end;
     
    procedure TForm1.Modifier;
    begin
      inherited;
      //comportement spécifique à form1
     
    end;
     
    ...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/09/2007, 13h58
  2. passer une form a une fonction
    Par LeXo dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 27/12/2006, 14h17
  3. Réponses: 5
    Dernier message: 23/05/2006, 15h25
  4. [Débutant]Passer une classe abstraite en paramètre
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 06/01/2006, 17h56
  5. [FLASH 5] Passer une var ou un paramètre
    Par Harry dans le forum Flash
    Réponses: 8
    Dernier message: 18/03/2004, 17h46

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