动态生成控件,但是类要根据条件才能知道,如何解决?(高分)(100分)

  • 主题发起人 主题发起人 轻音乐
  • 开始时间 开始时间

轻音乐

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库访问,要根据访问的数据库不同,动态生成不同类的控件,
比如 paradox 用BDE Table:=TTable.create(self);
Oracle 用ODAC Table:=TOraTable.create(self);
但是查询部分还想要统一的。
DataSource1.DataSet:=Table;
DBgrid.DataSource:=DataSourec1;
我怎么才能实现。(或有其他办法)
分可以再加
 
你可以为数据集控件起名一样的,只不过类型可以是bde或odac的,连接当然也一样了.
 
to 唐太宗
能详细些吗,具体如何做,谢谢
 
用到一个类类型的概念,给你一个示范

procedure TForm1.FormCreate(Sender: TObject);
var
c: tclass;
o: Tobject;
begin
if Assigned(Sender) then
c := tstringlist
else
c := tlist;
o := c.Create;
end;
 
to Adnil 未能通过没有相应属性,再帮我看一看。

var
Form1: TForm1;
BDE_Table: TClass;
MyTable: Tobject;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
BDE_Table:= TTable;
MyTable:= BDE_Table.Create;
MyTable.DatabaseName:='c:/db'; 有错误 提示:Undeclared identifier: 'DatabaseName'
end;
 

BDE_Table:= TTable;
MyTable:= BDE_Table.Create;

这是在干什么?老大,用一句通俗的话来说就是脱裤放屁

你就好好的这么来:
MyTable:=TTable.Create(nil);
MyTable.DataBaseName:='test1' //这里是bde的别名,老大不是路径
MyTable.TableName:='a.db' //这是paradox库的文件名
 
->MyTable.DatabaseName:='c:/db'; 有错误 提示:Undeclared identifier: 'DatabaseName'
改为:(MyTable as ttable).DatabaseName:='c:/db';
 
同意WindBell所说的,问题就在这里!
可惜迟了一步。
 
各位兄弟我要作的就是想根据条件来确定类,而且公共部分不变,请看我题目,
如果:(MyTable as ttable).DatabaseName的话,公共部分就没法统一了
 
var dbt:TObject;
if paradox then dbt:=TTable.Create(Self) else dbt:=TOraTable(Self);
 
to 唐太宗 你的方法和前面的一样,没有相应的属性
如:dbt.databasename 报错
请大家写全些,并自己也试一试
 
谁有更详细的例子呀
 
没用过TOraTable,是从TTable派生的吧?
TDBType=(SN_ORACLE,SN_MSSQL,SN_SYBASE);
TOraTable=class(TTable)
end;
TMssqlTable=class(TTable)
end;
TSybaseTable=class(TTable)
end;

TTableClass =class of TTable;

procedure connectDB(dbType:TDBType);
var
Form1: TForm1;
tblC:TTableClass;
table:TTable;

implementation

{$R *.dfm}
procedure connectDB(dbType:TDBType);
begin
case dbType of
SN_ORACLE:
tblC :=TOraTable;
SN_MSSQL:
tblC :=TMssqlTable;
SN_SYBASE:
tblC :=TSybaseTable;
end;

table:=tblC.Create(nil);
table.DatabaseName :='c:/db';
end;
 
to savenight, 我没有看懂,能解释一下吗,若oraTable不是从TTable派生的如何作?
 
>>若oraTable不是从TTable派生的如何作?
所有的类都是从TObject派生的,也就是说,你可以找到它们共同的基类,然后再强制
转换。。。
 
如果不是从TTable派生,就没有DatabaseName属性。
 
to savenight
没有databasename属性也可以,oratable有session属性,
关键是怎么才能出现它应有的属性
 
TOraTable、TMssqlTable、TSybaseTable 。。。必须是从一个基类继承下来,并且这个基类必须要有
你所希望得到的公用的属性。这里如果你需要session属性的话,你就要找到有session属性的基类。
 
同意savenight
 
后退
顶部