感觉你这个好像是动态创建窗体?但是你这个怎么放到触发器里面去选择创建的窗口了? 下面这个是我前不久写的,动态将frame窗体创建到页签控件中,你的虽然是用在数据库中决定显示的是哪个form,但是应该也大同小异: 1、首先所有需要动态显示的窗体都需要在main窗体中进行注册: procedure Tphotommtform.FormCreate(Sender: TObject); begin //注册所有动态显示的窗体 RegisterClasses([Tcasemanagefm]); RegisterClasses([Tdaycensusfm]); RegisterClasses([Tgradecensusfm]); RegisterClasses([Tformmanagerfm]); RegisterClasses([Tteammanagerfm]); RegisterClasses([Tusermanagerfm]); RegisterClasses([Trepasswordfm]); RegisterClasses([Temployeemanagefm]); RegisterClasses([Tdeptmanagefm]); RegisterClasses([Tpostmanagefm]); end; 2、我是用按钮名称来映射需要的窗体名称的,所以按钮名称和对应的窗体名称必须有一个自己约定的格式才好映射,我的窗体名称是'T'+按钮名称+'FM‘命名窗体名称,按钮和窗体都是用函数动态生成: procedure tphotommtform.showchildmenu(fathername:string);//这个过程是动态显示按钮,在这个过程将按钮名字确定,后面就好动态生成窗体 var tempsbt:Tspeedbutton; begin with datemodule.allado2 do begin close; sql.Clear; sql.Add('SELECT DISTINCT p.formname, p.state, f.aname,f.formid '+ 'FROM ms_form AS f LEFT OUTER JOIN '+ ' ms_power AS p ON f.formname = p.formname RIGHT OUTER JOIN '+ ' ms_u_team AS u ON p.teamname = u.teamname '+ 'where (u.username = '''+userstr+''') and f.fatherform='''+fathername+''' and p.state=1'+ ' order by f.formid'); open; end; while not datemodule.allado2.Eof do begin tempsbt:=Tspeedbutton.Create(Cbtpanel); tempsbt.Parent:=Cbtpanel; tempsbt.SetBounds(8,childtop,113,33); tempsbt.Name:=datemodule.allado2.Fields.Fields[0].Value; tempsbt.Caption:=datemodule.allado2.Fields.Fields[2].Value; tempsbt.OnClick:=btonclick; childtop:=childtop+38; datemodule.allado2.Next; end; end; procedure tphotommtform.btonclick(sender:Tobject);//这个是按钮的onclick事件,通过名称显示不同的frame var Tfm:Tframe; begin if btclick(sender)=false then begin Tfm:=mainpage.TFrameclass(findclass('T'+Tspeedbutton(sender).Name+'fm')).Create(nil); //Tcasemanagefm.Create(self); Tfm.Parent:=formpage.ActivePage; Tfm.SetBounds(1,2,formpage.ActivePage.Width-2,formpage.ActivePage.Height-2); end; end; 动态显示窗体的代码差不多就是这三个就可以实现了,如果有达人觉得代码还有可以优化或者不严谨的地方,可以提出来啊,不胜感激
GetClass('Form1').Create
于是可以了!
下面这个是我前不久写的,动态将frame窗体创建到页签控件中,你的虽然是用在数据库中决定显示的是哪个form,但是应该也大同小异:
1、首先所有需要动态显示的窗体都需要在main窗体中进行注册:
procedure Tphotommtform.FormCreate(Sender: TObject);
begin //注册所有动态显示的窗体
RegisterClasses([Tcasemanagefm]);
RegisterClasses([Tdaycensusfm]);
RegisterClasses([Tgradecensusfm]);
RegisterClasses([Tformmanagerfm]);
RegisterClasses([Tteammanagerfm]);
RegisterClasses([Tusermanagerfm]);
RegisterClasses([Trepasswordfm]);
RegisterClasses([Temployeemanagefm]);
RegisterClasses([Tdeptmanagefm]);
RegisterClasses([Tpostmanagefm]);
end;
2、我是用按钮名称来映射需要的窗体名称的,所以按钮名称和对应的窗体名称必须有一个自己约定的格式才好映射,我的窗体名称是'T'+按钮名称+'FM‘命名窗体名称,按钮和窗体都是用函数动态生成:
procedure tphotommtform.showchildmenu(fathername:string);//这个过程是动态显示按钮,在这个过程将按钮名字确定,后面就好动态生成窗体
var tempsbt:Tspeedbutton;
begin
with datemodule.allado2 do
begin
close;
sql.Clear;
sql.Add('SELECT DISTINCT p.formname, p.state, f.aname,f.formid '+
'FROM ms_form AS f LEFT OUTER JOIN '+
' ms_power AS p ON f.formname = p.formname RIGHT OUTER JOIN '+
' ms_u_team AS u ON p.teamname = u.teamname '+
'where (u.username = '''+userstr+''') and f.fatherform='''+fathername+''' and p.state=1'+
' order by f.formid');
open;
end;
while not datemodule.allado2.Eof do
begin
tempsbt:=Tspeedbutton.Create(Cbtpanel);
tempsbt.Parent:=Cbtpanel;
tempsbt.SetBounds(8,childtop,113,33);
tempsbt.Name:=datemodule.allado2.Fields.Fields[0].Value;
tempsbt.Caption:=datemodule.allado2.Fields.Fields[2].Value;
tempsbt.OnClick:=btonclick;
childtop:=childtop+38;
datemodule.allado2.Next;
end;
end;
procedure tphotommtform.btonclick(sender:Tobject);//这个是按钮的onclick事件,通过名称显示不同的frame
var Tfm:Tframe;
begin
if btclick(sender)=false then begin
Tfm:=mainpage.TFrameclass(findclass('T'+Tspeedbutton(sender).Name+'fm')).Create(nil); //Tcasemanagefm.Create(self);
Tfm.Parent:=formpage.ActivePage;
Tfm.SetBounds(1,2,formpage.ActivePage.Width-2,formpage.ActivePage.Height-2);
end;
end;
动态显示窗体的代码差不多就是这三个就可以实现了,如果有达人觉得代码还有可以优化或者不严谨的地方,可以提出来啊,不胜感激