两个问题,不知能不能实现?(200分)

  • 主题发起人 主题发起人 sixeight
  • 开始时间 开始时间
S

sixeight

Unregistered / Unconfirmed
GUEST, unregistred user!
1. 有几个不同类的控件,TEdit, TComboBox,动态创建控件时
procedure CreateEdit;
begin
with TEdit.Create(Owner) do
begin
//.......
end;
end;

procedure CreateComboBox;
begin
with TComboBox.Create(Owner) do
begin
//....
end;
end;
可不可能将TEdit、TComboBox用变量来代替,也就是想写成一个过程:
Procedure CreateControl(AControlType: ???)
begin
with AControlType.Create(Owner) do
//.....
end;

2. 有这种类型如 Type TmyType = (mtA, mtB)
本来我这样写:
case DataSet.FieldByName('FmyType').AsInteger of
1: TmyClass.myType := mtA;
2: TmyClass.myType := mtB;
end;
可不可将整型转换为TmyType类型,这样就不用写case了

 
1.
type
TControlType = class of TComponent;

procedure CreateControl(ControlType: TControlType);
var
Edit: TEdit;
begin
Edit := TEdit(CreateInstance(ControlTypw,Edit);//类似用法,我记不清了。
 
使用元类的方法就行
type TControlClass = class of TControl;//这里的TControl可以改成TOBject,那样就可以建立所有类型的类对象,而写做TControl则只能建立所有继承于TControl的子类对象

procedure CreateControl(ControlClass : TControlClass);
begin
with controlclass.create( owner) do begin
...
end;
end;
//若你传进来的controlclass是TEDIT则建立一个编辑框,若是TComboBox则建立一个下拉框
 
1. 如楼上各位所说的使用 “类之类”,如果不明白的话再去翻翻 Delphi Language 里面的说明;
2. 可以直接转换。
存入数据库时用 XXX.AsInteger := Integer(TMyType);
读出时用 TMyClass.MyType := TMyType(XXX.AsInteger);
 
谢谢几位的解答,再问一下,类似这两种问题属于Delphi语法知识还是面向对象的知识。
 
第一个问题属于 Delphi 语法的面向对象知识 :)
第二个问题属于 强制数据类型转换,涉及的是枚举类的存储方式
 
第二个问题一般可以用这样的解法:
Type TmyType = (mtA, mtB);
DataSet.FieldByName('FmyType').AsInteger := Ord(mtA);

用 Ord 可以获得枚举数据类型的序号,从 0 开始。
如果要从 1 开始计数,可以这样定义:
type
TMyType = (mtA = 1, mtB, mtC);
 
参考GetClass,可以直接利用Reg/GetClasss的机制,也可以根据GetClass的实现,自己实现一个TClass <-> ID 的TClassList.
 
后退
顶部