Delphi从子表单更新父表单控件

时间:2014-01-24 00:11:19

标签: delphi

从表单中,我创建并显示第二个表单。从第二种形式我想更新第一个窗体上的控件。但我违反了访问权限。我可以使用autocreate中的表单来处理它,但是当我使用create方法创建表单时,我得到了违规。

以下是一个例子。如果我在autocreate中使用表单11运行它,它可以工作(我更新第一个表单中的按钮标题)。但是,如果在单元10中,如果我注释掉form11.show;,并且我取消注释创建和节目,然后从自动创建中取出Form11,则会出现访问冲突。

问题 - 当我使用create方法创建表单时,如何从显示的表单更新父表单。

Unit10

unit Unit10;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm10 = class(TForm)
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
  Form10: TForm10;
implementation
uses Unit11;
{$R *.dfm}
procedure TForm10.Button1Click(Sender: TObject);
var
  fForm     : TForm11;
Begin
//        fForm := Form11.Create(Self);  //This and next line give me access violation
//        fForm.Show;           //   with form11 out of autocreate
   form11.show;            //This works with form11 in the autocreate.
end;
end.

Unit11

unit Unit11;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm11 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form11: TForm11;
implementation
uses unit10;
{$R *.dfm}
procedure TForm11.Button1Click(Sender: TObject);
begin
form10.button1.caption := 'Changed';
end;
end.

2 个答案:

答案 0 :(得分:7)

这是不正确的:

fForm := Form11.Create(Self)

应该是这样的:

fForm := TForm11.Create(Self)

TForm11,而不是Form11。要创建对象,必须通过类调用构造函数。

答案 1 :(得分:2)

我总是让我的表单自动创建,并且无法想到不这样做的理由,但这可能是导致问题的原因:
需要在类上调用Create方法,而不是在变量上调用。

这一行可能会创建一个新的TForm11实例:


    fForm := TForm11.Create(Self);