我自己设计一了控件
基类继承自Ehlib的TDBGridEh
完成后加入自已的工程调试完成可在最后生成包时编译通不过
系统提示“[Error] Never-build package 'ucctTools' requires always-build package 'EhLib70'”百思不得其解
后将基类换成TDBGrid编译又成功
可一将基类换成TDBGridEh就是不行,还是上面的错误我真的想继承自TDBGrid,大家帮帮忙啦!!!
基类继承自Ehlib的TDBGridEh
完成后加入自已的工程调试完成可在最后生成包时编译通不过
系统提示“[Error] Never-build package 'ucctTools' requires always-build package 'EhLib70'”百思不得其解
后将基类换成TDBGrid编译又成功
可一将基类换成TDBGridEh就是不行,还是上面的错误我真的想继承自TDBGrid,大家帮帮忙啦!!!
或者做到 EhLib70 包中
谢谢你的回答,我待会就做此试验。不过在此前时间内,我将程序改动了一下,暂时改用继承自DBGRid
单独测试时(即新建一有窗体的应用程序,将此类单元包含进去,编译测试)
用代码创建了一个类的实便,设置其相关可见属性(父容器、位置、尺寸),都能正常显示可当我将他加入包中,编译生成控件后
在一新的有窗体的应用程序中,通过放置控件测试时,却发生了一个奇怪的问题
数据怎么都不出来。按理说我将控件放到窗体上,便不到需要调用此类的构造函数(Creat)了,可实际上不行
我不调用这个函数,整个程序都报错,因为我在构造函数中动态创造了Ado连接和Ado查询现附上源代码,敬请指教
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.
我如果想引用此控件,即使将此控件放置到窗体上,也必须显示的调用它的的构造函数
Create,控件内部的Ado连接、Ado查询等才能正常使用。可我一显示的执行DBGrid11:=TDBGrid1.Create(nil);
它就新创建了一个对象,而不是我原来放置到窗体上的那个对象了。//********************************************************
问题出在那里????
//********************************************************
constructor Create(AOwner: TComponent); Override;
事件中将
inherited Create(nil);该为inherited Create(AOwner);
按你要求改后,已不需要显示地调用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不是一个设计时包
//*******************************************************************这可该如何是好只剩这个小问题了
诸位师兄长师姐得再拉我一把
动态创建一个TDataSetProvider对象后(如DataSetProvider1)
如何把这个对象付值给ClientDataSet因为DataSetProvider1创建后,它们Name为空,不能用:
ClientDataSet1.ProviderName:=DataSetProvider1.Name;
即使先手动设置DataSetProvider1.Name:='DataSetProvider1'也不行!????