为什么论坛不给我发表这个问题?

wljcr 2001-11-07 04:20:18
我想做一个数据敏感的控件,但不是从数据库敏感控件中继承下来,例如我想把
EDit做成数据敏感空间,但是又不能像TDBEdit那样只要设置
DataSouce和DataField就可以的,我想在其上加上DataBaseName(对应的数据库名)和TableName(数据库中的某一个表名)属性,
但是怎么才能像TTable控件那样在这两个属性设置上有下拉框呢?我看过TTable控件关于这两个
属性的定义,其中DatabaseName属性实在其父类TDBDataset中定义的,但是它是个String类型
TableName属性是一个TFileName属性,另外在TSession中有这样两个函数: procedure GetTableNames(const DatabaseName, Pattern: string;
Extensions, SystemTables: Boolean; List: TStrings);
procedure GetDatabaseNames(List: TStrings);
请问该如何才能解决让DatabaseName和TableName属性在Obeject Inspcetor出现下拉框?
多谢了
...全文
102 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Snakeguo 2001-11-28
  • 打赏
  • 举报
回复
^
txinfo 2001-11-08
  • 打赏
  • 举报
回复
参考一下这个组件
{ author:zxi
email:zxi@hitoday.com
}

unit ZxiDbaseEdit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,db,dbtables,DsgnIntf;

type

TMyStringProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure GetValueList(List: TStrings);virtual; abstract;
procedure GetValues(Proc: TGetStrProc); override;
end;

TMyDatabaseNameProperty = class(TMyStringProperty)
public
procedure GetValueList(List: TStrings); override;
end;
TMyTableNameProperty = class(TMyStringProperty)
public
procedure GetValueList(List: TStrings); override;
end;


TZxiDbaseEdit = class(TCustomEdit)
private
{ Private declarations }
FDataBase:TDatabase;
FTableName,
FDatabaseName:String;


procedure SetTableName(Value:String);
procedure SetDataBaseName(Value:String);
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
property Tablename:String read FTableName write SetTableName;
property Database:TDatabase Read FDataBase write FDataBase;
property DatabaseName:String read FDatabaseName write SetDataBaseName;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('张玺', [TZxiDbaseEdit]);
RegisterPropertyEditor(TypeInfo(string), TZxiDbaseEdit, 'DatabaseName', TMyDatabaseNameProperty);
RegisterPropertyEditor(TypeInfo(string), TZxiDbaseEdit, 'Tablename',TMyTableNameProperty);

end;

{ TDbFieldProperty }

function TMyStringProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paValueList, paSortList, paMultiSelect];
end;

procedure TMyStringProperty.GetValues(Proc: TGetStrProc);
var
I: Integer;
Values: TStringList;
begin
Values := TStringList.Create;
try
GetValueList(Values);
for I := 0 to Values.Count - 1 do Proc(Values[I]);
finally
Values.Free;
end;
end;

{ TMyFieldNameProperty }

procedure TMyDatabaseNameProperty.GetValueList(List: TStrings);
var
DBAdo : TZxiDbaseEdit;
ASession:TSession;
begin
DBAdo := GetComponent(0) as TZxiDbaseEdit;
ASession:=TSession.Create(nil);
Asession.Name:='session_1';
Asession.AutoSessionName:=true;
try
ASession.GetDatabaseNames(List);
finally
Asession.free;
end;
end;

{ TZxiDbaseEdit }

procedure TZxiDbaseEdit.SetDataBaseName(Value: String);
begin
if FDatabaseName<>Value then
FDatabaseName:=Value;
end;

procedure TZxiDbaseEdit.SetTableName(Value: String);
begin
if FTableName<>Value then
FTableName:=Value;
end;

{ TMyTableNameProperty }

procedure TMyTableNameProperty.GetValueList(List: TStrings);
var
DBAdo : TZxiDbaseEdit;
ASession:TSession;
DbName:String;
begin
DBAdo := GetComponent(0) as TZxiDbaseEdit;
DbName:=DbAdo.DatabaseName;
if DbName='' then
raise exception.Create('请先指定databaseName属性!');
ASession:=TSession.Create(nil);
Asession.Name:='session_2';
Asession.AutoSessionName:=true;
try
ASession.GetTableNames(DbName,'',false,false,List);
finally
Asession.free;
end;
end;

end.
chenjiong 2001-11-08
  • 打赏
  • 举报
回复
关注、
wljcr 2001-11-08
  • 打赏
  • 举报
回复
上!
wljcr 2001-11-08
  • 打赏
  • 举报
回复
先谢谢了,我看看
wljcr 2001-11-07
  • 打赏
  • 举报
回复
我看代码看得头都晕了,我好惨呀!帮帮忙呀
cobi 2001-11-07
  • 打赏
  • 举报
回复
重点关注

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧