从已有的控件继承编写控件时,如何才能屏蔽父类已经Published了的属性呢?。。。。。

littlefat 2004-05-11 03:58:56
我因为自己的需要编写了一个自定义的控件,从dxDBGrid(DevExpress公司的著名Grid控件)继承,其中封装了一个控件内部使用的DataSource和ADOStoredProc,并且在控件的Create中已经设定了ADOStoredProc->DataSource->dxDBGrid的数据连接关系,所以dxDBGrid的DataSource属性应该屏蔽掉(不出现在设计时期的Object Inspector中),但我不知道如何才能屏蔽!
部分代码如下(略去了不相干的函数和过程):

type
TListMode=(lmtop,lmQuickSearch,lmQuery,lmAll); //列出模式

TEndxDBGrid = class(TdxDBGrid)//从dxDBGrid继承
private
{ Private declarations }
FADOSP:TADOStoredProc;
FDataSource:TDataSource;
FInited:Boolean;
FProcName:String;

FLastErrorMsg: String;

procedure CursorBuzy;
procedure RestoreCursor;
procedure SetFProcName(const Value: String);

protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent);override;
destructor Destroy;override;

published
{ Published declarations }
property ADOStoredProc:TADOStoredProc read FADOSP; //发布ADOStoedProc成一个属性
end;

procedure Register;

implementation

{ TEndxDBGrid }

constructor TEndxDBGrid.Create(AOwner: TComponent);
begin
inherited;

FDataSource:=TDataSource.Create(nil);//创建控件内部使用的DataSource
FADOSP:=TADOStoredProc.Create(Self); //创建控件内部使用的ADOStoreProc
FADOSP.Name:=Self.Name+'ADOSP'; //ADOStoedProc的名字

FDataSource.DataSet:=FADOSP; //建立连接关系
Self.DataSource:=FDataSource;

FInited:=False;
end;

destructor TEndxDBGrid.Destroy;
begin
FADOSP.Close;
FADOSP.Free;
FDataSource.Free;

inherited;
end;
...全文
93 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlefat 2004-05-13
  • 打赏
  • 举报
回复
唉,不行就算了。。。

不过,怎么给分啊?我怎么找不到给分的地方 ?
lxpbuaa 2004-05-13
  • 打赏
  • 举报
回复
姑且不论设计 的问题。不过搂住提出的问题还是可以解决的。要想屏蔽(不显示)published属性,不那么简单。不过将它改为对外部来说只读就可以了:

type
TEndxDBGrid = class(TdxDBGrid)
FDataSource: TDataSource;
public
constructor Create(AOwner: TComponent);override;
destructor Destroy; override;
published
property DataSource: TDataSource read FDataSource;
end;

implementation

constructor TEndxDBGrid.Create(AOwner: TComponent);
begin
inherited;
FDataSource := TDataSource.Create(nil);
FDataSource.Name := 'InnerDataSource';
inherited DataSource := FDataSource;
end;

destructor TEndxDBGrid.Destroy;
begin
FDataSource.Free;
inherited;
end;

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
zzh54zzh 2004-05-13
  • 打赏
  • 举报
回复
设计本身有问题
qiume 2004-05-13
  • 打赏
  • 举报
回复
唉,不行就算了。。。

不过,怎么给分啊?我怎么找不到给分的地方 ?


// 右上角的"管理"
littlefat 2004-05-13
  • 打赏
  • 举报
回复
结贴。
ahjoe 2004-05-12
  • 打赏
  • 举报
回复
确实不行。
desultory 2004-05-12
  • 打赏
  • 举报
回复
这样违反了面向对象程序设计的原则了,当然不行了!
littlefat 2004-05-12
  • 打赏
  • 举报
回复
ahjoe(强哥) :能否给出简单示例代码?我测试不行耶。。。:(
littlefat 2004-05-12
  • 打赏
  • 举报
回复
aiirii(ari-爱的眼睛):我是第一次写控件,我还不会用组合的方法,能否给出简单的提示和示例代码?

我试试能否移动。。。
sdqhlyf 2004-05-12
  • 打赏
  • 举报
回复
这个问题我也曾遇到过!
iBear 2004-05-12
  • 打赏
  • 举报
回复
这个似乎是不行的

所以vcl中有大量的custom级的控件,其实已经完成了所有功能,然后再继承发布想要发布的属性方法就行了
ahjoe 2004-05-11
  • 打赏
  • 举报
回复
如果要禁止通过本控件引用它,就移到Protected或private里
ahjoe 2004-05-11
  • 打赏
  • 举报
回复
把已经published的属性,移到public里。
Eastunfail 2004-05-11
  • 打赏
  • 举报
回复
把public放入published 测试失败:)
把published放入public 测试失败:)
Eastunfail 2004-05-11
  • 打赏
  • 举报
回复
public
proeprty DataSource;

看这样可否?不过父类是从TPersistent继承的,编译器会给他的published的东西添上很多RTTI的,不知道直接移到子类的public域内是否可以“去掉”,感觉好像不可能 :P
aiirii 2004-05-11
  • 打赏
  • 举报
回复
要麼用組合, 不用繼承!!!
GreenWaterBlueSky 2004-05-11
  • 打赏
  • 举报
回复
这样是不行的,
要不然你把TdxDBGrid重新封装一下,把他的那些属性移到public中;
或者你用同名的属性重载它的
lzx130 2004-05-11
  • 打赏
  • 举报
回复
高实在是高~~~~~
ly_liuyang 2004-05-11
  • 打赏
  • 举报
回复
恐怕不行的

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧