Accès à différentes proprités d'une forme parent à partir de son enfant

Soyez le premier à donner votre avis sur cette source.

Vue 2 587 fois - Téléchargée 415 fois

Description

Bonjour,

Ceci est mon premier code et je voulais savoir comment les experts considères ma façon de penser pour ça.

Voici la situation :
J'ai une forme "FORM1" qui crée au en cliquant sur un bouton une Forme2 "FORM2". Jusque là c'est pas trop compliqué.
Par contre, j'ai besoin que la forme 2 aie accès à différentes propriété ou composant de la forme 1.

Je connais bien les uses et les références circulaire donc la plupart du monde mettre le uses de la Forme1 après l'implementation de la forme2.

Voici ce que moi je fais et je voulais savoir si c'est "mieux" que d'avoir plein de uses....

Source / Exemple :


//Ma forme 1

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

//Je supprime ces variables par réflexe, comme ça je suis sûr quand je crée ma forme qu'elle est seulement dans la procédure qui la crée
//var
//  Form1: TForm1;

implementation
//Use de ma forme 2 pour pouvoir la créer et y accéder
uses Unit2;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  lUnit2 := TForm2;
begin
  //Crée ma forme
  lUnit2 := TForm.Create(Self);
  lUnit2.Parent := Self;
  //Ici j'assigne le edit de la forme1 à la propriété de ma forme2 pour pouvoir y avoir accès dedans
  lUnit2.p_EditForm1 := Edit1;
  //L'affiche en show modal
  lUnit2.ShowModal;
  //Vérifie si elle existe toujours et la libère
  if Assigned(lUnit2) then
    FreeAndNil(lUnit2);
end;

end.

//Ma forme 2

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
    FEdit : TEdit;
  public
    { Déclarations publiques }
    property p_EditForm1 : TEdit read FEdit write FEdit;
  end;

//Je supprime ces variables par réflexe, comme ça je suis sûr quand je cré ma forme qu'elle est seulement dans la procédure qui la crée.
//var
//  Form2: TForm2;

implementation
//En principe j'aurais fait un use de ma forme 1 ici. Mais comme j'enlève la variable globale de la forme, je ne pourrais plus y accéder de toute façon
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  //Si ma propriété à été défini
  if Assigned(p_EditForm1) then
    //Je change le text de la forme1 pour celui de la forme 2
    p_EditForm1.Text := Edit1.Text;
end;

end.

Conclusion :


D'après vous, quoi vous en pensez

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
18 novembre 2011

Bonjour, j'ai lu ton code et il me semble que tu as fais une erreur en ligne 82, car p_EditForm1 appartient à Tform2
alors qe c'est le contriaire que tu veux et que tu fais
et en ligne 86 tu dis que tu change le texte de la fiche1 par celui de la fiche2
82.procedure TForm1.Button1Click(Sender: TObject);
83.begin
84. //Si ma propriété à été défini
85. if Assigned(p_EditForm1) then
86. //Je change le text de la forme1 pour celui de la forme 2
87. p_EditForm1.Text := Edit1.Text;
88.end;

En programmation objet, il n'y a que la fiche principale qui connait (uses) les autres fiches, les autres fiches doivent être indépendantes l'une de l'autre.
Pour que la fiche2 reçoive des informations de la fiche1 et sans que la fiche2 connaissent(uses) la fiche1, il faut créer un objet intermédiaire, qui lui sera connue des deux fiches, tu le crées et tu le remplis dans la première fiche et tu le transmets à la seconde de la même manière que tu as fait avec p_editForm1. A l'affichage de la fiche2, tu vérifies que la propriété est assignée et si oui tu en extrais les informations sur les propriétés de la fiche2
Messages postés
21
Date d'inscription
jeudi 10 juin 2004
Statut
Membre
Dernière intervention
20 juin 2007

Effectivement philnext pour ce code qui est très simpliste ce serait possible
Par contre, dans le cas d'une forme complexe avec beaucoup de code, ça deviendrais assez spaghetti comme code je crois.
Messages postés
9
Date d'inscription
dimanche 11 juillet 2004
Statut
Membre
Dernière intervention
29 novembre 2010

Pourquoi pas...
En fait dans ce genre de cas de figure tu peux aussi ne pas créer visuellement de Unit2, et créer avec du code, ta deuxième TForm.
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
et un zip du projet..
Messages postés
21
Date d'inscription
jeudi 10 juin 2004
Statut
Membre
Dernière intervention
20 juin 2007

J'utilise Delphi 6 Enterprise avec toutes les updates
pour le SE ça dépend mais plus à 90% du temps WindowsXP
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.