从不工作的孩子更新孩子

时间:2014-01-24 18:26:43

标签: delphi

表单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.

1 个答案:

答案 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,而不是在范围内。

修复应该是明确的:删除局部变量,并将您在那里创建的表单分配给适当的变量。

然而,对你来说,适当的解决办法就是自动创建表单,因为你无所畏惧地使用它们。如果使用模块间依赖关系这么糟糕,你最终会一次又一次地遇到相同类型的问题,当你试图访问它们时就不会创建。