如何使用泛型创建不同类型的 MDI Child?
How to Create MDI Child of different type with Generics?
我需要将 MDI Child 表单创建集中到 Delphi (VCL) 中的一个独特过程中。这个想法是在每次创建 MDI Child 表单时执行一些操作,无论其类型如何,即将其标题名称添加到列表中以访问该 MDI child 表单。像这样:
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');
...
但是,我没有使用泛型的经验。任何帮助,我将不胜感激。
非常感谢。
您可以使用单元 System.Generics.Collections
中的 classes。例如,为了解决类似的任务,我使用 TObjectList<TfmMDIChild>
,其中 TfmMDIChild
我自己的 class。
另一个有用的提示是,您可以根据 TObjectList
创建自己的 class 来持有 collection。
我做了这样的事情:
TWindowList = class(TObjectList<TfmMDIChild>)
public
procedure RefreshGrids;
function FindWindow(const AClassName: string; AObjCode: Integer = 0): TfmMDIChild;
procedure RefreshWindow(const AClassName: string; AObjForRefresh: integer = 0; AObjCode: Integer = 0);
procedure RefreshToolBars;
end;
您可以定义一个 class 以使用 class 约束来创建通用的表单(使用泛型),如下所示:
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 表格 classes:
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');
的 class 而不是 TForm
后代。
我需要将 MDI Child 表单创建集中到 Delphi (VCL) 中的一个独特过程中。这个想法是在每次创建 MDI Child 表单时执行一些操作,无论其类型如何,即将其标题名称添加到列表中以访问该 MDI child 表单。像这样:
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');
...
但是,我没有使用泛型的经验。任何帮助,我将不胜感激。 非常感谢。
您可以使用单元 System.Generics.Collections
中的 classes。例如,为了解决类似的任务,我使用 TObjectList<TfmMDIChild>
,其中 TfmMDIChild
我自己的 class。
另一个有用的提示是,您可以根据 TObjectList
创建自己的 class 来持有 collection。
我做了这样的事情:
TWindowList = class(TObjectList<TfmMDIChild>)
public
procedure RefreshGrids;
function FindWindow(const AClassName: string; AObjCode: Integer = 0): TfmMDIChild;
procedure RefreshWindow(const AClassName: string; AObjForRefresh: integer = 0; AObjCode: Integer = 0);
procedure RefreshToolBars;
end;
您可以定义一个 class 以使用 class 约束来创建通用的表单(使用泛型),如下所示:
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 表格 classes:
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');
的 class 而不是 TForm
后代。