VCL类学习之(四) TClassFinder

  1. { TClassFinder }
  2.   TGetClass = procedure (AClass: TPersistentClass) of object;
  3.   TClassFinder = class
  4.   private
  5.     FGroups: TList;
  6.   public
  7.     constructor Create(AClass: TPersistentClass = nil;
  8.       AIncludeActiveGroups: Boolean = False);
  9.     destructor Destroy; override;
  10.     function GetClass(const AClassName: string): TPersistentClass;
  11.     procedure GetClasses(Proc: TGetClass);
  12.   end;
  13. { TClassFinder }
  14. constructor TClassFinder.Create(AClass: TPersistentClass;
  15.   AIncludeActiveGroups: Boolean);
  16. var
  17.   I: Integer;
  18.   Group: TRegGroup;
  19. begin
  20.   inherited Create;
  21.   FGroups := TList.Create;
  22.   RegGroups.Lock;
  23.   try
  24.     if AClass = nil then AClass := RegGroups.ActiveClass;
  25.     for I := 0 to RegGroups.FGroups.Count - 1 do
  26.     begin
  27.       Group := RegGroups.FGroups[I];
  28.       if Group.InGroup(AClass) then
  29.         FGroups.Add(Group);
  30.     end;
  31.     if AIncludeActiveGroups then
  32.       for I := 0 to RegGroups.FGroups.Count - 1 do
  33.       begin
  34.         Group := RegGroups.FGroups[I];
  35.         if Group.Active then
  36.           FGroups.Add(Group);
  37.       end;
  38.   finally
  39.     RegGroups.Unlock;
  40.   end;
  41. end;
  42. destructor TClassFinder.Destroy;
  43. begin
  44.   FGroups.Free;
  45.   inherited;
  46. end;
  47. function TClassFinder.GetClass(const AClassName: string): TPersistentClass;
  48. var
  49.   I: Integer;
  50. begin
  51.   Result := nil;
  52.   RegGroups.Lock;
  53.   try
  54.     for I := 0 to FGroups.Count - 1 do
  55.       with TRegGroup(FGroups[I]) do
  56.       begin
  57.         Result := GetClass(AClassName);
  58.         if Result <> nil then Exit;
  59.       end;
  60.   finally
  61.     RegGroups.Unlock;
  62.   end;
  63. end;
  64. procedure TClassFinder.GetClasses(Proc: TGetClass);
  65. var
  66.   I: Integer;
  67. begin
  68.   RegGroups.Lock;
  69.   try
  70.     for I := 0 to FGroups.Count - 1 do
  71.       TRegGroup(FGroups[I]).GetClasses(Proc);
  72.   finally
  73.     RegGroups.Unlock;
  74.   end;
  75. end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值