我因为自己的需要编写了一个自定义的控件,从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;

解决方案 »

  1.   

    这样是不行的,
    要不然你把TdxDBGrid重新封装一下,把他的那些属性移到public中;
    或者你用同名的属性重载它的
      

  2.   

    public
    proeprty DataSource;看这样可否?不过父类是从TPersistent继承的,编译器会给他的published的东西添上很多RTTI的,不知道直接移到子类的public域内是否可以“去掉”,感觉好像不可能 :P
      

  3.   

    把public放入published 测试失败:)
    把published放入public 测试失败:)
      

  4.   

    把已经published的属性,移到public里。
      

  5.   

    如果要禁止通过本控件引用它,就移到Protected或private里
      

  6.   

    aiirii(ari-爱的眼睛):我是第一次写控件,我还不会用组合的方法,能否给出简单的提示和示例代码?我试试能否移动
      

  7.   

    ahjoe(强哥) :能否给出简单示例代码?我测试不行耶:(
      

  8.   

    这个似乎是不行的所以vcl中有大量的custom级的控件,其实已经完成了所有功能,然后再继承发布想要发布的属性方法就行了
      

  9.   

    姑且不论设计 的问题。不过搂住提出的问题还是可以解决的。要想屏蔽(不显示)published属性,不那么简单。不过将它改为对外部来说只读就可以了:type
      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;————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————