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构造函数

浙公网安备 33010602011771号