我正在使用Delphi 2009,我的应用程序包含一个数据模块,其上有一个名为“Globals”的自定义组件。
在应用程序的另一种形式中,我正在尝试更改Globals组件上的已发布属性(字符串):
dm.Globals.qhProject := _ProjectName.Text; //always gives access violation
_ProjectName控件是TLabeledEdit后代。如果包装盒中有任何文字,我总是会在此处获得访问权限。
但是,如果我手动将字符串分配给属性,我就不会得到AV:
dm.Globals.qhProject := 'some text'; //works
这是qhProject属性的声明:
FqhProject: string;
property qhProject: string read FqhProject write FqhProject;
我无法弄清楚为什么这里有AV。我试过移动表单/数据模块的自动创建顺序,但我总是得到AV。
我在这里做错了什么?
更新
我正在使用Billenium Effects TFormContainer在应用程序中的不同表单之间切换。这里涉及的两种形式都在表单容器中。一种形式TdlgSummary包含以下内容:
procedure TdlgSummary.SyncVars;
begin
dm.Globals.qhProject := _ProjectName.Text
end;
另一种形式TdlgFinalize包含以下内容:
dlgSummary.SyncVars;
如果我在dlgSummary中运行SyncVars,它可以正常工作。如果我从dlgFinalize调用它,我会得到AV。这似乎是问题的症结所在,但我无法弄清楚出了什么问题。即使我将控制权切换到dlgFinalize,dlgSummary也没有被销毁,因为我可以回到它。有什么想法吗?
答案 0 :(得分:4)
在我看来,_ProjectName是 nil 。尝试在此行放置一个断点并检查_ProjectName,看看它是否提供了有效的引用。