这种类似.NET中的反射机制。在Delphi XE中才支持了反射机制,如果你的用D5,6,7开发,这个很有难度,我是没见过这种弄的。
解决方案 »
- 求助C++Builder 翻译成Delphi
- 在Delphi中如何使用VCL制作标题栏上的图标?
- 散分,我该怎么办?
- 一段16进制转换代码,一直提示错,但别人跟我写的一样的代码,正常?!不得其解!!!
- 如果在一个程序中操控另一个程序??打个比方,现在一个程序A上有登录与注销两个功能,那么我怎样在程序B中实现对A的登录或是注销呢?
- 请问一个读取数据的问题,在线等待!!!
- 请问如何将含有千分位的字符串转换为浮点数?
- why,
- help! qreport!!!
- 菜鸟求救:如何用installshield生成delphi应用程序的安装程序! (送上所以的分)
- delphi版的qrencode二维码
- 如何判断字符串特定字符个数?
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;
动态显示窗体的代码差不多就是这三个就可以实现了,如果有达人觉得代码还有可以优化或者不严谨的地方,可以提出来啊,不胜感激