编译没问题,就是在调用该窗口时报错:错误提示:
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);另:如果通过按钮直接打开这个窗口是没有任何问题的。
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);另:如果通过按钮直接打开这个窗口是没有任何问题的。
解决方案 »
- timer中等待对话框接受指令问题
- NMFTP程序如何改IDFTP程序,就一段,哪位哥哥帮帮忙?
- query查询修改问题
- delphi 有没有像vb do event那样的语句?
- 数据记录问题(怎样把多条信息放到记录结构中,并且怎样应用)
- 我的代码哪里错了?(关于adoquery查询)
- 请问这4个组件在那个组件拦上的 TFileListBox,TDirectoryListBox,TFilterComboBox,TDriveComboBox
- 关于存储过程的一个问题
- Image控件中怎样实现放入图片后的BitBlt贴图??
- “list index out of bounds (0)”是什么东西????
- 请教 free pascal能编16位纯DOS程序吗?
- 如何一步步地为unit配form?
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);
所在的unit是怎么加入到程序的呢?是不是程序编译的时候根本就将TFrmUserLimit所在的Unit编译进去哦
{$R *.dfm}
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.
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;
这一句先注释掉~~
你完全可以创建一个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;
如果是这样,你比对以下其他窗体类的代码看看~~~
// RegisterClass(TFrmMain);
RegisterClass(TFrmAccount);
RegisterClass(TFrmSendcard);
RegisterClass(TFrmFoodPrice);
RegisterClass(TFrmSetFoodPrice);
RegisterClass(TFrmQueryConsumeData);
RegisterClass(TFrmGatherData);
RegisterClass(TFrmMachineSet);
RegisterClass(TFrmModifyPWS);
RegisterClass(TFrmUserLimit);
RegisterClass(TFrmAddMenu);
RegisterClass(TFrmAddUser); 有没有执行注册?
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;