首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi:使用动态表单中的公共过程

Delphi:使用动态表单中的公共过程
EN

Stack Overflow用户
提问于 2015-03-28 09:28:19
回答 3查看 731关注 0票数 0

我有一个带有3个表单的Delphi XE+应用程序,其中2个是动态创建的,如下所示:

  • form_main正在触发form_equip
  • form_equip正在触发form_certif

form_main -> form_equip -> form_certif

1'st:打开form_equip

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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按钮时

代码语言:javascript
运行
复制
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内部声明为全局的:

代码语言:javascript
运行
复制
var 
  form_equip: Tform_equip

但我避免这样做,因为form_equip是在多个不同名称的窗口中动态打开的.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-28 09:58:16

将所有需要的信息从form_equip传递到form_certif。这样,form_certif就会与form_equip的任何依赖脱钩。

代码语言:javascript
运行
复制
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部门中的样子:

代码语言:javascript
运行
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2015-03-28 09:50:25

将信息作为构造函数中的参数传递。如下所示声明构造函数:

代码语言:javascript
运行
复制
constructor Create(AOwner: TComponent; const ParentName: string);

在构造函数的实现中,记下传递的名称。

票数 0
EN

Stack Overflow用户

发布于 2015-03-28 10:22:11

由于您是在代码中创建表单,所以可以将自定义构造函数添加到窗体中,并将其他窗体作为参数传递。

代码语言:javascript
运行
复制
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的特定实例。

代码语言:javascript
运行
复制
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,您需要使用以下代码

代码语言:javascript
运行
复制
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中的代码来使用这种解决方案。

代码语言:javascript
运行
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29315542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档