对象之间的引用分配内存出错,望高手指点。(100分)

  • 主题发起人 主题发起人 xieyongyi
  • 开始时间 开始时间
X

xieyongyi

Unregistered / Unconfirmed
GUEST, unregistred user!
自己定义了A类和B类(继承至Tobject),数据模块类:C。在A中有一个私有变量对象DataModule(是C类对象),在B中有一个私有变量对象DataAccess(是A类对象),但是在B中创建这个DataAccess对象时,在运行到给DataModule对象分配内存时,确提示出错。
但是如果不在B中使用,就能通过。望高手能指点我在delphi中对象之间的引用的正确使用方法是什么啊。
 
各位知道,告诉我一声啊。先谢谢了。
 
能把代码贴出来吗?
 
代码没有留下,因为不能调试,所以换了一种方式来使用。不过感觉没有设想的这种好,所以上来问问,就是相当于在一个类中有一个其他类的对象(B类),而这个其他类的对象中又有另一个数据模块类的对象(C类),在B类的Create中建立C类就会出现问题。但是如果直接使用B类就没有问题。
 
你的问题听起来复杂,但明白了你的意思后并不是很复杂,呵呵。。。。
在一个类中引用其他类的对象时,你要么先建立最早的类,要么把后面的类向前申明。
Tc=class(Tdatamodule)
end;

Ta=class(Tobject)
private
datamodule:Tc;
end;

Tb=class(Tobject)
private
dataaccess:Ta;
end;
顺序是最重要的。
 
hygsxy对楼主要问的理解好像不正确吧,不过我也还不理解
 
类的嵌套是没关系的,应该是你代码的问题
 
看一下,随手写的代码(大体是这样的):
TDataModule1=class(TDataModule)
……
end;

TDB=class(TObject)
private
User_DataModule:TDataModule1
public
constructor create
……
end;

tbookdb=class(TObject)
private
User_Tdb:TDB
constructor create
……
end;


constructor TDB.Create;
begin
User_DataModule:=TDataModule.create
……
end;

constructor Tbookdb.Create;
begin
User_Tdb:=TDB.create
……
end;

就这样差不多的代码了,运行到 User_DataModule创建的时候就提示指向地址有错了。

 
我运行的时候不是指向地址有错,而是抛出一个EResNotFound异常,这个异常是在
TDataModule.create函数中调用InitInheritedComponent(Self, TDataModule)函数引发的,这个函数功能是从.dfm文件中读出数据模块的属性值,而你是在代码中创建的数据模
块,所以就没有这个.dfm文件,因此就引发了一个找不到资源的EResNotFound异常,然而
如果你是在delphi的ide中通过新建一个数据模块时,系统会自动给你创建这个数据模块的
.dfm文件,所以就不会出现你上面的那种情况。
 
ghc_x的叙述应该是正确的.不过因为你所写的代码是随手所写.而在程序当中一般的DataModule我想都是正统创建的,不晓得这是不是你的错误的原因.(这只会导致异常而不是地址错误)
从理论上讲,这种嵌套时没有什么问题的.我想还是你的具体代码的问题(比如有的自定义Control在创建的时候需要找到ParentForm,而这在嵌套创建有的时候可能是不存在的,如果代码没有很好的检查,就可能出现问题.或者访问Component.Owner,而这时候你把Owner:= nil,如果没有结果检查,同样会出问题)
 
谢谢各位了。
 
多人接受答案了。
 
后退
顶部