A
Another_eYes
Unregistered / Unconfirmed
GUEST, unregistred user!
onstructor tchild.create(Aparent:tfather);
begin
inherited;
if Aparent = nil then
Aparent := tfather.create;
Aparent.add(self);//if Aparent is tlist我觉得多余了。
end;
??????
if aparent = nil then
退出之后Tchild放哪去了? //是在aparent中,
// 那么Aparent呢?
// 您通过什么去访问这个aparent呀?
// 再为这个aparent建立一个TFather???
所以TChild.constructor中根本不必有aparent这个参数, aparent应该是一个
全局变量.
另外我说没必要另建一个TFather是考虑到这个TFather比较难写. 除了需要
override Destroy之外你还漏了override一个重要的过程Notification, 否则我们
考虑一下如下情况, create 了一个TChild, 然后free这个TChild会怎么样?
会在TFather中留下了一个无效指针, 等你真正free TFather时会出现access violate. 想解决这个问题, 要么override TFather.Notification过程(这
样要求你的TChild.owner必须为TFather). 要么override TChild.Destroy, 在
那里将father中的指针置nil或delete it. 这样只要求你的father是一个全局变量. 这种情况下根本没必要有个TFather, 直接用TList不一样吗?
代码如下:
var
Father: TList;
....
constructor TChild.Create;
begin
inherited;
if not assigned(father) then
father := tlist.create;
father.add(self);
end;
destructor TChild.Destroy;
begin
if assigned(father) then
begin
father.delete(father.indexof(self));
if father.count = 0 then
freeandnil(father);
end;
inherited;
end;
begin
inherited;
if Aparent = nil then
Aparent := tfather.create;
Aparent.add(self);//if Aparent is tlist我觉得多余了。
end;
??????
if aparent = nil then
退出之后Tchild放哪去了? //是在aparent中,
// 那么Aparent呢?
// 您通过什么去访问这个aparent呀?
// 再为这个aparent建立一个TFather???
所以TChild.constructor中根本不必有aparent这个参数, aparent应该是一个
全局变量.
另外我说没必要另建一个TFather是考虑到这个TFather比较难写. 除了需要
override Destroy之外你还漏了override一个重要的过程Notification, 否则我们
考虑一下如下情况, create 了一个TChild, 然后free这个TChild会怎么样?
会在TFather中留下了一个无效指针, 等你真正free TFather时会出现access violate. 想解决这个问题, 要么override TFather.Notification过程(这
样要求你的TChild.owner必须为TFather). 要么override TChild.Destroy, 在
那里将father中的指针置nil或delete it. 这样只要求你的father是一个全局变量. 这种情况下根本没必要有个TFather, 直接用TList不一样吗?
代码如下:
var
Father: TList;
....
constructor TChild.Create;
begin
inherited;
if not assigned(father) then
father := tlist.create;
father.add(self);
end;
destructor TChild.Destroy;
begin
if assigned(father) then
begin
father.delete(father.indexof(self));
if father.count = 0 then
freeandnil(father);
end;
inherited;
end;