在 Delphi 11 Alexandria中的Windows 10中的一个32位VCL应用程序中,我尝试编写一个小应用程序,它可以从用户在编辑框中输入的类名中找到ANCESTORS列表:
procedure TForm1.DoShowAncestors(const aClassName: string);
var
ClassRef: TClass;
begin
lstAncestors.Clear;
// Does not work:
//ClassRef := TClass.Create;
//ClassRef.ClassName := aClassName;
// [dcc32 Error] E2076 This form of method call only allowed for class methods or constructor:
ClassRef := TClass(aClassName).ClassType;
while ClassRef <> nil do
begin
lstAncestors.Items.Add(ClassRef.ClassName);
ClassRef := ClassRef.ClassParent;
end;
end;
procedure TForm1.edtClassNameKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_RETURN then
begin
DoShowAncestors(Trim(edtClassName.Text));
end;
end;
但是,问题是要将输入字符串转换为TClass
对象,请参见上面的错误注解。
2条答案
按热度按时间wribegjk1#
由于 Delphi 是一种编译语言,通过名称获取类(或对象)不是一个自然的操作,而是需要某种框架。
幸运的是,现代的RTTI(
uses RTTI
)可以轻松地为您解决这一问题:试试看
例如,可以使用其他类型的设备。
(Of当然,这只适用于最终EXE中实际包含的类。)
pbpqsu0x2#
现在不再需要输入完全限定的类名,并且现在在编辑中有一个对类名的可视反馈验证:
这是DFM: