模态窗体FormCreate事件调用过程访问VCL组件引发运行时访问冲突的问题咨询
兄弟,你这个访问违例(Access Violation)的坑我刚学Delphi的时候也踩过!本质是在FormCreate事件里直接用全局窗体变量form2访问组件根本行不通,原因很简单:
当FormCreate触发的时候,你的form2全局变量还没指向当前正在创建的这个窗体实例呢!Delphi的窗体创建流程是先构造窗体对象、触发FormCreate,之后才会把这个对象的地址赋值给全局的form2变量。这时候form2还是nil,你去访问form2.Label1,可不就触发空指针错误了嘛!
给你两种快速解决的办法:
方法一:用Self(或者直接访问组件)替代全局变量
在窗体类的方法里,Self就是当前窗体的有效实例指针,而且在FormCreate触发时已经可用了。改完的代码是这样的:
procedure TForm2.DoLabel; begin // 直接写Label1就行,类方法里会自动关联到Self的实例 Label1.Caption := 'A'; // 或者显式写Self.Label1,效果完全一样 end; procedure TForm2.FormCreate(Sender: TObject); begin DoLabel; end;
(注意:如果你的DoLabel不是窗体类的成员方法,记得把它改成类方法,这样才能直接访问组件)
方法二:把操作移到FormShow事件里
FormShow是在窗体完全创建好、全局变量form2也已经赋值之后才触发的,这时候用form2就安全了:
procedure DoLabel; begin form2.Label1.Caption := 'A'; end; procedure TForm2.FormShow(Sender: TObject); begin DoLabel; end;
不过更推荐方法一,因为依赖全局变量很容易出问题——比如以后你创建多个Form2实例,全局变量只会指向最后一个,到时候又要踩坑。
最后补个小提醒
如果是手动动态创建窗体(比如写TForm2.Create(nil)),全局变量form2根本不会自动赋值,这时候用Self就成了唯一靠谱的选择。养成在窗体内部用Self(或直接访问组件)的习惯,能避开好多这类低级错误~
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

