DELPHI 构造函数传参

需求:

窗体A  调用窗体B   ,窗体B又调用 FrameC.现在要把A中的一个值 S 传给FrameC.然后执行P过程.P在执行的过程中需要用到值S.

我最开始的设想大概如下(这是不对的):

窗体A
procedure
TMaterial2.ModifyInformationClick(Sender: TObject); //修改物料信息 begin var fm:=TForm1.Create(nil);//创建窗口B fm.information:='abc'; fm.showmodal; end;
窗体B
procedure TForm1.FormCreate(Sender: TObject); begin var FRM := TMaterial3.Create(Self); //创建FRAMEC FRM.Parent := Self; FRM.Align := alClient; FRM.information:=information; FRM.BinData; end;

以上是一个错误的示范. TForm.Create的时候,information还是空值,fm.information:='abc'; 赋值被排在窗体B创建的后面去了.再去执行FRM.BinData;时程序就报错了

正确的方法如下:

//窗体A
Var val:='abc';
Var fm:=TFormB.CreateA(nil,val);    //注意这里是自定义的构造函数
fm.showmodal;    
fm.free
//窗体B
type
TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } Finformation: string; public { Public declarations } constructor createA(AOwner: TComponent; AInformation: string); reintroduce; property Information: string read Finformation; end; var Form1: TForm1; implementation {$R *.dfm} constructor TForm1.createA(AOwner: TComponent; AInformation: string); begin inherited Create(AOwner); Finformation := AInformation; end; procedure TForm1.FormCreate(Sender: TObject); begin var FRM := TMaterial3.Create(Self); //创建FORMC FRM.Parent := Self; FRM.Align := alClient; FRM.information := FInformation; FRM.BinData; end;

 

窗体B中有三个构造函数,分别是FormCreate,Create,CreateA,它们的运行顺序如下:

1.窗体A中首先执行了CreateA,提前把参数传递了过去.

2.CreateA 中继承了父级的Create构造函数.

3.Create构造函数又触发了窗体B中原有的FormCreate构造函数

 

posted @ 2025-11-11 06:57  一曲轻扬  阅读(18)  评论(0)    收藏  举报