zoukankan      html  css  js  c++  java
  • Delphi中获取某类的祖先类及其所在单元名称(使用GetTypeData(PClass.ClassInfo)函数,并且该类是从TPersistent类的派生类才可以这么使用)

    前几天在CSDN社区看到一篇《如何得到自身单元名称》的帖子,其中一位名为sdzeng网友给出了答案。受此启发,自己写了一个函数,用来获取指定类的所有祖先类的名称及其所在的单元名称。

    //参数说明:
    //AClass:需要获取祖先类的类
    //ASeries:是一个字符串列表,用来存放返回的祖先类及其所在单元的名称
    procedureGetInheritanceSeries(AClass:TClass;outASeries:TStringList);
    var
    PTD:PTypeData;
    PTI:PTypeInfo;
    PClass:TClass;
    begin
    ASeries.Clear;
    PClass:=TButton;
    if not PClass.InheritsFrom(TPersistent) then Exit;
    PTD:=GetTypeData(PClass.ClassInfo);
    ASeries.Add(Format('%s(%s)',[PClass.ClassName,PTD.UnitName]));
    repeat
    PTD:=GetTypeData(PClass.ClassInfo);
    PTI:=PTD.ParentInfo^;
    ASeries.Insert(0,Format('%s(%s)',[PTI^.Name,PTD.UnitName]));
    PClass:=PClass.ClassParent;
    untilnotPClass.InheritsFrom(TPersistent);
    end;

    使用举例

    //获取TButton类的所有祖先类及其所在单元名称
    var
    sl:TStringList;
    begin
    sl:=TStringList.Create;
    try
    GetInheritanceSeries(TButton,sl);
    Memo1.Lines.AddStrings(sl);
    finally
    sl.Free;
    end;
    end;

    返回结果如下:

    TObject(Classes)
    TPersistent(Classes)
    TComponent(Controls)
    TControl(Controls)
    TWinControl(StdCtrls)
    TButtonControl(StdCtrls)
    TButton(StdCtrls)

    补充说明

    注意上术代码中GetTypeData(PClass.ClassInfo);的使用,必须保证该类是从TPersistent类的派生类才可以这么使用,否则会抛出地址访问错误的。

    http://cmao.iteye.com/blog/2246009

  • 相关阅读:
    前端开发中一些好用的软件包。
    LeetCode 26 删除排序数组中的重复项
    算法 主定理
    算法学习计划继续三四个月
    Web Api
    DOM viewport
    CSS OM
    DOM Range Api
    DOM 操作 2
    DOM Event
  • 原文地址:https://www.cnblogs.com/findumars/p/5281345.html
Copyright © 2011-2022 走看看