子表格总是在父母之上

时间:2015-12-12 20:36:58

标签: delphi

我认为这是一个问题,一次又一次出现在这里,但我查看了很多问题,并没有找到适合我的答案。

我有一个父表单,所有"正常"属性,现在我刚刚创建了一个子表单,使用" normal"属性也是。在我的父窗体上,我有一个ListView,当我点击ListView中的某个项目时,我打开子窗体。

现在我需要在主窗体的顶部保留这个子窗体,当我最小化子窗口时,顶部也会最小化,当我最大化程序时,我只看到子窗体,直到我关闭此窗体。因此,在关闭子窗体之前,使用ListView的主窗体将不可用。如果我从ListView中选择另一个项目,我会再次以相同的行为打开子表单。

我不知道这是否难以实现,但我没有在谷歌上找到它。 这是我的简单演示代码:

unit Unit1;

var
  Form1: TForm1;


implementation

uses Desktop;

procedure TForm1.RemoteDesktop1Click(Sender: TObject);
var
  DesktopForm: TForm2;
begin
  DesktopForm:= TForm2.Create(Self);
  DesktopForm.Show;
end;

桌面单元只是一个VCL表单,没有任何代码。

2 个答案:

答案 0 :(得分:2)

使用showModal。要最小化MainWindow(所有窗口,实际上最小化应用程序),您应该以子窗体覆盖WMSysCommand:

procedure WMSyscommand(var Msg: TWmSysCommand); message WM_SYSCOMMAND;

.
.
.
procedure TForm2.WMSysCommand(var Msg: TWmSysCommand);
begin
  case (Msg.CmdType and $FFF0) of
    SC_MINIMIZE:  begin
                    Msg.Result := 0;
                    EnableWindow(Application.Handle, True);
                    Aplication.Minimize;
                  end;
    else inherited;
  end;
end;

表格事件WindowStateChange也可用于非Windows。

我在没有处理LXDE Fedora23(Lazarus)上的那个事件的情况下进行简单的测试。所有形式的模态都是最小化的。

答案 1 :(得分:1)

听起来你想要一个莫代尔形式

DesktopForm.ShowModal;

而不是

DesktopForm.Show;

你可能想要设置

Application.ModalPopupModel到pmAuto也是