【问题标题】:How to access TPanel child form controls?如何访问 TPanel 子窗体控件?
【发布时间】:2013-07-20 03:08:10
【问题描述】:

我有一个带有TPanel 的主表单。我还有一个Form2 和一个TButton,我小时候在TPanel 中展示过。我的意思是主窗体的TPanelForm2 的父级。我使用这些步骤在MainFormOnCreate方法中创建form2

MainFormOnCreate()

Form2 := TForm2.create(nil)
Form2.Parent := Panel1;
Form2.show;

但问题是当我访问Form2 上的按钮时,它什么也没做。例如,当我想禁用Form2 上的按钮时,我使用此方法

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

btn2OnClick();
Form2.btn.enabled := false;

但它什么也没做。有朋友说是因为孩子到TPanel会收不到消息。

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

【问题讨论】:

  • 你还没有发布任何真实的代码。 (MainFormOnCreate()btn2OnClick() 不是可以编译的实际代码,没有beginend,而且您根本没有显示Form2 的定义位置。)请edit 您的问题和发布一些实际代码和变量声明,以便我们尝试帮助您。

标签: forms delphi parent delphi-xe3 tpanel


【解决方案1】:

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

您的.dpr 文件如下所示

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

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

TForm1.btn5.OnClick 事件中,您处理第二个创建的、不可见的TForm2


解决方案

  • 转到项目/选项 -> 公式并从自动创建列表中删除TForm2
  • 将在TForm1 内部创建的TForm2 的实例存储在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;

【讨论】:

  • “为了避免内存泄漏..” - 父控件(必须是 wincontrol)承担销毁其控件的责任。
【解决方案2】:

试试这个

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多