请问如何把一个TForm名称作为参数传给过程,然后在过程中打开对应的TForm实例呢? ( 积分: 100 )

  • 主题发起人 主题发起人 cornermoss
  • 开始时间 开始时间
C

cornermoss

Unregistered / Unconfirmed
GUEST, unregistred user!
例如,原来是这样的:
var
Dlg:TfrmImportYearData;
begin
Dlg := TfrmImportYearData.Create(Application);
Dlg.Proc_InitDlg(.......)
//一个TfrmImportYearData的Public过程
Dlg.Show;
end;
///////////////////
现在我需要在一个过程里这样调用:
procedure ShowMyDlg(const FormClassName:String)
//这里把 'TfrmImportYearData' 传入
var Dlg:TForm;
begin
Dlg := ({这里怎样把'TfrmImportYearData'转换为TfrmImportYearData}).Create(Application);
(Dlg as {FormClassName所对应的窗体对象} ).Proc_InitDlg(.......)

Dlg.Show;
end;

谢谢指点一二啊:)
 
例如,原来是这样的:
var
Dlg:TfrmImportYearData;
begin
Dlg := TfrmImportYearData.Create(Application);
Dlg.Proc_InitDlg(.......)
//一个TfrmImportYearData的Public过程
Dlg.Show;
end;
///////////////////
现在我需要在一个过程里这样调用:
procedure ShowMyDlg(const FormClassName:String)
//这里把 'TfrmImportYearData' 传入
var Dlg:TForm;
begin
Dlg := ({这里怎样把'TfrmImportYearData'转换为TfrmImportYearData}).Create(Application);
(Dlg as {FormClassName所对应的窗体对象} ).Proc_InitDlg(.......)

Dlg.Show;
end;

谢谢指点一二啊:)
 
有时候需要根据类名来建立类的实例,比如把类名存于数据库,然后在程序中根据数据库中的
内容建立不同的窗体,下面的例子可以实现这个需求.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Controls, StdCtrls,Forms;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
public
procedure CreateForm(AClassName:string);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
//调用建立本身
CreateForm('TForm1');
end;

procedure TForm1.CreateForm(AClassName: string);
//如果查找到类类型(有的书叫类引用),则建立实例
begin
if GetClass(AClassName)<>nil then
TFormClass(FindClass(AClassName)).Create(self).Show;
end;

////下面的代码注册窗体类,你要注册才能用FindClass找到(以前记得好象不用注册?)
initialization
RegisterClass(TForm1);

end.

续篇 1 : GetClass与FindClass的区别 (2003-10-28 14:26:18)

GetClass不会引发错误,如果没有找到类,它会返回nil
FindClass如果找不到类,它会引发一个错误
 
谢谢app2001,但是这样每个对话框都要注册一下,而且不能直接调用到Proc_InitDlg哦,看来还是只有用老办法做了~~
 
后退
顶部