我的菜单就是这样实现的,不过都是MDI形式的;你的表中最是保存FROM的名字; 最体实现如下; procedure TMainForm.mymenuexcute(sender:Tobject); //所有菜单按钮执行的事件 var tmpmenuname:string; begin tmpmenuname:=Tmenuitem(sender).name; lockwindowupdate(handle); try execute(tmpmenuname); finally lockwindowupdate(0); end; end; //执行具体功能; procedure TMainForm.execute(const agnbh:string); var exename: array[0..79] of char; fldname:string; begin with qsel_runexe do begin if active then close; parambyname('name').asstring:=agnbh; open; //根据菜单名字提取FORM名字 if (recordcount=1) and (fieldbyname('frmname').asstring<>'') then begin fldname:=trim(fieldbyname('frmname').asstring); if fldname='frmabc' then begin if not checkMDIChildform('frmabc') then //查找此子窗体是否存生的函数! begin application.createform(Tfrmabc,frmabc); end else frmabc.show; end; end; end;
把楼上的改一下就可以了呀!procedure TMainForm.execute(const agnbh:string); var exename: array[0..79] of char; fldname:string; classname:string; //add by cxz begin with qsel_runexe do begin if active then close; parambyname('name').asstring:=agnbh; open; //根据菜单名字提取FORM名字 if (recordcount=1) and (fieldbyname('frmname').asstring<>'') then begin fldname:=trim(fieldbyname('frmname').asstring); classname:='T'+fldname;//add by cxz if not checkMDIChildform(fldname) then //查找此子窗体是否存生的函数! begin application.createform(classname,fldname);//by cxz end else Tform(fldname).Show; //by cxz end; end; end;
Delphi提供以下函数:Getclass(ClassName) 获取某个名称的类型,不过那些类型必须要经过注册才可以被找到(否则返回空). RegisterClass(Class) 注册一个类。 下面举一个例子:再FormUnit里有一个TmyForm窗体类,可以这么处理。 1. 在FormUnit的最后加上 Initialization //注册TmyForm RegisterClass(TmyForm) ; end ;2. 在需要的地方(比如在函数CreateFormByClassname(sClassName: String)) function CreateFormByClassname(sClassName: String): TForm ; var rClass: TClass ; begin rClass := GetClass(sClassName) ; if rClass <> nil then //我不知道原因,但是TComponentClass(rClass).Create(nil) //好象会返回已经存在的对象,而application.CreateForm则不会 application.CreateForm(TComponentClass(rClass),Result) ; end ;
Procedure showForm(i,FormArr);
begin
formArr[i].show;
end;
不妨试一下!
s:='form1'
&s.show;
DEPHI 不清楚。
showform的参数是字符型的form的类名?如果把所有的form放在一个数组中,那么如何对这个数组初始化呢?
手工一个一个赋值吗?那么编程过程中,随着功能的增加,合并等,
我要手工维护这样一个数组,使其与数据库中的一致,那还不如不用动态
菜单,直接用菜单编辑呢。还有更好的办法吗?
再动态调用!
最体实现如下;
procedure TMainForm.mymenuexcute(sender:Tobject);
//所有菜单按钮执行的事件
var
tmpmenuname:string;
begin
tmpmenuname:=Tmenuitem(sender).name;
lockwindowupdate(handle);
try
execute(tmpmenuname);
finally
lockwindowupdate(0);
end;
end;
//执行具体功能;
procedure TMainForm.execute(const agnbh:string);
var
exename: array[0..79] of char;
fldname:string;
begin
with qsel_runexe do
begin
if active then close;
parambyname('name').asstring:=agnbh;
open; //根据菜单名字提取FORM名字
if (recordcount=1) and (fieldbyname('frmname').asstring<>'') then
begin
fldname:=trim(fieldbyname('frmname').asstring);
if fldname='frmabc' then
begin
if not checkMDIChildform('frmabc') then
//查找此子窗体是否存生的函数!
begin
application.createform(Tfrmabc,frmabc);
end else frmabc.show;
end;
end;
end;
不知可否解释得再详细些?
var
exename: array[0..79] of char;
fldname:string; classname:string; //add by cxz
begin
with qsel_runexe do
begin
if active then close;
parambyname('name').asstring:=agnbh;
open; //根据菜单名字提取FORM名字
if (recordcount=1) and (fieldbyname('frmname').asstring<>'') then
begin
fldname:=trim(fieldbyname('frmname').asstring);
classname:='T'+fldname;//add by cxz if not checkMDIChildform(fldname) then
//查找此子窗体是否存生的函数!
begin
application.createform(classname,fldname);//by cxz
end else Tform(fldname).Show; //by cxz end;
end;
end;
RegisterClass(Class) 注册一个类。
下面举一个例子:再FormUnit里有一个TmyForm窗体类,可以这么处理。
1. 在FormUnit的最后加上
Initialization
//注册TmyForm
RegisterClass(TmyForm) ;
end ;2. 在需要的地方(比如在函数CreateFormByClassname(sClassName: String))
function CreateFormByClassname(sClassName: String): TForm ;
var
rClass: TClass ;
begin
rClass := GetClass(sClassName) ;
if rClass <> nil then
//我不知道原因,但是TComponentClass(rClass).Create(nil)
//好象会返回已经存在的对象,而application.CreateForm则不会
application.CreateForm(TComponentClass(rClass),Result) ;
end ;