delphi - 如何使用泛型创建不同类型的 MDI 子项?

标签 delphi generics vcl mdi

我需要将 MDI 子窗体的创建集中到 Delphi (VCL) 中的一个独特过程中。这个想法是每次创建 MDI 子窗体时执行一些操作,无论其类型如何,即将其标题名称添加到列表中以访问该 MDI 子窗体。像这样:

   procedure TMainForm<T>.CreateMDIChild(const ACaption : String);
    var
      Child: T;
    begin
      { create a new MDI child window }
      Child := T.Create(Application);
      Child.Caption := ACaption;
      // add this child to the list of active MDI windows
      ...
    end;

   procedure TMainForm.Button1Click(Sender : TObject);
   begin
       CreateMDIChild<TMdiChild1>('Child type 1');
       CreateMDIChild<TMdiChild2>('Child type 2');
       ...

但是,我没有泛型经验。任何帮助我都会很感激。 非常感谢。

最佳答案

您可以定义一个类来通用创建表单(使用泛型),并具有如下类约束:

TGenericMDIForm <T:TForm> = class
  class procedure CreateMDIChild(const Name: string);
end;

通过这个实现:

class procedure TGenericMDIForm<T>.CreateMDIChild(const Name: string);
var
  Child:TCustomForm;
begin
  Child := T.Create(Application);
  Child.Caption := Name + ' of ' + T.ClassName + ' class';
end;

现在,您可以使用它来创建 MDICHil 表单不同的类:

procedure TMainForm.Button1Click(Sender: TObject);
begin
   TGenericMDIForm<TMdiChild>.CreateMDIChild('Child type 1');
   TGenericMDIForm<TMdiChild2>.CreateMDIChild('Child type 2');
end; 

使用class constraint与通用TGenericMDIForm <T:TForm> = class ,你可以避免有人尝试使用这样的东西 TGenericMDIForm<TMemo>.CreateMDIChild('Child type 1');类不是 TForm后裔。

关于delphi - 如何使用泛型创建不同类型的 MDI 子项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62105235/

相关文章:

delphi - 为动态数组分配内存 - block 头已损坏 (FastMM4)

delphi - 在TFileStream的构造函数中指定“FILE_SHARE_READ或FILE_SHARE_WRITE”时,Delphi XE3提供EFOpenError

generics - 在 Rust 中使用 traits 的通用函数

Java 泛型 - 为什么 <Object> = new <specialization> 不允许?

delphi - 如何检查表单是否已关闭?

德尔福。如何禁用 TFileOpenDialog 和 TOpenDialog 的 Vcl 主题

delphi - Delphi&JVCL-JvWizard,在运行时添加页面

delphi - 在 Delphi 2006 上使用 IdSMTPServer 拒绝超过一定大小的 SMTP 消息

java - 在 Java Collections Map<Key,?> 中 "?"指的是什么?

delphi - AnimateWindow幻灯片