确定Delphi 6类对象是否是使用字符串形式的类名的派生类?

Rob*_*ler 4 delphi inheritance class rtti

出于记录和报告的原因,我创建了具有属于异常的类名和消息的对象.我这样做,所以我不必管理Exception对象的生命周期.我想要做的是恢复RTTI识别的优点,它允许您使用Delphi 6中的" is "运算符来判断对象是否来自给定的类.

有没有办法以字符串形式使用类名来判断字符串包含的类是否派生自另一个类?

假设我有一个存储在strClassName中的对象类,该类是"derivedClass".此外,derivedClass派生自baseClass.是否有一个我可以编写的函数可以判断strClassName中的字符串形式的类是否是从baseClass派生的?例如:

// Hypothetical function that returns TRUE if the class in strClassName is
//  derived from the class passed in theBaseClass
function isDerivedClass(strClassName: string; theBaseClass: TAnyClass): boolean;
Run Code Online (Sandbox Code Playgroud)

那种方法的主体会是什么样子?

Ser*_*yuz 10

function isDerivedClass(strClassName: string; theBaseClass: TClass): boolean;
begin
  Result := FindClass(strClassName).InheritsFrom(theBaseClass);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  RegisterClass(TLabel); // must be registered to be found by FindClass/GetClass

  if isDerivedClass('TLabel', TWinControl) then
    ..
Run Code Online (Sandbox Code Playgroud)


如果您不希望在找不到名为'strClassName'的类时引发异常,请使用GetClass而不是FindClass:

function isDerivedClass(strClassName: string; theBaseClass: TClass): boolean;
var
  aClass: TClass;
begin
  Result := False;
  aClass := GetClass(strClassName);
  if Assigned(aClass) then
    Result := aClass.InheritsFrom(theBaseClass);
end;
Run Code Online (Sandbox Code Playgroud)