• 全部
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
  • 问答

从已有的控件继承编写控件时,如何才能屏蔽父类已经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;
...全文
41 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
要麼用組合, 不用繼承!!!
回复
这样是不行的,
要不然你把TdxDBGrid重新封装一下,把他的那些属性移到public中;
或者你用同名的属性重载它的
回复
lzx130 2004-05-11
高实在是高~~~~~
回复
ly_liuyang 2004-05-11
恐怕不行的
回复
发帖
Delphi
创建于2007-08-02

4870

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2004-05-11 03:58
社区公告
暂无公告