编译没问题,就是在调用该窗口时报错:错误提示:
Project AC.exe raised exception class EClassNotFound with message 'Class TFrmUserLimit not found'. Process stopped. Use Step or Run to continue.
调用代码:
FrmName := 'TFrmUserLimit';
TFormClass(FindClass(FrmName)).Create(self).ShowModal;
下面是注册代码:
initialization
    RegisterClass(TFrmUserLimit);另:如果通过按钮直接打开这个窗口是没有任何问题的。

解决方案 »

  1.   

    这是FindClass报的错,上面错误说明没有找到TFrmUserLimit类
      

  2.   

    这样试一下var   
     fcType:TFormClass;
     f:TForm;
     frmname:string;
    begin
     try
      frmname:='TFrmUserLimit'
      fcType:=TFormClass(FindClass(frmname));
      application.CreateForm(fctype,f);
      f.Showmodal;
      f.Free;
     except
      ShowMessage('FormType not exist,you must register it first');
    end;initialization 
        RegisterClass(TFrmUserLimit); 
      

  3.   

    按你的方法试了,还是报一样的错,还是找不到TFrmUserLimit类,帮再看看,谢谢!
      

  4.   

    TFrmUserLimit
    所在的unit是怎么加入到程序的呢?是不是程序编译的时候根本就将TFrmUserLimit所在的Unit编译进去哦
      

  5.   

    上面好像少了个“没”字Unit没有被编译进程序,如果是独立的bpl 那就是bpl没有被load
      

  6.   

    在调用TFrmUserLimit单元中加入了下面的程序,如果不加下面程序,那编译都通不过implementationuses ULogon, UAccount, UUserLimit;
    {$R *.dfm}
      

  7.   

    unit UMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ImgList, Menus, ExtCtrls, ComCtrls, ToolWin;type
      TFrmMain = class(TForm)
        Splitter1: TSplitter;
        ToolBar1: TToolBar;
        ToolButton1: TToolButton;
        cmdAccount: TToolButton;
        cmdSendCard: TToolButton;
        cmdSetFoodPrice: TToolButton;
        cmdGatherData: TToolButton;
        cmdQueryConsumeData: TToolButton;
        ToolButton11: TToolButton;
        CmdClose: TToolButton;
        Panel1: TPanel;
        ImageList2: TImageList;
        ToolButton8: TToolButton;
        cmdFoodPrice: TToolButton;
        ToolButton7: TToolButton;
        MainMenu: TMainMenu;
        ImageList1: TImageList;
        cmdLimitSet: TToolButton;
        StatusBar: TStatusBar;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure cmdAccountClick(Sender: TObject);
        procedure CmdCloseClick(Sender: TObject);
        procedure N15Click(Sender: TObject);
        procedure cmdSendCardClick(Sender: TObject);
        procedure cmdSetFoodPriceClick(Sender: TObject);
        procedure cmdFoodPriceClick(Sender: TObject);
        procedure cmdQueryConsumeDataClick(Sender: TObject);
        procedure cmdGatherDataClick(Sender: TObject);
        procedure ToolButton7Click(Sender: TObject);
        procedure cmdLimitSetClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
        procedure LoadMenu;
        procedure MenuOnClick(sender:TObject);
        Function CmdLimits(CmdName:String):boolean;
        { Public declarations }
      end;var
        FrmMain: TFrmMain;
        MenuArray: array  of  TmenuItem; ///////////
        SubMenuArray : array  of  TmenuItem; ///////////
        SubMenuArray2 : array  of  TmenuItem;//////////////
    implementationuses ULogon, UAccount, USendcard, USetFoodPrice, UFoodPrice,
      UQueryConsumeData, UGatherData, UMachineSet, UDM, UModifyPWS, UUserLimit,UAddMenu,UAddUser;{$R *.dfm}procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
        FrmLogon.close;
    end;procedure TFrmMain.cmdAccountClick(Sender: TObject);
    begin
        FrmAccount := TFrmAccount.Create(Application);
        FrmAccount.ShowModal;
    end;procedure TFrmMain.CmdCloseClick(Sender: TObject);
    begin
     //   CmdFontColor(CmdClose);
        if Application.MessageBox('定要退出系统吗?', '提示', 1)=2 then
              exit;
          Close;
    end;procedure TFrmMain.N15Click(Sender: TObject);
    begin
        close;
    end;procedure TFrmMain.cmdSendCardClick(Sender: TObject);
    begin
        FrmSendcard := TFrmSendcard.Create(Application);
        FrmSendcard.ShowModal;end;procedure TFrmMain.cmdSetFoodPriceClick(Sender: TObject);
    begin
        FrmSetFoodPrice := TFrmSetFoodPrice.Create(Application);
        FrmSetFoodPrice.ShowModal;end;procedure TFrmMain.cmdFoodPriceClick(Sender: TObject);
    begin
        FrmFoodPrice := TFrmFoodPrice.Create(Application);
        FrmFoodPrice.ShowModal;end;procedure TFrmMain.cmdQueryConsumeDataClick(Sender: TObject);
    begin
        FrmQueryConsumeData := TFrmQueryConsumeData.Create(Application);
        FrmQueryConsumeData.ShowModal;end;procedure TFrmMain.cmdGatherDataClick(Sender: TObject);
    begin
        FrmGatherData := TFrmGatherData.Create(Application);
        FrmGatherData.Show;end;procedure TFrmMain.MenuOnClick(sender:TObject);
    var
        FrmName:String;
        TMenuIndex:integer;
        ExeFile:string;
        //chrFileType文件类型,1表示EXE文件,2表示窗体,0表示没有
        sSaveFile,charSavePath,TempPathStr:string;    fcType:TFormClass;
        f:TForm;
    begin    charSavePath:='';
        with Sender as TMenuItem do
        begin//
            TMenuIndex:=Tag;
            DM.ADOMenuQry.SQL.Clear;
            DM.ADOMenuQry.SQL.Add('select * from tSys_MenuInfo where MenuSysID='+IntToStr(TMenuIndex)+'');
            DM.ADOMenuQry.Open;
         {   if Trim(DM.ADOMenuQry.FieldByName('chrFileType').AsString)='1' then//等于1时表示是EXE文件运行
            begin///            TempPathStr:=PathStr + 'Sys\' + DM.ADOMenuQry.FieldByName('chrRunFile').AsString;
                if Trim(DM.ADOMenuQry.FieldByName('chrTableName').AsString) <> ''  then
                    sSaveFile := sSaveFile + Trim(DM.ADOMenuQry.FieldByName('chrTableName').AsString);            ShellExecute(0,nil,Pchar(TempPathStr),PChar(sSaveFile),PChar(charSavePath),SW_NORMAL);
            end; /// }
            if Trim(DM.ADOMenuQry.FieldByName('chrFileType').AsString)='2' then //等于2时表示是窗体调用
            begin ////
                FrmName:=DM.ADOMenuQry.FieldByName('chrRunFile').AsString;       //     Application.CreateForm(TFrmModifyPWS, FrmModifyPWS);
                try
      frmname:='TFrmUserLimit' ;
      fcType:=TFormClass(FindClass(frmname));
      application.CreateForm(fctype,f);
      f.Showmodal;
      f.Free;
    except
      ShowMessage('FormType not exist,you must register it first');   end;
                TFormClass(FindClass(FrmName)).Create(self).ShowModal;
           //     Application.CreateForm(Application.FindComponent(FrmName) as TForm
           //     (Application.FindComponent(FrmName) as TForm)
           //     (Application.FindComponent(FrmName) as TForm).Show;
            end; ////
        end;//end;procedure TFrmMain.ToolButton7Click(Sender: TObject);
    begin
        FrmMachineSet := TFrmMachineSet.Create(Application);
        FrmMachineSet.ShowModal;
    end;procedure TFrmMain.LoadMenu;
    var
        i,j,k:integer;
    begin
        DM.ADOMenuQry.SQL.Clear;
        DM.ADOMenuQry.SQL.Add('select * from V_UserMenuInfo where intlevel=0 and chrUsername='''+DM.GUserName+''' order by intMainMenuSequence,intMenuSequence');
        DM.ADOMenuQry.Open;
        DM.ADOMenuQry.First;
        SetLength(MenuArray,DM.ADOMenuQry.RecordCount);
        for i:=0 to DM.ADOMenuQry.RecordCount -1 do //第一级菜单
        begin//
            MenuArray[i]:=TmenuItem.Create(self);
            MenuArray[i].Caption:= DM.ADOMenuQry.FieldByName('chrMenuCaption').AsString;
            MenuArray[i].Tag :=StrToInt(DM.ADOMenuQry.FieldByName('MenuSysid').AsString);
            MainMenu.Items.Add(MenuArray[i]);
            //MainMenu.Items[i].ImageIndex := 1;
            DM.ADOSubMenuQry.SQL.Clear;
            DM.ADOSubMenuQry.SQL.Add('select * from V_UserMenuInfo where chrMenuYN = ''1'' and chrUsername='''+DM.GUserName+''' and intMenuSuperior='+DM.ADOMenuQry.FieldByName('MenuSysID').AsString+' order by intMainMenuSequence,intMenuSequence');
            DM.ADOSubMenuQry.Open;
            DM.ADOSubMenuQry.First;
            SetLength(SubMenuArray,DM.ADOSubMenuQry.RecordCount);
            for j:=0 to DM.ADOSubMenuQry.RecordCount-1 do    //第二级菜单
            begin
                DM.ADOSubMenuQry2.SQL.Clear;
                DM.ADOSubMenuQry2.SQL.Add('select * from V_UserMenuInfo where chrMenuYN = ''1'' and chrUsername='''+DM.GUserName+''' and intMenuSuperior='+DM.ADOSubMenuQry.FieldByName('MenuSysID').AsString+' order by intMainMenuSequence,intMenuSequence');
                DM.ADOSubMenuQry2.Open;
                DM.ADOSubMenuQry2.First;
                SetLength(SubMenuArray2,DM.ADOSubMenuQry2.RecordCount);            SubMenuArray[j]:=TmenuItem.Create(self);
                SubMenuArray[j].Caption:=DM.ADOSubMenuQry.FieldByName('chrMenuCaption').AsString;
                SubMenuArray[j].Tag :=StrToInt(DM.ADOSubMenuQry.FieldByName('MenuSysid').AsString);
                SubMenuArray[j].ImageIndex := 1;
                MainMenu.Items.Items[i].Add(SubMenuArray[j]);
               // MainMenu.Items.Items[i].ImageIndex := 1;
                if DM.ADOSubMenuQry2.RecordCount >0 then//第三级菜单
                begin
                    for k:=0 to DM.ADOSubMenuQry2.RecordCount-1 do
                    begin
                        SubMenuArray2[k]:=TmenuItem.Create(self);                    SubMenuArray2[k].Caption:=DM.ADOSubMenuQry2.FieldByName('chrMenuCaption').AsString;
                        SubMenuArray2[k].Tag :=StrToInt(DM.ADOSubMenuQry2.FieldByName('MenuSysid').AsString);
                        MainMenu.Items.Items[i].items[j].Add(SubMenuArray2[k]);
                        if  SubMenuArray2[k].Caption='退出系统' then
                            SubMenuArray2[k].OnClick :=CmdCloseClick
                        else
                            SubMenuArray2[k].OnClick:=MenuOnClick;                   // SubMenuArray2[k].ImageIndex := 1;
                        DM.ADOSubMenuQry2.Next;
                    end;
                end
                else
                    if  SubMenuArray[j].Caption='退出系统' then
                        SubMenuArray[j].OnClick :=CmdCloseClick
                    else
                        SubMenuArray[j].OnClick:=MenuOnClick;
                DM.ADOSubMenuQry.Next;
            end;
            DM.ADOMenuQry.Next;
        end//
    end;procedure TFrmMain.cmdLimitSetClick(Sender: TObject);
    begin
        if CmdLimits('cmdLimitSet') = False then
            exit;
        Application.CreateForm(TFrmUserLimit,FrmUserLimit);
        FrmUserLimit.ShowModal;
    end;
    Function TFrmMain.CmdLimits(CmdName:String):boolean;
    begin
        DM.ADOMenuQry.SQL.Clear;
        DM.ADOMenuQry.SQL.Add('select * from V_UserMenuInfo where chrMenuYN = ''1'' and cmdName = '''+CmdName+'''');
        DM.ADOMenuQry.SQL.Add(' and chrUsername='''+DM.GUserName+'''' );
        DM.ADOMenuQry.Open;
     {   if DM.ADOMenuQry.RecordCount <1 then
        begin
            showmessage('您没有权限使用该功能');
            Result := False;
            exit;
        end
        else   }
            Result := True;
    end;procedure TFrmMain.FormShow(Sender: TObject);
    begin
        LoadMenu;
        StatusBar.Panels.Items[0].Text := '当前用户: '+DM.GUserName;
       // PanelOne.Caption:='当前用户: '+DM.GUserName;
    end;initialization
     //   RegisterClass(TFrmMain);
        RegisterClass(TFrmAccount);
        RegisterClass(TFrmSendcard);
        RegisterClass(TFrmFoodPrice);
        RegisterClass(TFrmSetFoodPrice);
        RegisterClass(TFrmQueryConsumeData);
        RegisterClass(TFrmGatherData);
        RegisterClass(TFrmMachineSet);
        RegisterClass(TFrmModifyPWS);
        RegisterClass(TFrmUserLimit);
        RegisterClass(TFrmAddMenu);
        RegisterClass(TFrmAddUser);end.
      

  8.   

    加了classes.还是不行,帮再看看,谢谢!
      

  9.   

    try 
      frmname:='TFrmUserLimit' ; 
      fcType:=TFormClass(FindClass(frmname)); 
      application.CreateForm(fctype,f); 
      f.Showmodal; 
      f.Free; 
    except 
      ShowMessage('FormType not exist,you must register it first');   end; 
      //TFormClass(FindClass(FrmName)).Create(self).ShowModal; 
    这一句先注释掉~~
      

  10.   

    我跟踪了代码,是fcType:=TFormClass(FindClass(frmname)); 报错我刚也试了注释TFormClass(FindClass(FrmName)).Create(self).ShowModal,但还是不行,请帮再看看,感谢!
      

  11.   

    其实,你无非就是想实现一个按照名称的方式来创建类,如果你这样的类不多,并且都在一个包或者一个exe当中,那么你完全没有必要使用FindClass的方式,因为系统注册的类是很多的,你这么少的可怜的几个类加入到那个大列表中,先不说查找的效率问题,调用起来也不一定比自己实现起来方便。
    你完全可以创建一个TStringList,然后以如下的方式向其中添加你要动态创建的创建的类  classList.AddObject('TFrmMain', TOBject(TFrmMain));
      classList.AddObject('TFrmAccount', TOBject(TFrmAccount));
      classList.AddObject('TFrmSendcard', TOBject(TFrmSendcard));
    添加完事后,排序
      classList.Sort
    然后通过 
      classList.Find()来按照名称查找如果你以后不会修改这个列表了,那添加完事了,干脆设置
      classList.Sorted := True;
    然后通过
      classList.IndexOf()来查找取得索引后,可以按照如下方式使用
      n := classList.IndexOf('TFrmAccount');
      TFormClass(classList.Objects[n]).Create(Self).ShowMessage;
      

  12.   

    其他注册的类都没有问题,只是这一个TFrmUserLimit吗?
    如果是这样,你比对以下其他窗体类的代码看看~~~
      

  13.   

    调试的时候,这些:initialization 
    //  RegisterClass(TFrmMain); 
        RegisterClass(TFrmAccount); 
        RegisterClass(TFrmSendcard); 
        RegisterClass(TFrmFoodPrice); 
        RegisterClass(TFrmSetFoodPrice); 
        RegisterClass(TFrmQueryConsumeData); 
        RegisterClass(TFrmGatherData); 
        RegisterClass(TFrmMachineSet); 
        RegisterClass(TFrmModifyPWS); 
        RegisterClass(TFrmUserLimit); 
        RegisterClass(TFrmAddMenu); 
        RegisterClass(TFrmAddUser); 有没有执行注册?
      

  14.   

    先把其他的相关代码先注释掉,只执行这个TFrmUserLimit
      

  15.   

    加载菜单的代码注释了,只剩下一些Click的代码另外,我把程序专门放到一个按钮下了,但还是不行,郁闷,我在这个程序中新建一个窗口,然后再这样调用,也不行。代码也跟踪了RegisterClass(TFrmUserLimit); 是会执行的。procedure TFrmMain.cmdLimitSetClick(Sender: TObject);
    var
        frmname: string;
        fcType:TFormClass;
        f:TForm;
    begin
        {if CmdLimits('cmdLimitSet') = False then
            exit;
        Application.CreateForm(TFrmUserLimit,FrmUserLimit);
        FrmUserLimit.ShowModal;}
        try
            frmname:='TFrmUserLimit' ;
            fcType:=TFormClass(FindClass(frmname));
            application.CreateForm(fctype,f);
            f.Showmodal;
            f.Free;
        except
            ShowMessage('FormType not exist,you must register it first');
       end;
    end;