在父窗体中访问子窗体继承的控件

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 继承自 TParentFormTParentForm 的任何成员——不是严格私有的——都是从 TChildForm 实例继承和访问的。当您创建 TChildForm 的实例时,它具有从其父 class 继承的 Button1 实例,即 TParentForm.

不要混淆类型(a的定义class)和实例(简称:运行时分配的数据)

如果您创建了 TChildForm 的两个实例(调用构造函数),您也有两个不同的 button1 和 button2 实例。一个实例的 Button2 OnClick 处理程序将在与其自身相同的 TChildForm 实例中充当 button1 实例。

在我看来,在完全理解继承背后的一般机制之前,您应该远离表单继承。