Delphi 在数据模块上分配组件属性时发生访问冲突

Delphi 在数据模块上分配组件属性时发生访问冲突,delphi,datamodule,Delphi,Datamodule,我在Delphi2009上,我的应用程序包含一个数据模块,上面有一个名为“Globals”的自定义组件 在应用程序的另一种形式中,我试图更改Globals组件上的已发布属性(字符串): dm.Globals.qhProject := _ProjectName.Text; //always gives access violation _ProjectName控件是tlablededit子体。如果框中有任何文本,我总是在这里遇到访问冲突 但是,如果我手动将字符串分配给属性,则无法获得AV:

我在Delphi2009上,我的应用程序包含一个数据模块,上面有一个名为“Globals”的自定义组件

在应用程序的另一种形式中,我试图更改Globals组件上的已发布属性(字符串):

  dm.Globals.qhProject := _ProjectName.Text; //always gives access violation
_ProjectName控件是tlablededit子体。如果框中有任何文本,我总是在这里遇到访问冲突

但是,如果我手动将字符串分配给属性,则无法获得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;
dlgSummary.SyncVars;
另一个表单TdlgFinalize包含以下内容:

procedure TdlgSummary.SyncVars;
begin
    dm.Globals.qhProject := _ProjectName.Text
end;
dlgSummary.SyncVars;

如果我在dlgSummary中运行SyncVars,它可以正常工作。如果我从dlgFinalize调用它,我会得到AV。这似乎是问题的症结所在,但我不知道出了什么问题。即使我将控件切换到dlgFinalize,dlgSummary也没有被销毁,因为我可以返回到它。有什么想法吗?

在我看来,ProjectName是nil。尝试在此行放置断点并检查_ProjectName,看看它是否提供了有效的引用。

这些表单中有几个位于TFormContainer中,TFormContainer是Billenium Effects组件套件的一部分。当包含_ProjectName的表单运行上述代码时,它提供了一个有效的引用。当其他窗体运行它时,引用无效。不知道从这里到哪里去,因为我可以在表单之间来回切换,并且带有_ProjectName控件的表单还没有被销毁……进一步的细节:我似乎无法从另一个表单访问带有标签编辑(TdlgSummary)的表单。但我不明白为什么。我在uses语句中有一个源文件,我正在按如下方式访问它:dlgSummary.\u ProjectName.Text//抛出一个AVI。我不熟悉Billenium效果或表单容器,但请检查表单是否由表单容器而不是DPR创建。dlgSummary是在表单单元中声明的全局变量,但是如果Delphi在启动时没有初始化它,因为表单容器应该初始化它,而表单容器只是实例化表单类的一个实例,并将其分配给内部列表,而不是指定的全局变量,全局表单变量将保留为nil。我在黑暗中盲目射击,但看看是不是发生了这样的事……就是这样!TFormContainer正在创建表单,但未将其分配给全局变量列表。在TdlgSummary的OnCreate中添加“dlgSummary:=Self;”解决了这个问题。非常感谢你的帮助!超级答案…是的,只要您只创建一个TdlgSummary实例,就可以了。如果表单容器支持,一种更安全的方法是不要对表单使用全局变量,而是使用类似于“FormContainer.FindFormByClass(TDlgSummary);”的内容来获取引用。希望表单容器有这样的技巧来查找特定的表单。。。