我自己设计一了控件
基类继承自Ehlib的TDBGridEh
完成后加入自已的工程调试完成可在最后生成包时编译通不过
系统提示“[Error] Never-build package 'ucctTools' requires always-build package 'EhLib70'”百思不得其解
后将基类换成TDBGrid编译又成功
可一将基类换成TDBGridEh就是不行,还是上面的错误我真的想继承自TDBGrid,大家帮帮忙啦!!!

解决方案 »

  1.   

    你应该做到一个package 中,其中包含 EhLib70 相关的文件,
    或者做到 EhLib70 包中
      

  2.   

    to:aiirii(ari-爱的眼睛) 
    谢谢你的回答,我待会就做此试验。不过在此前时间内,我将程序改动了一下,暂时改用继承自DBGRid
    单独测试时(即新建一有窗体的应用程序,将此类单元包含进去,编译测试)
    用代码创建了一个类的实便,设置其相关可见属性(父容器、位置、尺寸),都能正常显示可当我将他加入包中,编译生成控件后
    在一新的有窗体的应用程序中,通过放置控件测试时,却发生了一个奇怪的问题
    数据怎么都不出来。按理说我将控件放到窗体上,便不到需要调用此类的构造函数(Creat)了,可实际上不行
    我不调用这个函数,整个程序都报错,因为我在构造函数中动态创造了Ado连接和Ado查询现附上源代码,敬请指教
      

  3.   

    源程序如下:unit DBGrid1;interfaceuses
      SysUtils, Classes, Controls, Grids, DBGrids,DB, ADODB;type
      TDBGrid1 = class(TDBGrid)
      private
        { Private declarations }
        FAdoConn:TADOConnection;      //连接
    FQueryTemp:TADOQuery;         //临时查询
        FQueryDisp:TADOQuery;         //显示查询
    FDataSource: TDataSource;     //数据源
        FTableName:String;            //操作表名    function GetConn: String;                     //得到连接字符串
        function GetTableName: String;                //得到操作表名
        procedure SetConn(const Value: String);       //设置连接字符串
        procedure SetTabName(const Value: String);    //设置连接表名
      protected
        { Protected declarations }
      public
        { Public declarations }
        constructor Create(AOwner: TComponent); virtual;    //构造函数
        destructor Destroy; override;                       //析构函数    function Open():Boolean;
    property ConnString: String read GetConn write SetConn;
    property TableName: String read GetTableName write SetTabName;  published
        { Published declarations }
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('mytools', [TDBGrid1]);
    end;//******************************************************************************
    //构造函数
    //******************************************************************************
    constructor TDBGrid1.Create(AOwner: TComponent);
    begin   //类创建
      inherited Create(nil);
      FAdoConn:=TADOConnection.Create(nil);     //创建连接
    FQueryTemp:=TADOQuery.Create(nil);        //创建查询
    FQueryDisp:=TADOQuery.Create(nil);        //创建查询
      FDataSource:=TDataSource.Create(nil);     //创建数据源  FAdoConn.LoginPrompt:=False;              //设置新创建对象的属性
      FQueryTemp.Connection:=FAdoConn;
      FQueryDisp.Connection:=FAdoConn;
      FDataSource.DataSet:=FQueryDisp;
      DataSource:=FDataSource;
    end;//******************************************************************************
    //析构函数
    //******************************************************************************
    destructor TDBGrid1.Destroy;
    begin   //类释放
      FDataSource.Free;
    FQueryTemp.Free;
    FQueryDisp.Free;
      FAdoConn.Free;
      inherited;
    end;function TDBGrid1.GetConn: String;
    begin   //读取连接字符串
      Result:=FAdoConn.ConnectionString;
    end;function TDBGrid1.GetTableName: String;
    begin   //读取操作表名
      Result:=FTableName;
    end;procedure TDBGrid1.SetConn(const Value: String);
    begin   //设置连接字符串
      try
        FAdoConn.Connected:=False;
        FAdoConn.ConnectionString:=Value;
        FAdoConn.Connected:=True;
      except
      end;
    end;procedure TDBGrid1.SetTabName(const Value: String);
    begin   //设置操作表名
      FTableName:=Value;
    end;//******************************************************************************
    //浏览数据
    //******************************************************************************
    function TDBGrid1.Open: Boolean;
    var strTable,str:String;
        colCount:Integer;
    begin
      try
        colCount:=0;
        strTable:=FTableName;
        If FAdoConn.Connected=False then Result:=False;
        FQueryTemp.Active:=false;
        FQueryTemp.SQL.Text:='select * from ZDXXB where strTable='''+strTable+'''';
        FQueryTemp.Active:=True;
        if FQueryTemp.RecordCount>0 then
          begin
          str:=FQueryTemp.fieldbyname('strTable').AsString;
          while not FQueryTemp.Eof do     //动态创建DBGrid的列并设置属性
            begin
            Columns.Add;
            Columns[colCount].FieldName:=FQueryTemp.fieldbyname('strEName').AsString;
            Columns[colCount].Width:=FQueryTemp.fieldbyname('IntDLong').AsInteger;
            Columns[colCount].Title.Caption:=FQueryTemp.fieldbyname('strCName').AsString;
            colCount:=colCount+1;
            FQueryTemp.Next;
            end;
          end;    FQueryDisp.Active:=False;         //刷新DBGrid的数据显示
        FQueryDisp.SQL.Text:='select * from '+str;
        FQueryDisp.Active:=True;
        Result:=True;
      except
        Result:=False;
      end;
    end;end.
      

  4.   

    现在最大的问题是:
    我如果想引用此控件,即使将此控件放置到窗体上,也必须显示的调用它的的构造函数
    Create,控件内部的Ado连接、Ado查询等才能正常使用。可我一显示的执行DBGrid11:=TDBGrid1.Create(nil);
    它就新创建了一个对象,而不是我原来放置到窗体上的那个对象了。//********************************************************
    问题出在那里????
    //********************************************************
      

  5.   

    Create在Public中应定义为
    constructor Create(AOwner: TComponent); Override;
    事件中将
    inherited Create(nil);该为inherited Create(AOwner);
      

  6.   

    to:xiaolei_418() 太谢谢你了
    按你要求改后,已不需要显示地调用Creat了。现在只剩一下问题了:
    为何不能继承自TDBGridEh,我按 aiirii(ari-爱的眼睛)方法做了
    将我现有的类加入到Ehlib的包中(EhLib70)
    在编译(Compile)时一切正常//*******************************************************************
    可安装(Install)还是提示:
    “package d:\program Files\Borland\Delphi7\Projects\Bpl\Ehlib70.lib can't be installed because it is not a design time package.”
    大意是Ehlib70.lib不是一个设计时包
    //*******************************************************************这可该如何是好只剩这个小问题了
    诸位师兄长师姐得再拉我一把
      

  7.   

    还有一个新的问题:
    动态创建一个TDataSetProvider对象后(如DataSetProvider1)
    如何把这个对象付值给ClientDataSet因为DataSetProvider1创建后,它们Name为空,不能用:
    ClientDataSet1.ProviderName:=DataSetProvider1.Name;
    即使先手动设置DataSetProvider1.Name:='DataSetProvider1'也不行!????