使用函数registerclasses注册的窗体;
创建函数为
procedure TFrmMain.CreateForm(const AFormName,AFormClass: string);
begin
  if not assigned(AFormName) then
  begin
    if getclass(AFormClass) <> nil then
    TFormClass(FindClass(AFormClass)).create(self).show;
  end;
end;现在问题是执行创建函数FrmMain.CreateForm('form1','TForm1');时无效;
而如果上述创建函数改成
procedure TFrmMain.CreateForm(const AFormName,AFormClass: string);
begin
    if getclass(AFormClass) <> nil then
    TFormClass(FindClass(AFormClass)).create(self).show;
end;
则又无法限制连续执行;就是一个窗体可以无限次创建。

解决方案 »

  1.   

    Assigned好像只对指针类型有效吧
      

  2.   

    for i:=0 to self.MDIChildCount-1 do
       if self.MDIChildren[i].Name = AFormName then
       begin
         formisexist:=true;
         self.MDIChildren[i].Show;
         break;
       end;if not formisexist then
      TFormClass(FindClass(AFormClass)).create(self).show;
      

  3.   

    procedure TFrmMain.CreateForm(const AFormName,AFormClass: string);
    var AForm: TForm;
    begin
     if getclass(AFormClass) <> nil then
     begin
       AForm := TForm(FindComponent(AFormName));
       if Assigned(AForm) then 
         (FindComponent(AFormName) as TFormClass(FindClass(AFormClass))).show
       else
       TFormClass(FindClass(AFormClass)).create(self).show;
     end;
    end;
      

  4.   

    {
    TMenuItem.Tag = (1000000~1000099)
    TToolButton.Tag = (1000100~1000199)Create by Lzhang
    }unit UMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, DBGridEh, DB, ADODB, PropStorageEh, DBSumLst, DBLookupEh,
      DBCtrlsEh, StdCtrls, Mask, PropFilerEh, Buttons,  Menus,
      ActnList, ComCtrls, ToolWin, ExtCtrls, ImgList, jpeg;const   CM_CreateForm = WM_User + 102 ; //生成窗体type
      TFrmMain = class(TForm)
        ActionList1: TActionList;
        ActCreateForm: TAction;
        MenuMain: TMainMenu;
        N123121: TMenuItem;
        NMessageTest: TMenuItem;
        NHookTest: TMenuItem;
        ToolBar1: TToolBar;
        TbtnMessageTest: TToolButton;
        TBtnHookTest: TToolButton;
        TbtnTypeTest: TToolButton;
        ImageList1: TImageList;
        NTypeTest: TMenuItem;
        Image1: TImage;
        TbtnDatabaseTest: TToolButton;
        procedure ActCreateFormExecute(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      protected
        procedure CMCreateForm(var message: TMessage); message CM_CreateForm;
        procedure InitSystem;
      public
        { Public declarations }
      end;var
      FrmMain: TFrmMain;implementation
    uses PubDM, clipbrd ;{$R *.dfm}
    procedure TFrmMain.FormCreate(Sender: TObject);
    begin
      InitSystem;      
    end;procedure TFrmMain.InitSystem;
    var I,J: integer;
    begin
    //初始化ToolButton, TMenuItem控件的点击的点击事件
      for I := 0 to FrmMain.ComponentCount - 1 do
      with  FrmMain.Components[I] do
      begin
        if (Tag <> 0) and (ClassType <> nil) then
        begin
          if ClassName = 'TMenuItem' then   //Menuitem菜单条的单击事件
          begin
             TmenuItem(FrmMain.Components[I]).OnClick := ActCreateFormExecute;
          end      else if  ClassName = 'TToolButton' then
          begin
             TToolButton(FrmMain.Components[I]).OnClick := ActCreateFormExecute;
          end
          
        end;
      end;
    end;     
    procedure TFrmMain.ActCreateFormExecute(Sender: TObject);
    var AFormClass, AFormName: string;
    begin
      if Sender is TMenuItem then
      begin
        AFormName := 'Frm'+Copy((sender as TMenuItem).Name,2,length((sender as TMenuItem).Name)-1);
        AFormClass := 'T'+AFormCLass;
      end  else if sender is TToolButton then
      begin
        AFormName := 'Frm'+Copy((sender as TToolButton).Name,5,length((sender as TToolButton).Name)-1);
        AFormClass := 'T'+AFormName;
      end;  sendmessage(self.Handle,CM_CreateForm,Longint(pchar(AFormClass)),Longint(pchar(AFormName)));
    end;procedure TFrmMain.CMCreateForm(var message: TMessage);
    var AForm: TForm;
    begin
      if Getclass(pchar(Message.WParam)) <> nil then
      begin
        AForm := TForm(FindComponent(pchar(Message.LParam)));
        if Assigned(AForm) then
          (FindComponent(pchar(Message.LParam)) as TFormClass(FindClass(Pchar(Message.WParam)))).Show
        else TFormClass(FindClass(Pchar(Message.WParam))).Create(self).Show;
      end;
      inherited;
    end;end.