确定Delphi 6类对象是否是使用字符串形式的类名的派生类?
出于日志记录和报告的原因,我创建了类名和消息属于异常的对象。我这样做是为了不必管理异常对象的生存期。我想做的是恢复RTTI标识的优点,它允许您使用Delphi6中的“is”操作符判断对象是否来自给定类 有没有一种方法可以使用字符串形式的类名来判断字符串包含的类是否派生自另一个类 假设一个对象的类存储在strcassname中,该类是“derivedClass”。此外,derivedClass是从基类派生的。是否有一个我可以编写的函数可以判断strClassName中字符串形式的类是否派生自基类?例如:确定Delphi 6类对象是否是使用字符串形式的类名的派生类?,delphi,class,inheritance,rtti,Delphi,Class,Inheritance,Rtti,出于日志记录和报告的原因,我创建了类名和消息属于异常的对象。我这样做是为了不必管理异常对象的生存期。我想做的是恢复RTTI标识的优点,它允许您使用Delphi6中的“is”操作符判断对象是否来自给定类 有没有一种方法可以使用字符串形式的类名来判断字符串包含的类是否派生自另一个类 假设一个对象的类存储在strcassname中,该类是“derivedClass”。此外,derivedClass是从基类派生的。是否有一个我可以编写的函数可以判断strClassName中字符串形式的类是否派生自基类?
// 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;
该方法的主体是什么样的
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
..
如果您不希望在找不到名为“strcassname”的类时引发异常,请使用
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;
从你的第一段中有两件事我不明白。首先,为什么要使用异常进行日志记录?我希望记录异常,但不是你认为异常如何使记录更容易。第二,你最初是如何丢失RTTI的,以至于你需要恢复它的?@RobKennedy-我没有使用异常来记录日志,我记录异常。当异常发生在组件的深处时,我会创建另一个对象,该对象携带异常的相关信息,并传递给系统的其他部分进行审计和报告。因为我不想担心另一个对象的生存期,所以我将该信息(如异常类名、消息等)以字符串形式存储在新对象中,而不是携带原始异常。这就是RTTI“丢失”的时候。您正在使用异常的
ClassName
函数,那么?使用ClassType
直接获取TClass
值,跳过FindClass
路径。@RobKennedy-这是一个很好的提示,谢谢。