Delphi非应用程序主窗口创建MDI
来源:互联网 发布:手绘画图软件 编辑:程序博客网 时间:2024/04/30 23:12
对Delphi很熟悉的人,都知道MDI窗口的创建方式,是将主窗口的formstyle设置成MDIForm,然后将各个要设置成MDI的窗口的FormStyle都设置成MDIChild,运行就可以看到效果了嘿。
但是,如果MDI子窗口的依附窗口不是主窗口呢?此时是否依然能够建立MDI应用程序呢?事实证明是不行的,通过看Forms单元的源码中的CreateWindowHandle这个我们可以看到这样几句代码
if (FormStyle = fsMDIChild) and not (csDesigning in ComponentState) then
begin
if (Application.MainForm = nil) or
(Application.MainForm.ClientHandle = 0) then
raise EInvalidOperation.Create(SNoMDIForm);
如果窗口样式为MDIChild的,先查看MainForm的ClientHandle是否为0,也就是说被局限在了
Application.MainForm上了,此时如果MainForm不是MDIForm样式,那么ClientHandle就为0了,所以就会报出一个异常 EInvalidOperation.Create(SNoMDIForm);
既然这样,那我们就需要绕过Application.Mainform这个砍,让子窗口创建的时候MainForm的ClientHandle<>0,设置MDIForm自然就不是我们需要的了,我们是要非主窗口创建MDI应用程序,于是俺想到一个办法修改Application.MainForm这个属性,修改成窗口样式为MDIFOrm的非主窗口,此时不就可以过了吗?
于是写下
Application.MainForm := MyMdiForm;
很明显这个是会报错误的,因为Application.MainForm为只读属性声明为:
Property MainForm: TForm read FMainForm;
那么是否就无策了呢?细心的同志们仔细观察一下应该是可以发现的MainForm指向的是FMainForm,也就是说MainForm就是FMainForm的地址映射,那么我们就可以通过指针来达到这个修改的目的了哈哈
那么就可以这样
var
p: PInteger;
begin
p := @Application.MainForm;
p^ := Integer(form3);//这里就修改了Application的Mainform的属性了哈。
end;
然后我们就可以创建MDI子窗口了,呵呵
具体如下:
procedure TForm2.BitBtn1Click(Sender: TObject);
var
p: PInteger;
f: TForm;
begin
f := Application.MainForm;
f.Hide;
form3 := Tform3.Create(nil);
p := @Application.MainForm;
p^ := Integer(form3);
Form3.Show;
f.Close;
end;
仅供研究,使用请慎重。没做任何测试。
- Delphi非应用程序主窗口创建MDI
- Delphi MDI应用程序高级技巧--子窗口的隐藏
- MFC中创建没有子窗口的MDI应用程序
- MFC中创建没有子窗口的MDI应用程序
- 创建MDI窗口
- QT4:创建主窗口应用程序 ,非 对话框应用成
- Delphi关于非应用程序主窗口显示在任务栏的问题
- Delphi MDI子窗口调用问题
- Delphi MDI子窗口调用问题
- Delphi 去掉MDI窗口的滚动条
- Delphi 去掉MDI窗口的滚动条
- 如何动态地切换MDI子窗口或者在SDI主应用程序窗口显示的视图?
- Windows SDK笔记(七):创建MDI窗口
- Windows SDK编程--创建MDI窗口
- Windows SDK笔记(七):创建MDI窗口
- 创建无边框架的SDI/MDI应用程序
- 解析Delphi 窗口置顶,及非主窗口置顶
- DELPHI / Mdi
- 全面解析VC++对象模型
- Java Timer
- Nutch 0.8笔记--Google式的搜索引擎实现
- SIP常见的问题与解答
- Windows Mobile 5.0 .NET 使用DataGrid
- Delphi非应用程序主窗口创建MDI
- 国军标
- Why did the size of my indexes expand when I rebuilt my indexes?
- 本人真容
- 使用Jmail发送邮件
- 用python写的fitnesse DoFixture例子
- Java编程那些事儿97——多线程使用示例2
- UNIX平台下的系统性能
- 赶走最令人不愉悦的一类BUG,你准备好了么?