gpt4 book ai didi

class - 在 Delphi 中通过名称获取类

转载 作者:行者123 更新时间:2023-12-03 15:47:55 29 4
gpt4 key购买 nike

我想编写一个函数,它接受类名并产生相应的TClass。我注意到,如果未注册类名,System.Classes.GetClass 函数将不起作用。

示例:

if(GetClass('TButton') = nil)
then ShowMessage('TButton not found!')
else ShowMessage('TButton found!');

之前的代码总是显示:

TButton not found!

是不是少了什么东西?

最佳答案

您可以通过扩展RTTI获取Delphi应用程序中使用的未注册类。但是您必须使用完全限定的类名来查找该类。 TButton 还不够,您必须搜索 Vcl.StdCtrls.TButton

uses
System.Classes,
System.RTTI;

var
c: TClass;
ctx: TRttiContext;
typ: TRttiType;
begin
ctx := TRttiContext.Create;
typ := ctx.FindType('Vcl.StdCtrls.TButton');
if (typ <> nil) and (typ.IsInstance) then c := typ.AsInstance.MetaClassType;
ctx.Free;
end;

注册类可确保该类将被编译到 Delphi 应用程序中。如果类未在代码中的任何地方使用并且未注册,则它不会出现在应用程序中,并且扩展 RTTI 在这种情况下将有任何用处。

无需使用完全限定类名即可返回任何类(已注册或未注册)的附加函数:

uses
System.StrUtils,
System.Classes,
System.RTTI;

function FindAnyClass(const Name: string): TClass;
var
ctx: TRttiContext;
typ: TRttiType;
list: TArray<TRttiType>;
begin
Result := nil;
ctx := TRttiContext.Create;
list := ctx.GetTypes;
for typ in list do
begin
if typ.IsInstance and (EndsText(Name, typ.Name)) then
begin
Result := typ.AsInstance.MetaClassType;
break;
end;
end;
ctx.Free;
end;

关于class - 在 Delphi 中通过名称获取类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29471798/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com