加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 动态列出项目中的所有表单

发布时间:2020-12-15 09:43:00 所属栏目:大数据 来源:网络整理
导读:我想在ListBox中动态列出我的项目中存在的所有表单的名称,然后通过单击它们中的每一个,列出该表单上存在的另一个ListBox中的所有按钮. 但我不知道它是否可以实施以及如何实施. 请帮我. 谢谢 解决方法 sabri.arslan的答案是在运行时查找所有实例化表单的方法.
我想在ListBox中动态列出我的项目中存在的所有表单的名称,然后通过单击它们中的每一个,列出该表单上存在的另一个ListBox中的所有按钮.

但我不知道它是否可以实施以及如何实施.

请帮我.

谢谢

解决方法

sabri.arslan的答案是在运行时查找所有实例化表单的方法.

在评论中,哈米德要求找到一种找到未分配形式的方法.假设通过未分配,他意味着未实例化的表单,那么只有一种方法可以执行此操作,即迭代vcl流系统使用的类的注册表,以便在流式传输dfm时按名称实例化组件.

但是,IIRC,表单不会自动添加到注册表中.实际上,如果要基于其名称字符串实例化表单,则需要(ed)将它们自己添加到类注册表中. OP当然可以为他自己项目中的每个表单做到这一点.但是,这留下了一个问题,即流系统使用的类注册表是使用类单元的实现部分中的var实现的.因此不能从外部(轻松)迭代.

因此,解决方案是使用项目中所有表单单元的初始化部分,并将每个表单注册到“自己动手”的注册表中,并使用其名称和类,并让注册表提供迭代已注册表单的方法.这些方法可用于填充OP提到的列表框.

要获取表单上的TButtons,则需要实例化表单(它可能保持隐藏状态)并使用类似于sabri.arslan的答案的代码迭代组件以查找TButton实例.

实例化表单需要根据列表框中选择的表单名称从注册表中获取表单的类.

一个简单的roll-your-own表单注册表的示例:

unit Unit1;

interface

uses
  Classes,Forms,SysUtils
  ;

  procedure RegisterForm(aName: string; aClass: TFormClass);
  procedure ListForms(aNames: TStrings);
  function InstantiateForm(aName: string): TCustomForm;

implementation

var
  FormRegistry: TStringList;

procedure RegisterForm(aName: string; aClass: TFormClass);
begin
  FormRegistry.AddObject(aName,Pointer(aClass));
end;

procedure ListForms(aNames: TStrings);
var
  i: Integer;
begin
  for i := 0 to FormRegistry.Count - 1 do begin
    aNames.Add(FormRegistry[i]);
  end;
end;

function InstantiateForm(aName: string): TCustomForm;
var
  idx: Integer;
  frmClass: TFormClass;
begin
  Result := nil;
  idx := FormRegistry.IndexOf(aName);
  if idx > -1 then begin
    frmClass := TFormClass(FormRegistry.Objects[idx]);
    Result := frmClass.Create(nil);
  end;
end;

initialization
  FormRegistry := TStringList.Create;
  FormRegistry.Duplicates := dupError;
  FormRegistry.Sorted := True;
finalization
  FreeAndNil(FormRegistry);
end.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读