根据string创建窗体,请高手指教,代码已贴出(200分)

  • 主题发起人 主题发起人 雨中雪
  • 开始时间 开始时间

雨中雪

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function openForm(const AClassName : string;const AOwner : TComponent=nil):TForm;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses unit2;

{$R *.dfm}
function Tform1.OpenForm(
const AClassName : string;
const AOwner : TComponent=nil
):TForm;
//根据窗口类名建立窗口
var
i : integer;
frmTemp : TForm;
cmpOwner : TComponent;
begin
Screen.Cursor := crHourGlass;
try
for i := 0 to Screen.FormCount -1 do
if Screen.Forms.ClassName = AClassName then
begin
frmTemp := Screen.Forms;
if frmTemp.WindowState=wsMinimized then
frmTemp.WindowState:=wsNormal;
frmTemp.BringToFront;
frmTemp.Setfocus;
Result := frmTemp;
Exit;
end;
if Assigned(AOwner) then
cmpOwner := AOwner
else
cmpOwner := Application;

Result := nil;
if Assigned(GetClass(AClassName)) and FindClass(AClassName).InheritsFrom(TForm) then
try
Result := TForm(FindClass(AClassName).NewInstance);
Result.Create(cmpOwner);
except
end;
finally
Screen.Cursor := crDefault;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
openform('form2',self);
end;

end.
 
运行时无任何反应,不知道为何
 
我使用你的代码运行,知道我运行的结果吗,
Result:=nil;
if Assigned(GetClass(AClassName))and FindClass(AClassName).InheritsFrom(TForm) then //本条件没法满足,下面的代码根本没有运行。
try
Result := TForm(FindClass(AClassName).NewInstance);
Result.Create(cmpOwner);
except
end;
finally
Screen.Cursor:=crDefault;
end;
 
你应该先在单元的初始化部分注册你的AClassName对应的类。
RegisterClass(xxxxx);
然后GetClass才能成功找到字符串对应的类。
 
同意kkkchenA,先你要注册你的类,才能用findclass等函数查找!
首先,在窗口单元的初始化部分注册窗口类:
unit Unit1;
...
initialization
RegisterClass(TForm1);
这样取得窗口类:TFormClass(GetClass('TForm1'))//也可以使用findclass
创建它的一个实例并显示:
with TFormClass(GetClass('TForm1')).Create(Application) do
begin
Show;
end;
 
谢谢你们的参与回答我的问题,窗体名称是以字符串形式存储在数据库

chen_liang:
RegisterClass(TForm1);在我的程序直接这样实现不行,因为根本不知道对应类的名称
 
给你一个。。。
procedure TfrmMain.OpenForm(FormClass:TFormClass;var AForm;
AOwner:TComponent=nil);
//根据窗口类名建立窗口,如果窗口存在则只激活它
var
kk :Integer;
Child :TForm;
begin
for kk:=0 to Screen.FormCount-1 do
begin
if Screen.Forms[kk].ClassType=FormClass then
begin
Child:=Screen.Forms[kk];
Child.WindowState:=wsMaximized;
Child.BringToFront;
Child.SetFocus;
TForm(AForm):=Child;
Exit;
end;
end;
Child:=TForm(FormClass.NewInstance);
TForm(AForm):=Child;
if not Assigned(AOwner) then AOwner:=Application;
Child.Create(AOwner);
Child.WindowState:=wsMaximized;
end;
 
hzjone:怎样得FormClass是关键,因为是根据字符串来创建窗体的,Tformclass根本就不知道呀,怎么能用呢?
 
在 每个非 MainForm 的最下面写上
initialization
RegisterClass(TFormModules);
把我这里的 TFormModules 换成你的那个Form的类名称

然后就可以用 GetClass 了,直接给你一个函数 ,如果你 RegisterClass 过的窗体,只要你用下面的 函数就能创建出一个新的实例

function FormRun(FrmClassName: string): integer;
type
TFormClass = class of TForm;
var
FormClass: TFormClass;
Form: TForm;
i : integer;
CanCreate: Boolean;
begin
CanCreate := True;
i := 0;
Result := 0;
if Application.MainForm.MDIChildCount >= 1 then
begin
for i := Application.MainForm.MDIChildCount - 1 downto 0 do
begin
if Application.MainForm.MDIChildren.ClassName = FrmClassName then
begin
CanCreate := False;
break;
end;
end;
end;
if CanCreate then
begin
FormClass := TFormClass(GetClass(FrmClassName));
if Assigned(FormClass) then
begin
Application.CreateForm(FormClass, Form);
Result := 0;
end;
end
else
begin
Application.MainForm.MDIChildren.Show;
Result := 1;
end;
end;
 
谢谢ztaif回答,但我不管把

initialization
RegisterClass(TFormModules);

加在mainform还是childform中都不行
 
加在你要根据 类名称 字符串 创建的 窗体的代码 的 end. 之前

比如你有一个窗体 TForm2 ,那就在 TForm2 的 end. 前写上
initialization
RegisterClass(TForm2);

而且这个单元应该在 dpr 工程文件的列表中

然后你在 程序的任意地方 用 FormRun('TForm2'),就能创建出一个TForm2 或是把已经创建的 TForm2 Show 出来
 
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation


{$R *.dfm}


initialization
RegisterClass(TForm2);
end.



program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
你看是不是应该这样写
 
已经解决,我的formstyle属性没有设置好!
 
后退
顶部