这个类写的有问题吗?(300分)

  • 主题发起人 主题发起人 wangfu
  • 开始时间 开始时间
W

wangfu

Unregistered / Unconfirmed
GUEST, unregistred user!
TMyClass = Class
private
FDataSet: TADODataSet;
public
property DataSet: TADODataSet read FDataSet write FDataSet;
constructor Create(ADataSet: TAdoDataSet);
end;

constructor TMyClass .Create(ADataSet: TAdoDataSet);
begin
FDataSet := ADataSet;
end;
 
没看出什么问题。
 
你的内部的DataSet需要与传进来的那个DataSet独立吗?
如果答案为True,你需要ADataSet.Clone
 
看他样子好象不需要。
 
有问题,如果ADataSet被释放就惨了,呵呵
constructor TMyClass .Create(ADataSet: TAdoDataSet);
begin
FDataSet := TADODataSet.Create(nil)

FDataSet.Recordset := ADataSet.Clone(0) ;
end;
还有重载析构方法释放DataSet.
 
我的DataSet,就是直接传入数据模块中的adodataset
不需要独立,而且还可能随时更新那个dataset呢

我现在就是不知道要不要free掉fdataset?
 
如果ADataSet先Free了你的这个类就会出错,所以你应该“订阅”通知,在ADataSet
Free的时候通知你这个类
 
你的FDataSet只是一个指针而已
 
如你所说,我这个就没有问题了呀。我的dataset是在dm中,
而dm直到程序结束的时候才free的,所以我free掉我的myclass对象的时候,也不用
管FdataSet是吗?
 
是不用管了,不过,你写的这个类也失去了类最基本的特性了,还有必要吗?
 
没什么问题,但是我觉的没什么必要[:D]
 
我只是简化了而已,其实实际中要比这个复杂,所以肯定是有必要的。
这个类我没有析构函数,有没有问题?因为只有这个传进去的参数部分不是很理解了。
 
我已经说了没有问题!
你这个对象实际上在控制另外一个对象,就是这样,那么这个对象就没必要负责
DataSet对象的释放。
 
好象没什么问题...
 
>>而dm直到程序结束的时候才free的,所以我free掉我的myclass对象的时候,也不用
>>管FdataSet是吗?
当然是这样
但如果你的类是比较通用的话,就要考虑DataSet先Free的情况了
也就是我上面说的,ADataSet Free的时候要通知你的FDataSet,把FDataSet设成nil
然后你在使用FDataSet的时候,要先判断一下FDataSet是否为nil
这样就不会因为先把ADataSet Free后再调用你的类的时候出错了。

通知的机制最简单的就是采用TComponent的Notification机制
即你的类从TComponent继承下来:
TMyClass = Class(TComponent)
private
FDataSet: TADODataSet;
protected
procedure Notification(AComponent: TComponent;
Operation: TOperation)
override;
public
property DataSet: TADODataSet read FDataSet write FDataSet;
constructor Create(ADataSet: TAdoDataSet);
end;

constructor TMyClass .Create(ADataSet: TAdoDataSet);
begin
FDataSet := ADataSet;
if ADataSet <> nil then
ADataSet.FreeNotification(Self)
//ADataSet Free的时候通知自己
end;
procedure TMyClass.Notification(AComponent: TComponent;
Operation: TOperation);
begin
if Operation = opRemove then
if AComponent = FDataSet then
FDataSet := nil
//在FDataSet指向的DataSet Free的时候把FDataSet设为nil
end;
 
不需要free掉fdataset?

它只是一个引用

保险起见

你可以在每次使用前用Assigned判断一下
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
547
import
I
I
回复
0
查看
728
import
I
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部