Application.MainForm是一个只读属性。
在
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
时,由于Application.CreateForm的作用,始终将第一个Form设置为MainForm
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
Instance: TComponent;
begin
。。
if (FMainForm = nil) and (Instance is TForm) then
begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance);
end;
end;问题是,有什么办法来改变FMainForm,大家帮忙想想看吗?
在
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
时,由于Application.CreateForm的作用,始终将第一个Form设置为MainForm
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
Instance: TComponent;
begin
。。
if (FMainForm = nil) and (Instance is TForm) then
begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance);
end;
end;问题是,有什么办法来改变FMainForm,大家帮忙想想看吗?
解决方案 »
- 保留小数点两位,在线急等.请路过高手指点!!!!!
- 急问:如何得到ADOQuery的查询结果带有函数的字段值?
- 两个文件方面的问题.请指教(在线等待)
- 多线程与ADO
- 有多少人用DELPHIX做出过能玩的游戏出来
- 哪里有注册的fastreport for Delphi6
- 如何实现快速检索?急急急!!!
- 在delphi 7中有些控件找不找。请大家个帮忙
- 关于OLEcontainer
- DBGRID控件里面的某一行某一列的内容过多,在显示屏上一行显示不完,有没有办法在这行这列里面换行显示呀
- 我现在编了一个小程序,使用quickrpt控件打印文件,在本机上是可以运行的,在别的机子上运行程序就出错了,是不是它还要什么运行库等东西
- 如何把MEMO类型的数据读出,然后写入一个新表中?求救!急!
以下就可以达到运行可以改变:
首先建一个Appliction,建两个Form
procedure TForm1.Button1Click(Sender: TObject);
var
P: Pointer;
begin
P := @Application.MainForm;
TForm(P^) := Form2;
Application.MainForm.Show;//这个时候就是Form2了
end;
注:
以上可能有一安全的因素,楼主考虑再去用吧
我解释如下:
看D中对Application.mainform定义就知道了:
TApplication = class(TComponent)
.......
public
.......
property MainForm: TForm read FMainForm;
.......
end;
这里可以看出MainForm是读取FMainForm这个私有变量,以上的方法当然可以了。
但如果D中将来这样的定义MainForm属性的话:
TApplication = class(TComponent)
.......
public
.......
property MainForm: TForm read GetMainForm;//通过一个访问函数
.......
end;
那么P := @Application.MainForm中是返回GetMainForm地址,那么你改变就是改变这个函数的地址,那么下次你访问Application.MainForm,就可能要出错,而且更重要的是,指针已经让内存混乱了
你这么一说道是很有道理的!!!高我想了想你说的“指针已经让内存混乱了”
我想,如果我管理得当,应该不会出什么大漏子吧!下面是我想到的处理过程:
前提:Form1为最初的mainformprocedure TForm1.Button1Click(Sender: TObject);
var
P: Pointer;
begin
P := @Application.MainForm;
TForm2(P^) := Form2;
Application.MainForm.ShowModal;
P := nil;
end;
当Form2关闭时:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
var
P: Pointer;
begin
P := @Application.MainForm;
TForm1(P^) := Form1;
Application.MainForm.BringToFront;
P := nil;
end;
这样,应该不会有什么问题了吧!对了,随便说一下,我这个问题的提出是由于我的Form2是MDIForm的,它有MDIChild子窗体;同时它又是在Form1的处理之后Show出来的。我在调试初期,MDIChild子窗体老是说没有MDIForm的主窗体,所以才想到要动态改变Application的MainForm。
不知道除了此法,谁还有高见!