delphi 无法访问从模式窗体上的FormCreate调用的过程中的VCL组件(即直接在打开窗体后)

wooyq4lh  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(211)

当我打开一个模式窗体(Form2)时遇到运行时错误,该窗体在创建时调用另一个使用VCL组件执行某些操作的过程。以下程序演示了该问题。
下面是模态表单上的代码:

procedure DoLabel;
begin
  form2.Label1.Caption := 'A';
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  DoLabel;
end;

这编译得很好。但是,程序在打开模态窗体时崩溃。调试器说:* 地址xxxx处的访问冲突 *。这可能是一个基本错误,但我做错了什么?以及如何解决这个问题?

wswtfjt7

wswtfjt71#

您使用的是全局变量Form2,该变量在TForm2对象仍在构造时尚未赋值(或根本没有赋值)。
您需要更改代码,使其在构造过程中不依赖于该变量(最好将其完全删除,除非TForm2是在启动时自动创建的,这听起来并不像是自动创建的)。
例如,将表单的Self指标,或什至是TLabel指标,当做DoLabel()的输入参数传递,例如:

procedure DoLabel(ALabel: TLabel);
begin
  ALabel.Caption := 'A';
end;

procedure DoFormStuff(AForm: TForm2);
begin
  // use AForm as needed...
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  DoLabel(Label1);
  DoFormStuff(Self);
end;

不过,在这种情况下,让DoFormStuff()(也可能是DoLabel())成为TForm2类的成员而不是自由函数会更有意义:

procedure TForm2.FormCreate(Sender: TObject);
begin
  DoLabel;
  DoFormStuff;
end;

procedure TForm2.DoLabel;
begin
  Label1.Caption := 'A';
end;

procedure TForm2.DoFormStuff;
begin
  // use Self as needed...
end;

相关问题