我要给自定义控件加一个对象类型的属性, 而这个对象又是一个可视或者不可视的控件。 (100分)

  • 主题发起人 主题发起人 地平线
  • 开始时间 开始时间

地平线

Unregistered / Unconfirmed
GUEST, unregistred user!
我要给自定义控件加一个对象类型的属性, 而这个对象又是一个可视或者不可视的控件。
怎样才是正确的做法。
例如:
private
FAdoQry:TADOQuery;
published
property ADOQuery:TADOQuery read FADOQry write FADOQry;
//上一句中是不是应该写成 ...write SetFADOQry更好;
//可是我在SetFADOQry中写
{
procedure SetFADOQry(Value:TADOQuery);
begni
FADOQry.Assign(Value);
end;
控件编译通过,可在使用时只要一设置ADOQry属性时就提示:
Access violoation as address 024728BA in moudel 'LN.bpl'.Read of
Address FFFFFFFF
}
刚开始学习编控件,问题多多,大虾们多帮帮忙呀。
 
你必须在你的控件包*.DPK它的OPTIONS=》DESCRIPTION页=》BUILD CONTROL配置项里
选种REBUILD AS NEEDED。然后把你的DPK安装到你的IDE里。
 
onedot:
你的方法我试了
没有作用
还和以前一样报错。
 
那问题就在你控件的代码吧
如果你的控件先不注册安装,仅仅作为一个UNIT和类包含在你一个测试PROJECT里出错吗?!
编译成功是不够的!
作为控件的测试,首先是不要注册安装,用上面方法测试都正确后再注册安装
 
我明白我的错误了,
我在构造数中创建了一个AdoQuery控件。
在设计时,把我的控件一放到窗体上,一个AdoQuery也被创建了。而使用这个控件
的单元没有声明uses ADODB。这就是报以上错误的原因。

可我的本意是在用户运行程序时创建这个AdoQuery。而不是在设计时创建,应该怎么做?
 
f:tadoquery;
f:=tadoquery.create(self);
 
那你应该把这个作为一个属性存在,这个属性类似于你看DATASOURCE控件的DATASET属性一样
你的控件只是引用该属性对应的对象方法或属性
你可以参考一下VCL里的DATASOURCE控件的代码//VCL是最好的学习资料
 
我现在的处理方法是:
private
ADOQry:TADOQuery;
published
property:ADOQry:TADOQuery read FADOQry write FADOQry;
在构造函数里就没有再对ADOQry进行处理了。
在设计时由组件使用者把ADOQry属性设置为一个TADOQuery控件。
我不知道这样做有没有什么问题?
谁能给我一个答案?
 
没有问题!
 
你那样作没有问题,完全可以设置这个AdoQry的属性
只是在函数
procedure SetFADOQry(Value:TADOQuery);
begni
FADOQry.Assign(Value);
end;
FAdoQry对象并没有被创建,才会出现地址错误!
如果你不想创建FAdoQry对象,你只能将Value赋值给FAdoQry
FAdoQry := Value;
直接赋值又会出现如下问题:
如果将你赋值给AdoQry属性的TAdoquery控件删除后,则你的自定义控件将会出现地址
引用错误。
 
用下面的程序可以解决mxchao提到的错误情况:

在SetFADOQry中要这样写:
procedure SetFADOQry(Value:TADOQuery);
begni
FAdoQry := Value;
if FAdoQry <> nil then
FreeNotification(Self);
end;

调用FreeNotification函数的作用是当FAdoQry被删除时
能够自动调用Notification函数

然后你还需要重载Notification函数:
procedure Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = FAdoQry) then
FAdoQry := nil;
end;
这样,当在设计时窗体上的FAdoQry被删除时,就不会提示内存错误。
 
后退
顶部