通过类名动态创建Form

主窗体:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ImgList, ActnList, ToolWin;

type
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    ActionList1: TActionList;
    ImageList1: TImageList;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    StatusBar1: TStatusBar;
    procedure ToolButton1Click(Sender: TObject);
    procedure ToolButton2Click(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure ToolButton4Click(Sender: TObject);
  private
    { Private declarations }
  public

    vform: TForm;
    vFormClass: TFormClass;
    function ExistFormClass(Name: string): boolean;
    function IsInclude(FormClass: TFormClass): boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.ExistFormClass(Name: string): boolean;
var
  i: integer;
begin
  result := false;
  if self.MDIChildCount = 0 then exit;
  for i := 0 to self.MDIChildCount - 1 do
    if self.MDIChildren[i].ClassName = Name then
    begin
      result := True;
      break;
    end;
end;

function TForm1.IsInclude(FormClass: TFormClass): boolean;
var
  i: Integer;
  form: TObject;
begin
  result := false;
  for i := 0 to MDIChildCount do
  begin
    form := MDIChildren[i];
    if form is formclass then
      result := true;
  end;
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
  vFormClass := TFormClass(FindClass('TForm3'));
  if (vformClass <> nil) and (not ExistFormClass('TForm3')) then
  begin
    vForm := vformClass.Create(application);
    try
      vform.DisableAutoRange;
      vform.DisableAlign;
//      vform.FormStyle := fsMDIChild;
    finally
      vform.EnableAutoRange;
      vform.EnableAlign;
    end;
  end;

end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
  showmessage(IntToStr(self.MDIChildCount));
  showmessage(IntToStr(Application.ComponentCount)); 
end;

procedure TForm1.ToolButton3Click(Sender: TObject);
begin
  if vform = nil then
    showmessage('nil')
  else
    showmessage('not nil');
end;

procedure TForm1.ToolButton4Click(Sender: TObject);
begin
  vFormClass := TFormClass(FindClass('TForm3'));
  if (vformClass <> nil) and not IsInclude(vFormClass) then
  begin
    vForm := vformClass.Create(application);
    try
      vform.Show;
    finally
    end;
  end;
end;

end.

 

调用窗体:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ImgList, ActnList, ToolWin;

type
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    ActionList1: TActionList;
    ImageList1: TImageList;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    StatusBar1: TStatusBar;
    procedure ToolButton1Click(Sender: TObject);
    procedure ToolButton2Click(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure ToolButton4Click(Sender: TObject);
  private
    { Private declarations }
  public

    vform: TForm;
    vFormClass: TFormClass;
    function ExistFormClass(Name: string): boolean;
    function IsInclude(FormClass: TFormClass): boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.ExistFormClass(Name: string): boolean;
var
  i: integer;
begin
  result := false;
  if self.MDIChildCount = 0 then exit;
  for i := 0 to self.MDIChildCount - 1 do
    if self.MDIChildren[i].ClassName = Name then
    begin
      result := True;
      break;
    end;
end;

function TForm1.IsInclude(FormClass: TFormClass): boolean;
var
  i: Integer;
  form: TObject;
begin
  result := false;
  for i := 0 to MDIChildCount do
  begin
    form := MDIChildren[i];
    if form is formclass then
      result := true;
  end;
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
  vFormClass := TFormClass(FindClass('TForm3'));
  if (vformClass <> nil) and (not ExistFormClass('TForm3')) then
  begin
    vForm := vformClass.Create(application);
    try
      vform.DisableAutoRange;
      vform.DisableAlign;
//      vform.FormStyle := fsMDIChild;
    finally
      vform.EnableAutoRange;
      vform.EnableAlign;
    end;
  end;

end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
  showmessage(IntToStr(self.MDIChildCount));
  showmessage(IntToStr(Application.ComponentCount)); 
end;

procedure TForm1.ToolButton3Click(Sender: TObject);
begin
  if vform = nil then
    showmessage('nil')
  else
    showmessage('not nil');
end;

procedure TForm1.ToolButton4Click(Sender: TObject);
begin
  vFormClass := TFormClass(FindClass('TForm3'));
  if (vformClass <> nil) and not IsInclude(vFormClass) then
  begin
    vForm := vformClass.Create(application);
    try
      vform.Show;
    finally
    end;
  end;
end;

end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值