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 :

[D7] Passer 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 [D7] Passer TForm en paramètre
    Bonsoir,
    Voici la conséquence de ma précédente discussion. Je corrige mon application pour partager des procédures et ressources... Une procédure que je voudrais partager contient des composants par ex : Form1.Edit1 que j'aimerais remplacer par Forme.Edit1 où Forme serait un paramètre TForm qui recevrait Form1. Voici un exemple de code pour situer mon pb :
    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
    var
      Form1: TForm1;
    
      procedure Suite(Forme:TForm);
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Suite(Form1); // ou Suite(Self)
    end;
    
    procedure Suite(Forme:TForm);
    begin
      with Forme do
        begin
          Canvas.Brush.Color:=clRed; // <----- cette ligne fonctionne
          //Edit1.Text:='Toto';  // <----------- celle-ci plante !!!
          Form1.Edit1.Text:='Toto'; // <------- celle-ci fonctionne (normal)
        end;
    end;
    Pourquoi ce plantage ?

    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
    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 430
    Points
    28 430
    Par défaut
    Alors première remarque, c'est n'est pas "Suite(Form1)" mais bien "Suite(Self)" !

    la différence est de taille, exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    begin
    // première fenêtre de type TForm1
      Form1 := TForm1.Create(nil);
    // seconde fenêtre de type TForm1
      Form1 := TForm1.Create(nil); 
    // maintenant clique sur le Button1 de la première fenêtre
    // -> c'est la second fiche qui est affectée !
      Form1 := nil;
    // maintenant clique sur Button1 !
    // -> plantage !
    end;
    Ensuite dans le code de Suite tu veux faire référence à Edit1...or Edit1 n'existe pas dans TForm, il n'existe que dans TForm1, il faut donc un paramètre de type TForm1...ou TEdit (si seul le TEdit est modifié) afin de pouvoir l'utiliser avec des TEdit d'autres formes !

    et pour achever de te plonger dans le brouillard, introduisons "overload"

    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Suite(Self);
      Suite(Edit1); 
    end;
     
    procedure Suite(Form: TForm); overload;
    begin
      Form.Canvas.Brush.Color = clRed;
    end;
     
    procedure Suite(Edit: TEdit); overload;
    begin
      Edit.Text:='Toto'; 
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  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
    Edit1 n'existe pas dans TForm, il n'existe que dans TForm1
    Ok, je confonds donc ici le type (TForm) et le name (Form1) : mais c'est très grave, ça
    pour achever de te plonger dans le brouillard
    l'humour, ça me va bien, mais c'est pourtant un peu méchant : en effet, pour une fois que nous n'en avons, ici en Champagne, en plein hiver (soleil toute la journée, exceptionnel !)
    overload (surcharge) ne me convient pas. En fait, j'ai un ensemble de procédures et fonctions qui me permettent l'affichage des drives accessibles (avec leurs types -disque dur, disquettes, la présence ou non d'une disquette dans le lecteur, etc...) : ces procédures utilisent RadioGroup, Memo, etc... Je trouvais donc chouette de pouvoir atteindre ces composants par un passage de paramètre Form comme dans mon exemple. Vu que cela ne marche, je vais faire dans le lourd. Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure ListDrives(RG:TRadioGroup;M:TMemo; etc...);
     
    // les appels seront du style :
    ListDrives(Form4.RadioGroupDrives,Form4.MemoDrives, etc...);
    J'espérais n'utiliser qu'un paramètre Form pour éviter la multiplicité des paramètres à passer.

    Merci pour ton aide.
    Cordialement
    Alain
    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 [D7] Passer TFont en paramètre
    Citation Envoyé par alainvh Voir le message
    Bonsoir,
    Voici la conséquence de ma précédente discussion. Je corrige mon application pour partager des procédures et ressources... Une procédure que je voudrais partager contient des composants par ex : Form1.Edit1 que j'aimerais remplacer par Forme.Edit1 où Forme serait un paramètre TForm qui recevrait Form1. Voici un exemple de code pour situer mon pb :
    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
    var
      Form1: TForm1;
    
      procedure Suite(Forme:TForm);
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Suite(Form1); // ou Suite(Self)
    end;
    
    procedure Suite(Forme:TForm);
    begin
      with Forme do
        begin
          Canvas.Brush.Color:=clRed; // <----- cette ligne fonctionne
          //Edit1.Text:='Toto';  // <----------- celle-ci plante !!!
          Form1.Edit1.Text:='Toto'; // <------- celle-ci fonctionne (normal)
        end;
    end;
    Pourquoi ce plantage ?

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

  5. #5
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par alainvh Voir le message
    Ok, je confonds donc ici le type (TForm) et le name (Form1) : mais c'est très grave, ça
    l'humour, ça me va bien, mais c'est pourtant un peu méchant : en effet, pour une fois que nous n'en avons, ici en Champagne, en plein hiver (soleil toute la journée, exceptionnel !)
    overload (surcharge) ne me convient pas. En fait, j'ai un ensemble de procédures et fonctions qui me permettent l'affichage des drives accessibles (avec leurs types -disque dur, disquettes, la présence ou non d'une disquette dans le lecteur, etc...) : ces procédures utilisent RadioGroup, Memo, etc... Je trouvais donc chouette de pouvoir atteindre ces composants par un passage de paramètre Form comme dans mon exemple. Vu que cela ne marche, je vais faire dans le lourd. Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure ListDrives(RG:TRadioGroup;M:TMemo; etc...);
     
    // les appels seront du style :
    ListDrives(Form4.RadioGroupDrives,Form4.MemoDrives, etc...);
    J'espérais n'utiliser qu'un paramètre Form pour éviter la multiplicité des paramètres à passer.

    Merci pour ton aide.
    Cordialement
    Alain
    un TFrame à partager ne serait-il pas plus indiqué ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    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
    Tiens, je viens de me rendre compte que j'ai commis une bêtise : en voulant changer le titre de la discussion (remplacement de TFont -qui était une erreur- par TForm), j'ai créé un message (à 18 h.27) qui est une citation de moi-même. N'importe quoi, excuses à tous.

    @ Paul Toth

    TFrame ? Connais pas ! Je viens de regarder dans l'aide Delphi. C'est une piste à suivre (pour demain )
    Merci.
    Ce qui est simple et évident pour soi-même ne l'est pas forcément pour les autres... et réciproquement !

  7. #7
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par alainvh Voir le message
    Edit1 n'existe pas dans TForm, il n'existe que dans TForm1
    Ok, je confonds donc ici le type (TForm) et le name (Form1) : mais c'est très grave, ça
    Non, pas exactement ...

    En fait, quand tu crées une fiche, via Delphi tu crées un type.
    Ce type, c'est TForm1, qui dérive de TForm. Ce type TForm1 contient tous les composants que tu as inséré sur ta fiche. Par la même occasion, quand tu crées une fiche via Delphi, tu crées aussi une variable du type que tu viens de creer. Cette variable est de type TForm1, et s'appelle Form1.

    Donc pour revenir a ton problème, tu peux déclarer plusieurs méthodes, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure MyProc (AForm : TForm1);
    begin
      AForm.Edit1.Text:='Voila';
    end;
    Bien sur, il faut que le type TForm1 contienne un TEdit nommé Edit1 ...

  8. #8
    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
    Bonsoir mick605,

    BINGO O O O !!! Ta solution répond parfaitement à ma demande : passer un paramètre TForm ( c'est mon vocabulaire à moi ) comme je l'imaginais, ça peut se faire !!! Voici mon code initial qui ne fonctionnait pas :
    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
    var
      Form1: TForm1;
    
      procedure Suite(Forme:TForm); // l'erreur est ici !!!
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Suite(Form1); // ou Suite(Self)
    end;
    
    procedure Suite(Forme:TForm);
    begin
      with Forme do
        begin
          Canvas.Brush.Color:=clRed; // <----- cette ligne fonctionne
          //Edit1.Text:='Toto';  // <----------- celle-ci plante !!!
          Form1.Edit1.Text:='Toto'; // <------- celle-ci fonctionne (normal)
        end;
    end;
    Voici le code corrigé :
    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
    var
      Form1: TForm1;
    
      procedure Suite(Forme:TForm1); // C'est juste ce 1 qui fait la différence
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Suite(Form1); // ou Suite(Self)
    end;
    
    procedure Suite(Forme:TForm1);
    begin
      with Forme do
        begin
          Canvas.Brush.Color:=clRed; // <----- cette ligne fonctionne
          Edit1.Text:='Toto';  // <----------- CELLE-CI NE SE PLANTE PLUS !!!
          //Form1.Edit1.Text:='Toto'; // <------- celle-ci fonctionne toujours (normal)
        end;
    end;
    Juste un petit 1 d'écart au clavier entre les deux codes, mais en fait un 1 très important parce qu'il fait appel à un objet différent !

    mick605, en remerciement, je te dirai que "la valeur n'attend pas le nombre des années" (tu as comparé nos âges ), que "le fossé inter-générationnel" n'existe pas (quoiqu'on nous le dise parfois) et que la solidarité existe encore !
    Merci aussi pour la clarté de tes explications.

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

  9. #9
    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 430
    Points
    28 430
    Par défaut
    ah, je pensais que tu avais vu dans ma réponse "il faut donc un paramètre de type TForm1...ou un TEdit"

    j'ai préféré la seconde solution car ta fonction n'est utilisable qu'avec TForm1 (ou un dérivé)...ça présente assez peu d'intérêt à priori de mettre cela dans une unité à part.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    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
    @ Paul Toth

    J'ai bien lu tout ton message, mais je n'ai pas su l'interpréter : j'ai des pb de vocabulaire et le monde des objets est encore assez flou pour moi. De plus, j'ai présenté un code-exemple naïf dans un but de simplification.
    C'est donc le code de mick605 qui m'a mis sur la voie. Mais en fait, c'est vrai que tu as "dégainé" le premier la bonne réponse.
    Merci encore, et excuses.

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

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

Discussions similaires

  1. Passer une forme (TForm) en paramètre.
    Par alainvh dans le forum Débuter
    Réponses: 5
    Dernier message: 06/03/2015, 10h52
  2. [E-00]Passer matrice en paramètre d'un fonction VBA
    Par ferdi67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/01/2009, 23h06
  3. Passer "this" en paramètre
    Par Mister_Kp dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 10/06/2008, 09h05
  4. Passer, dans un paramètre URL, une URL multi-paramètres
    Par loopx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 29/02/2008, 06h51
  5. Réponses: 2
    Dernier message: 05/04/2007, 13h55

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