表单10创建并显示form11和form11创建并显示form12。然后form12尝试更新form10(成功)上的控件,form11上的控件(访问冲突)和form12上的控件(成功)。为什么我得到一个访问冲突更新中间表单,form11。评论说30和31不起作用,我想知道为什么请。 30正在更新中间形式。 31是旁边,没有相关但它不起作用,我不知道它为什么会炸弹。
1: unit Unit10;
2:
3: interface
4:
5: uses
6: Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7: Dialogs, StdCtrls;
8:
9: type
10: TForm10 = class(TForm)
11: Button1: TButton;
12: procedure Button1Click(Sender: TObject);
13: private
14: { Private declarations }
15: public
16: { Public declarations }
17: end;
18:
19: var
20: Form10: TForm10;
21:
22: implementation
23: uses Unit11;
24:
25: {$R *.dfm}
26:
27: procedure TForm10.Button1Click(Sender: TObject);
28: var
29: fForm11 : TForm11;
30: begin
31: fForm11 := TForm11.Create(Application);
32: fForm11.show;
33: end;
34:
35: end.
1: unit Unit11;
2:
3: interface
4:
5: uses
6: Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7: Dialogs, StdCtrls;
8:
9: type
10: TForm11 = class(TForm)
11: Button1: TButton;
12: procedure Button1Click(Sender: TObject);
13: private
14: { Private declarations }
15: public
16: { Public declarations }
17: end;
18:
19: var
20: Form11: TForm11;
21:
22: implementation
23: uses Unit12, Unit10;
24:
25: {$R *.dfm}
26:
27: procedure TForm11.Button1Click(Sender: TObject);
28: var
29: fForm12 : TForm12;
30: begin
31: form10.Button1.Caption := 'done';
32: fForm12 := TForm12.Create(Self);
33: fForm12.show;
34: end;
35:
36: end.
1: unit Unit12;
2:
3: interface
4:
5: uses
6: Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7: Dialogs, StdCtrls;
8:
9: type
10: TForm12 = class(TForm)
11: Button1: TButton;
12: procedure Button1Click(Sender: TObject);
13: private
14: { Private declarations }
15: public
16: { Public declarations }
17: end;
18:
19: var
20: Form12: TForm12;
21:
22: implementation
23: uses Unit11, Unit10;
24:
25: {$R *.dfm}
26:
27: procedure TForm12.Button1Click(Sender: TObject);
28: begin
29: Form10.Button1.Caption := 'Unit10';
30: //Form11.Button1.Caption := 'Unit11'; //get an access violation
31: //Form12.Button1.Caption := 'Unit12'; //get an access violation
32: Button1.Caption := 'Unit12'; //this same as 31 without Form12 prefix
33: end;
34:
35: end.
答案 0 :(得分:4)
您需要更加关注变量名称,声明和使用。
在您发布的代码中,您有两个与Form11
相关的完全独立的变量。
第一个是IDE自动添加的全局 Form11
(如果您没有自动创建表单,则应将其删除,因为这是其存在的唯一原因)第一个地方),在interface
的{{1}}部分声明:
Unit11.pas
第二个是名为type
TForm11 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form11: TForm11
的 local 变量,您在按钮点击处理程序中在fForm11
中声明了该变量:
Unit10.pas
第二个是您正在为您创建的表单的实际实例分配的那个:
procedure TForm10.Button1Click(Sender: TObject);
var
fForm11 : TForm11;
begin
您在procedure TForm10.Button1Click(Sender: TObject);
var
fForm11 : TForm11;
begin
fForm11 := TForm11.Create(Application); // Assigns to the *local* fForm11
fForm11.show; // Shows this copy of the form
end;
中使用的那个,您在其中评论过它并提到它导致访问冲突的是全球 Unit12
,这是唯一的一个在此代码中可见:
Form11
问题是您从未创建procedure TForm12.Button1Click(Sender: TObject);
begin
Form10.Button1.Caption := 'Unit10';
//Form11.Button1.Caption := 'Unit11'; //get an access violation
//Form12.Button1.Caption := 'Unit12'; //get an access violation
Button1.Caption := 'Unit12'; //this same as 31 without Form12 prefix
end;
的实例并将其分配给TForm11
;您创建并将其分配给 local Form11
,而不是在范围内。
修复应该是明确的:删除局部变量,并将您在那里创建的表单分配给适当的变量。
然而,对你来说,适当的解决办法就是自动创建表单,因为你无所畏惧地使用它们。如果使用模块间依赖关系这么糟糕,你最终会一次又一次地遇到相同类型的问题,当你试图访问它们时就不会创建。