如何访问TPanel子窗体控件?

时间:2013-07-20 03:08:11

标签: forms delphi parent delphi-xe3 tpanel

我有TPanel的主要表单。我还有一个Form2 TButton,我在TPanel小时候会显示TPanel。我的意思是主要形式的Form2MainForm的父级。我使用这些步骤在OnCreate MainFormOnCreate() Form2 := TForm2.create(nil) Form2.Parent := Panel1; Form2.show; 方法

中创建form2
Form2

但问题是,当我访问Form2上的按钮时,它什么也没做。例如,当我想要禁用btn2OnClick(); Form2.btn.enabled := false; 上的按钮时,我使用此方法

主窗体上的按钮2,带有点击事件

TPanel

但它什么都没做。有些朋友说这是因为孩子{{1}}没有消息。

所以给我一个解决方案。 提前致谢

2 个答案:

答案 0 :(得分:2)

主要问题是,您创建了TForm2的两个实例。

您的.dpr文件看起来像这样

begin
  Application.Initialize;
  Application.CreateForm( TForm1, Form1 );
  Application.CreateForm( TForm2, Form2 );
  Application.Run;
end.

TForm2中创建TForm1.OnCreate的实例并将此实例保存到全局变量Form2后,会创建另一个TForm2实例并将其存储到Form2中}。

TForm1.btn5.OnClick事件中,您会解决第二个已创建的,不可见的TForm2


解决方案

  • 转到项目/选项 - > 公式并从自动创建列表中删除TForm2
  • TForm2内创建的TForm1实例存储在TForm1
  • 的私有类字段中

您的代码应如下所示

.dpr 文件:

begin
  Application.Initialize;
  Application.CreateForm( TForm1, Form1 );
  Application.Run;
end.

Unit1.pas

TForm1 = class( TForm )
...
procedure FormCreate( Sender : TObject );
procedure btn2Click( Sender : TObject );
private
  FForm2 : TForm2;
  ...
end;

procedure TForm1.FormCreate( Sender : TObject );
begin
  FForm2 := TForm2.Create( Self );
  FForm2.Parent := Panel1;
  FForm2.Show;
end;

procedure TForm1.btn2Click( Sender : TObject );
begin
  FForm2.btn.Enabled := True;
end;

答案 1 :(得分:0)

试试这个

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Unit2;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    lForm: TForm;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned(lForm) then
    TForm2(lForm).Button1.Enabled:= False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  lForm := TForm2.Create(self);
  lForm.Parent := Panel1;
  lForm.Align:= alClient;
  lForm.show;
end;