菜鸟问题:关于全局变量 ( 积分: 50 )

  • 主题发起人 主题发起人 gfxwst
  • 开始时间 开始时间
G

gfxwst

Unregistered / Unconfirmed
GUEST, unregistred user!
全局变量在主窗口,主窗口已引用子窗口,要从子窗口赋值,怎么办?
 
with ChildForm := TForm.Create do
Somevalue := Globalvalue //把全局变量赋给子窗体中的变量Somevalue
 
应该反过来, 子窗口引用主窗口, 子窗口就可以对主窗口的全局变量赋值了
 
这样就是循环引用了, 最好把全局变量发在一个公共单元, 这样让主,子单元引用公共单元。

建议: 少用,慎用全局变量, 不要循环引用。
 
to duhai_lee:
如何避免对窗体的循环引用呢.
如: 主窗体要打开子窗体, 当然要引用子窗体.
如果子窗体要使用主窗体, 或执行主窗体的过程, 必然造成循环引用.
这时候如何避免呢?
 
应当就事论事 lz既然这样做一定有他的理由, 如果子窗体也需要引用主窗体的话,为了避免循环引用,可以把一个uses 的引用放在interface 处,而另一个uses的引用放在implementation处
 
如果真的不想循环引用,更不想用一个公用单元来解决,用事件机制可以达到楼主的要求

MainForm中定义一个方法
procedure TMainForm.SetValue(iValue: integer);
begin
MainForm.全局变量:= iValue;
end;

ChildForm中这样定义

type
TEvent_SetValue=procedure(iValue: integer) of object;

property OnSetValue: TEvent_SetValue read FOnSetValue write FOnSetValue;

赋值操作时需要执行
Self.OnSetValue(新的值);

MainForm调用ChildForm时需要
ChildForm.OnSetValue:= MainForm.SetValue;
 
to fjw
你写的情况也一样会发生循环引用,
大多数情况下, 子窗口的打开首先就会要主窗体引用子窗体,
ChildForm.OnSetValue:= MainForm.SetValue这句话又发生了子窗体引用了主窗体.
平时有循环引用时好象也没出什么问题.
那么, 循环引用到底有什么后果呢?
 
深受启发,感谢大家!
我采用了zhuangqr的方法,比较简单.
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
923
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部