求教实现嵌套的MDI界面效果的方案:FormB显示在FormA里,FormC显示在FormB里(200分)

  • 主题发起人 主题发起人 道明德
  • 开始时间 开始时间

道明德

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:
程序的主窗体TFormA是一个MIDForm窗体,其子窗体TFormB是MDIChild子窗体。
在显示出TFormB后,要求显示一个窗体TFormC,使得它只能在TFormB中显示,并且正常运行。


目前的方案:
FormA.formStyle := fsMDIForm;
FormB.formStyle := fsMDIChild;
FormC.formStyle := fsNormal;
FormC.parent := FormB;
FormC.OnClick := TFormC.BringFormCToFront;

procedure TFormC.BringFormCToFront(sender:TObject);
begin //目的:解决设置Form.parent后,单击时无法将该窗体显示在最前面的问题
self.bringToFront;
end;

该方案的缺陷:
1. 窗体标题栏始终灰显
2. 只有使用自定义的OnClick事件才能激活第二(N)层的子窗体。
3. 第二层子窗体上的TEdit/TCombBox等编辑控件无法聚焦(当然也可以写Onclick事件进行SetFocus,只是比较别扭)

本没时间去细究窗口的底层实现机制,来这儿请教高手,运气好的话可以偷个懒。

如果您没有完整解决方案也可以一起讨论,先谢了。 讨论、帮顶有分。
 
能帮我吗?:
我想拜师学艺,高手能收我为徒吗?:怎样编程批量把photo文件夹里的图片名改为李三.bmp、张四.bmp…….?
来自:963119, 时间:2006-6-11 12:28:00, ID:3467990
 
to 道明德;
分全给我吧!不用讨论了!加我QQ76431082,我保证决你的问题!
 
变灰是正常的,因为TFormC不属于MDI主窗口,它跟MDI主窗口有同等地位,在焦点问题上永不两立
 
to 清新空气
1. 没有QQ
2. 在大富翁上公开解答,对其他人也是个帮助
3. 只要有助于解决问题,都会给分。完全解决,我另外给分。
 
有时候我发现在大富翁里有个现象,你不答,没人答,你一答别人也答;不知道真的假的!
你的例子我已经做好了!等待发给你!告诉我邮箱也行!
 
FormC 可否改为 Frames 。
 
可以用dll or mdi, or frame,过几天我把我做的东西,只是一直舍不得
 
to 天天上班
由于有同时显示 FormC1、 FormC2、FormC2并可切换的需求,用Frames可能不合适。
谢谢。

to 清新空气
理解你的心情 :)
 
to 人在昆明
舍不得就算了,不要为难自己 :) 谢谢关注
 
to 道明德;
你好!源码已经给你发了!
 
to 清新空气
可能hotmail不正常,没收到。 麻烦再发一次
 
to 道明德;
你好!源码已经给你重发了!请查收!
 
to 清新空气
收到。你的方法SendMessage(aForm.Handle, WM_NCACTIVATE, ord(True), 0),可以使得看上去象激活,值得学习。
但创建多个Form3(FormC)时有以下问题
1. 单击Form3(FormC)的控件或者是窗体,无法将真正激活窗体(显示到最前面,可用BringToFront)
2. 一个Form2(FormB)中看上去的激活窗体太多(可以选择在聚焦时再SendMessage)

辛苦了,有空先到这儿来领一百分吧。其它分在解决本问题结贴时再给。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1367231
 
设置parent
 
SendMessage(aForm.Handle, WM_NCACTIVATE, ord(True), 0),是为了,使主窗体总是显示为聚焦状态
 
Windows.SetParent
 
to 道明德;
看到代码是不是觉得很简单;
看你们问的题!有没有说过有多个form3??问问题要把要达到的效果讲明;
其实这些都是可以控件的!你还是有个QQ比较好!可以跟你交流交流~!
而且我的方法内也可以嵌入MdiForm
 
做了改进,附件放在笔记中了
http://www.delphibbs.com/keylife/iblog_show.asp?xid=22625

to 清新空气
你的思路很有启发性了,谢谢。不结贴只为了有更好的方案。分一定给你的。
 
清新空气,你好
看起来是我没有问清楚问题吧。

“...在显示出TFormB后,要求显示一个窗体TFormC,使得它只能在TFormB中显示,并且正常运行...”

所谓正常运行,就是要求 TFormC 与TFormB之前的交互关系, 在外观上与 MDI子窗体的表现形式一致。

细一点来说,正常运行包括:
0.能在FormB中运行多个FormC
1.多个FormC之间能用鼠标正常切换
2.单击FormC上的控件或客户区时,可以激活相应的窗体
3.FormC的标题栏在非“激活”状态灰显,在“激活”状态亮显
4.多FormC情况下,用Tab键不会跨FormC窗体跳跃焦点,或聚焦到FormB的控件上。

而这些对于正常的MDI子窗体都是正常的要求。在这里我再分解一下吧。
 
后退
顶部