我因为自己的需要编写了一个自定义的控件,从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;
部分代码如下(略去了不相干的函数和过程):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;
要不然你把TdxDBGrid重新封装一下,把他的那些属性移到public中;
或者你用同名的属性重载它的
proeprty DataSource;看这样可否?不过父类是从TPersistent继承的,编译器会给他的published的东西添上很多RTTI的,不知道直接移到子类的public域内是否可以“去掉”,感觉好像不可能 :P
把published放入public 测试失败:)
TEndxDBGrid = class(TdxDBGrid)
FDataSource: TDataSource;
public
constructor Create(AOwner: TComponent);override;
destructor Destroy; override;
published
property DataSource: TDataSource read FDataSource;
end;implementationconstructor 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;————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————