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

Delphi 访问父窗体中的子窗体继承的控件,delphi,Delphi,我使用delphixe3。我有两种表格,TParentForm和TChildForm。TParentForm包含Button1,TChildForm从中继承 然后,当我在TParentForm中操作Button1时,在以下过程中TParentFrm.Button2ClickSender:ToObject,当我调用ChildForm时,它是否在ChildForm中的Button1实例上操作。显示并单击Button1 type TParentFrm = class(TForm) Butt

我使用delphixe3。我有两种表格,TParentForm和TChildForm。TParentForm包含Button1,TChildForm从中继承

然后,当我在TParentForm中操作Button1时,在以下过程中TParentFrm.Button2ClickSender:ToObject,当我调用ChildForm时,它是否在ChildForm中的Button1实例上操作。显示并单击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;


简短答复: 您的代码将更改Button1控件的标题,该控件位于您单击的Button2所在的表单实例上

长答覆: 使用代码按钮1时。标题:='测试';您基本上指示compute查找名为Button1的组件,并将其标题属性更改为&Test。当计算机执行此搜索时,它总是在从中调用代码的表单实例中执行此搜索

因此,如果从父窗体上的按钮触发的OnClick事件调用代码,则会影响父窗体上的按钮1

如果从子窗体上的按钮触发的OnClick事件调用代码,则会影响子窗体上的Bu8tton1

是的,此时您的应用程序有两个名为Button1的按钮。一个在您的父窗体上,另一个在您的子窗体上

事实上,您还可以创建父窗体的另一个实例,单击该窗体上的按钮2将影响该窗体实例上的按钮1,而不是父窗体的原始实例

我希望我的解释是可以理解的。如果没有,请告诉我。

简短回答: 您的代码将更改Button1控件的标题,该控件位于您单击的Button2所在的表单实例上

长答覆: 使用代码按钮1时。标题:='测试';您基本上指示compute查找名为Button1的组件,并将其标题属性更改为&Test。当计算机执行此搜索时,它总是在从中调用代码的表单实例中执行此搜索

因此,如果从父窗体上的按钮触发的OnClick事件调用代码,则会影响父窗体上的按钮1

如果从子窗体上的按钮触发的OnClick事件调用代码,则会影响子窗体上的Bu8tton1

是的,此时您的应用程序有两个名为Button1的按钮。一个在您的父窗体上,另一个在您的子窗体上

事实上,您还可以创建父窗体的另一个实例,单击该窗体上的按钮2将影响该窗体实例上的按钮1,而不是父窗体的原始实例

我希望我的解释是可以理解的。如果没有,请告诉我。

t ChildForm从TParentForm继承。TParentForm的任何成员(不是严格私有的)都是从TChildForm实例继承和访问的。创建TChildForm实例时,它有一个从其父类继承的Button1实例,即TParentForm

不要将类型、类的定义和实例(简称:在运行时分配的数据)混为一谈

如果创建两个调用构造函数的TChildForm实例,那么button1和button2也有两个不同的实例。一个实例的Button2 OnClick处理程序将在与自身相同的TChildForm实例中操作button1实例

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

t childform从TParentForm继承。TParentForm的任何成员(不是严格私有的)都是从TChildForm实例继承和访问的。创建TChildForm实例时,它有一个从其父类继承的Button1实例,即TParentForm

不要将类型、类的定义和实例(简称:在运行时分配的数据)混为一谈

如果创建两个调用构造函数的TChildForm实例,那么button1和button2也有两个不同的实例。一个实例的Button2 OnClick处理程序将在与自身相同的TChildForm实例中操作button1实例


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

您可能会混淆类型和实例。您有两种类型,并且可能有任意数量的这些类型的实例。你的问题毫无意义。该按钮在父类型中声明,并由子类型继承。没有子类型声明的按钮。如果要执行表单继承,则必须以不同的单位将它们分开,以便每个按钮都有相应的.dfmfile@DelphiCoder,我把它们合并在一起,以便读者更容易阅读。@DavidHeffernan,我已经更新了问题来澄清它。我不确定你是否真的理解类型和实例之间的区别。你知道你可以吗
n是否创建TParentForm和TChildForm的多个实例?我很确定这种理解对你来说是关键。你可能会对类型和实例感到困惑。您有两种类型,并且可能有任意数量的这些类型的实例。你的问题毫无意义。该按钮在父类型中声明,并由子类型继承。没有子类型声明的按钮。如果要执行表单继承,则必须以不同的单位将它们分开,以便每个按钮都有相应的.dfmfile@DelphiCoder,我把它们合并在一起,以便读者更容易阅读。@DavidHeffernan,我已经更新了问题来澄清它。我不确定你是否真的理解类型和实例之间的区别。您是否知道可以创建TParentForm和TChildForm的多个实例?我敢肯定,这种理解对你来说是关键。我会用稍微不同的措辞来回答这个冗长的问题。Button1.Caption,在本例中,在表单的方法中,类表示Self.Button1.Caption,其中Self是指向实例调用的隐藏参数:method=code+data。因此Self.Button1只是对象Self中的字段Button1;您可以在表单类的顶部看到它的声明。因此,没有什么必要去寻找;你只要取消一个指针的引用,我会用稍微不同的措辞来回答这个长答案。Button1.Caption,在本例中,在表单的方法中,类表示Self.Button1.Caption,其中Self是指向实例调用的隐藏参数:method=code+data。因此Self.Button1只是对象Self中的字段Button1;您可以在表单类的顶部看到它的声明。因此,没有什么必要去寻找;您只需取消对指针的引用。