我有一个带有3个表单的Delphi XE+应用程序,其中2个是动态创建的,如下所示:
form_main正在触发form_equipform_equip正在触发form_certifform_main -> form_equip -> form_certif
1'st:打开form_equip
procedure Tform_main.button_equip_addClick(Sender: TObject);
var 
  form_equip: Tform_equip;
begin
  form_equip:= Tform_equip.Create(Self);
  form_equip.equip_id:= 0;
  form_equip.ShowModal;
  FreeAndNil(form_equip);
end;在form_equip上我有一个公共procedure has_changes
第二:打开form_certif
procedure Tform_equip.button_certif_addClick(Sender: TObject);
var
  form_certif: Tform_certif;
begin
  form_certif:= Tform_certif.Create(Self);
  form_certif.index:= 0;
  form_certif.ShowModal;
  FreeAndNil(form_certif);
end;现在,当我按下form_certif的OK按钮时
procedure Tform_certif.button_okClick(Sender: TObject);
begin
  //do something...
  form_equip.has_changes; //this public procedure from form_equip is not visible because form was created as local var on form_main
end;问题是,如何将发送方/父级名称传递给form_certif,以便从form_equip中看到公共过程和变量?
一个简单的方法是在unit_equip内部声明为全局的:
var 
  form_equip: Tform_equip但我避免这样做,因为form_equip是在多个不同名称的窗口中动态打开的.
发布于 2015-03-28 09:58:16
将所有需要的信息从form_equip传递到form_certif。这样,form_certif就会与form_equip的任何依赖脱钩。
procedure Tform_equip.button_certif_addClick(Sender: TObject);
var
  form_certif: Tform_certif;
begin
  form_certif:= Tform_certif.Create(nil);
  try
    form_certif.index:= 0;
    // Pass all other needed variable values to form_certif
    // including callback methods
    form_certif.Has_Changes_Method := Self.Has_Changes();
    if form_certif.ShowModal = mrOk then
    begin
      // take care of changes
    end;
  finally
    FreeAndNil(form_certif);
  end;
end;这就是它在form_certif部门中的样子:
type
  THas_Changes_Method = procedure of Object;
  TForm_Certif = class(TForm)
  ...
  private
    FIndex: Integer;
    FHasChanges: THas_Changes_Method;
  public
    property Index: Integer read FIndex write FIndex;
    property Has_Changes_Method: THas_Changes_Method read fHasChanges write fHasChanges; 
  end;发布于 2015-03-28 09:50:25
将信息作为构造函数中的参数传递。如下所示声明构造函数:
constructor Create(AOwner: TComponent; const ParentName: string);在构造函数的实现中,记下传递的名称。
发布于 2015-03-28 10:22:11
由于您是在代码中创建表单,所以可以将自定义构造函数添加到窗体中,并将其他窗体作为参数传递。
Tform_certif = class(TForm)
...
protected
  form_equip: Tform_equip;
public
  constructor Create(AOwner: TComponent; Aform_equip: Tform_equip); reintroduce;
end;
constructor Tform_certif.Create(AOwner: TComponent; Aform_equip: Tform_equip);
begin
  inherited Create(AOwner);
  form_equip := Aform_equip;
end;所以现在您可以调用form_equip.has_changes,因为它是您在构造Tform_certif表单时初始化的一个字段,它指向创建这个特定Tform_certif实例的Tform_equip的特定实例。
procedure Tform_certif.button_okClick(Sender: TObject);
begin
  //do something...
  // test whether form_equip is assigned to avoid AV by calling methods on nil object 
  if Assigned(form_equip) then form_equip.has_changes;
end;要创建您的Tform_certif,您需要使用以下代码
procedure Tform_equip.button_certif_addClick(Sender: TObject);
var
  form_certif: Tform_certif;
begin
  form_certif:= Tform_certif.Create(Self, Self);
  form_certif.index:= 0;
  form_certif.ShowModal;
  FreeAndNil(form_certif);
end;上面的构造函数代码也有变化,您只需要发送一个参数,然后在构造函数中测试AOwner是否为Tform_equip类型,并且不需要更改button_certif_addClick中的代码来使用这种解决方案。
Tform_certif = class(TForm)
...
protected
  form_equip: Tform_equip;
public
  constructor Create(AOwner: TComponent); override;
end;
constructor Tform_certif.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  if AOwner is Tform_equip then form_equip := Tform_equip(AOwner);
end;https://stackoverflow.com/questions/29315542
复制相似问题