在父窗体中访问子窗体继承的控件
Access a control inherited by the child form in parent form
我用的是Delphi XE3。我有两种形式,TParentForm 和 TChildForm。 TParentForm包含Button1,TChildForm继承自它。
那么我在TParentForm中操作Button1时,在下面的过程中TParentFrm.Button2Click(Sender: TObject),是不是在调用ChildForm.Show 并单击 Button1?
type
TParentFrm = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TChildForm = class(TParentFrm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
ParentFrm: TParentFrm;
implementation
{$R *.dfm}
procedure TParentFrm.Button2Click(Sender: TObject);
begin
Button1.Caption := '&Test'; // Is it operating on Childform's button1 when I
// create and show child form and then click
//"Button2".
end;
Test unit:
procedure TForm1.Button1Click(Sender: TObject);
begin
ChildForm.Show;
end;
简答:
您的代码将更改与您单击的 Button2 位于同一窗体实例上的 Button1 控件的标题。
长答案:
当您使用代码 Button1.Caption := '&Test';
时,您基本上是在指示计算去查找名为 Button1
的组件并将其 Caption
属性 更改为 &Test
。当计算机执行此搜索时,它总是在调用代码的表单实例中执行此操作。
因此,如果您的代码是从放置在 ParentForm
上的按钮触发的 OnClick 事件调用的,它将影响 ParentForm
上的 Button1
。
如果代码是从您的 ChildForm
上的按钮触发的 OnClick 事件调用的,它将影响您的 child 表单上的 Bu8tton1
。
是的,此时您的应用程序有两个名为 Button1
的按钮。一个在您的 ParentForm
上,另一个在您的 ChildForm
上
事实上,您还可以创建 ParentForm
的另一个实例,然后单击该表单上的 Button2
将影响该表单实例上的 Button1
,而不是原始实例你的 ParentForm
.
希望我的解释足够容易理解。如果没有,请告诉我。
TChildForm
继承自 TParentForm
。 TParentForm
的任何成员——不是严格私有的——都是从 TChildForm
实例继承和访问的。当您创建 TChildForm
的实例时,它具有从其父 class 继承的 Button1 实例,即 TParentForm
.
不要混淆类型(a的定义class)和实例(简称:运行时分配的数据)
如果您创建了 TChildForm
的两个实例(调用构造函数),您也有两个不同的 button1 和 button2 实例。一个实例的 Button2 OnClick
处理程序将在与其自身相同的 TChildForm
实例中充当 button1 实例。
在我看来,在完全理解继承背后的一般机制之前,您应该远离表单继承。
我用的是Delphi XE3。我有两种形式,TParentForm 和 TChildForm。 TParentForm包含Button1,TChildForm继承自它。
那么我在TParentForm中操作Button1时,在下面的过程中TParentFrm.Button2Click(Sender: TObject),是不是在调用ChildForm.Show 并单击 Button1?
type
TParentFrm = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TChildForm = class(TParentFrm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
ParentFrm: TParentFrm;
implementation
{$R *.dfm}
procedure TParentFrm.Button2Click(Sender: TObject);
begin
Button1.Caption := '&Test'; // Is it operating on Childform's button1 when I
// create and show child form and then click
//"Button2".
end;
Test unit:
procedure TForm1.Button1Click(Sender: TObject);
begin
ChildForm.Show;
end;
简答: 您的代码将更改与您单击的 Button2 位于同一窗体实例上的 Button1 控件的标题。
长答案:
当您使用代码 Button1.Caption := '&Test';
时,您基本上是在指示计算去查找名为 Button1
的组件并将其 Caption
属性 更改为 &Test
。当计算机执行此搜索时,它总是在调用代码的表单实例中执行此操作。
因此,如果您的代码是从放置在 ParentForm
上的按钮触发的 OnClick 事件调用的,它将影响 ParentForm
上的 Button1
。
如果代码是从您的 ChildForm
上的按钮触发的 OnClick 事件调用的,它将影响您的 child 表单上的 Bu8tton1
。
是的,此时您的应用程序有两个名为 Button1
的按钮。一个在您的 ParentForm
上,另一个在您的 ChildForm
事实上,您还可以创建 ParentForm
的另一个实例,然后单击该表单上的 Button2
将影响该表单实例上的 Button1
,而不是原始实例你的 ParentForm
.
希望我的解释足够容易理解。如果没有,请告诉我。
TChildForm
继承自 TParentForm
。 TParentForm
的任何成员——不是严格私有的——都是从 TChildForm
实例继承和访问的。当您创建 TChildForm
的实例时,它具有从其父 class 继承的 Button1 实例,即 TParentForm
.
不要混淆类型(a的定义class)和实例(简称:运行时分配的数据)
如果您创建了 TChildForm
的两个实例(调用构造函数),您也有两个不同的 button1 和 button2 实例。一个实例的 Button2 OnClick
处理程序将在与其自身相同的 TChildForm
实例中充当 button1 实例。
在我看来,在完全理解继承背后的一般机制之前,您应该远离表单继承。