delphi类在运行时确定

delphi类在运行时确定,delphi,types,Delphi,Types,Delphi XE+中是否有方法创建一个结果在运行时确定的函数 例如: function ARuntimeClass(achoice: integer): ClassType; begin case achoice of 0: Result := TEdit; 1: Result := TMemo; 2: Result := TCheckbox; 3: Result := TComboBox; end; end; 然后,在运行时: var

Delphi XE+中是否有方法创建一个结果在运行时确定的函数

例如:

function ARuntimeClass(achoice: integer): ClassType;
begin
   case achoice of
     0: Result := TEdit;
     1: Result := TMemo;
     2: Result := TCheckbox;
     3: Result := TComboBox;
   end;
end;
然后,在运行时:

var
  aComponent: TComponent;       
begin
  aComponent := FindComponent('SomeComponent234');
  //then process
  ARuntimeClass(2).Checked := True;
  aComponent := FindComponent('SomeComponent123');
  //then process
  ARuntimeClass(0).Text := 'Chosen';    
end;
我正在尝试在运行时进行类型转换。

是的,您可以使用元类类型(表示所有类类型),(表示从
TComponent
派生的类),(表示从
TControl
派生的所有类)等返回类类型作为函数结果

函数arantimeclass(achoice:integer):TControlClass;
开始
病案
0:结果:=TEdit;
1:结果:=TMemo;
2:结果:=t检查框;
3:结果:=t组合框;
终止
终止
尽管您可以简单地使用来访问对象的真正元类类型,但不需要单独的函数

然而,仅仅访问元类类型并不能真正解决您的问题。不能使用元类类型转换对象指针来访问任何类型特定的成员。对于您正在尝试的内容,您需要改为,例如:

使用老式RTTI(D2010之前):

使用
…,TypInfo;
变量
a组件:t组件;
aProp:PPropInfo;
开始
aComponent:=FindComponent('SomeComponent234');
//然后处理
pProp:=GetPropInfo(一个组件,'Checked');
如果aProp nil,则SetOrdProp(组件,aProp,True);
aComponent:=FindComponent('SomeComponent123');
//然后处理
aProp:=GetPropInfo(一个组件,'Text');
如果aProp=nil,那么aProp:=GetPropInfo(一个组件,'Caption');
如果aProp nil,则设置TRPROP(一个组件,aProp,‘已选择’);
终止
使用新型增强型RTTI(D2010+):

使用
Rtti;
变量
a组件:t组件;
ctx:trtti上下文;
rType:trttype;
rProp:trtti属性;
开始
aComponent:=FindComponent('SomeComponent234');
//然后处理
rType:=ctx.GetType(aComponent.ClassType);
rProp:=rType.GetProperty('Checked');
如果为rProp nil,则为rProp.SetValue(组件,True);
aComponent:=FindComponent('SomeComponent123');
//然后处理
rType:=ctx.GetType(aComponent.ClassType);
rProp:=rType.GetProperty('Text');
如果rProp=nil,则rProp:=rType.GetProperty('Caption');
如果rProp nil,则rProp.SetValue(一个组件,'selected');
终止

你的例子毫无意义。您的
arantimeclass
返回元类(如
TEdit
),但您的代码的其余部分似乎假设它返回实际对象(实例)。此外,我不知道
aComponent
行与
arantimeclass
行有什么关系。这是我的目标,我不确定是否可以做到。例如,用户在屏幕上选择一个TEdit,所以我想调整它的文本属性,但我不知道将选择哪个组件,不同的组件具有不同的属性。为什么不能使用元类类型强制转换对象指针来访问任何类型特定的成员?@SilverWarior,因为Pascal语言根本不是这样工作的。类型转换必须在编译时已知,这样编译器才能为它们发出正确的代码。用于保存元类类型的变量在运行时之前是未知的,因此不能在类型转换中使用。那么什么用法不能用于类型转换呢?这个操作符永远存在于pascal语言中,甚至在RTTI出现之前,就已经用于类型转换。当然,与RTTI不同,类操作符不提供任何保护,因此您可以很容易地将对象类型化为错误的类,并通过这样做破坏破坏。这就是为什么很多人避免使用它们。谢谢你,雷米。这似乎是我需要的。听起来这项技术也可以在运行时用作属性编辑器。。。