Delphi,如何制作独立的窗口
我有一个使用Chrome浏览器等标签的应用程序.现在我希望能够打开更多表格而不仅限于一种表格.这些表格应该是相同的,但如果我关闭主表格,所有表格都将被关闭.如何使所有表格都相同,所以无论我关闭哪种形式,只关闭该表格而不是在所有表格关闭之前退出申请?有任何想法吗?
Image of my explorer 亲切的问候 解决方法
这样做并不难,尽管它会很快变得复杂,具体取决于你想要它的完整程度.让多个模态对话框独立工作是一项艰巨的任务.
首先,您需要完全避免Application.MainForm.始终使用Form:= TMyForm.Create(Application)而不是Application.CreateForm(TMyForm,Form).后者设置了MainForm,你永远不希望这种情况发生. 要使事情正常关闭,您需要在表单的OnClose事件处理程序中执行以下操作: if Screen.FormCount = 1 then Application.Terminate; CloseAction := caFree; Application.Run依赖于MainForm的分配,因此在你的DPR中用这个循环替换该行: repeat try Application.HandleMessage; except Application.HandleException(Application); end; until Application.Terminated; 有几种方法可以处理任务栏条目. >单个任务栏条目:设置Application.MainFormOnTaskbar:= False;并将使用隐藏的TApplication句柄.单击任务栏条目将使所有窗口都显示在前面.您需要覆盖Application.OnMessage或添加TApplicationEvents组件,并使用Msg.Handle = Application.Handle`监视WM_CLOSE.在这种情况下,用户右键单击任务栏并选择“关闭”,因此您应该关闭所有窗口. 可能还有其他一些问题,但这是基础知识. 正如我所说,使ShowModal和TOpenDialog / TSaveDialog独立工作,所以它只影响它的父窗体,因此可以一次打开多个对话框,是一大堆工作,我不能真正推荐它.如果你是一个受虐狂,这里是一般步骤: >将TCustomForm.ShowModal替换为自定义版本.除此之外,该例程禁用了应用程序中的所有其他窗口,因此您需要使用EnableWindow(Owner.Handle,False / True)替换DisableTaskWindows / EnableTaskWindows调用以仅禁用父窗体.此时,您可以打开多个对话框,但它们只能以后进先出顺序关闭,因为调用最终是递归的.如果没关系,请停在这里. 有两种方法可以解决这个问题: >而不是使ShowModal阻塞,让StartModal和EndModal例程具有ShowModal代码的第一位和最后一位,并在关闭对话框时调用OnShowModalDone事件.这是一种使用起来很痛苦,但相对容易编码并且易于稳定. >常见的对话框(TOpenDialog,TColorDialog等)也有类似的限制.要使它们只禁用父窗体,您需要覆盖TCommonDialog.TaskModalDialog并替换那里的DisableTaskWindows / EnableTaskWindows调用.它们不能像上面的常规Delphi对话那样异步,因为它们阻止了Windows(GetOpenFileName,ChooseColor等)提供的功能.允许那些以任何顺序关闭的唯一方法是让每个对话框在专用线程中运行.只要您小心访问VCL对象,Windows就可以处理大部分同步,但它基本上涉及重写Dialogs.pas的大部分内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |