如何在动态创建表单上保留模态对话框?(CreateParams - 重写)

Sha*_*ala 2 delphi modal-dialog delphi-2010

我正在动态创建一个覆盖CreateParams的Form,以便我可以在TaskBar上显示它.从动态创建的Form,我调用一个TColorDialog但是一旦显示,我的Form将在MainForm下面,ColorDialog就在它之上.

关闭ColorDialog后,动态Form将返回MainForm.

我在ColorDialog Execute方法中看到有一个Handle可以传递,但我不确定我是否在正确的轨道上?

如果我在MainForm上的Dialog下点击它会闪烁,但我怎么能让动态创建的Form"拥有"这个对话与后面的MainForm?

我像这样创建表单:

procedure TMain.Button1Click(Sender: TObject);
var
  SEMArcF: TWriteSEMArcFrm;
begin
  SEMArcF := TWRiteSEMArcFrm.Create(nil);
  SEMArcF.Show;
end; 
Run Code Online (Sandbox Code Playgroud)

它在OnClose事件中被释放:

procedure TWriteSEMArcFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
Run Code Online (Sandbox Code Playgroud)

我正在覆盖CreateParams,如下所示:

procedure TWriteSEMArcFrm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  if (FormStyle = fsNormal) then begin
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
    Params.WndParent := GetDesktopWindow;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

并显示ColorDialog我要么创建它,要么在Form上只有一个TColorDialog组件,无论哪种方式都会产生相同的结果.我希望它由动态表单拥有.

编辑 我现在添加:

Application.ModalPopupMode := pmAuto;
Run Code Online (Sandbox Code Playgroud)

完整代码:

procedure TWriteSEMArcFrm.btnBackColourClick(Sender: TObject);
var
  ColorDlg: TColorDialog;
begin
  Application.ModalPopupMode := pmAuto;
  ColorDlg := TColorDialog.Create(nil);
  try
    if ColorDlg.Execute then
    re.Color := ColorDlg.Color;
  finally
    ColorDlg.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

这工作正常,但设置此可能有任何异常行为?

谢谢

克里斯

Rem*_*eau 8

TColorDialog派生自TCommonDialog,有两个Execute()可用的重载版本- 已存在多年的遗留无参数版本,以及一个较新的重载,它将父HWND作为输入参数.你可能会打电话给前者.这超负荷使用Handle当前活动的性质TForm(仅当TApplication.ModalPopupMode属性没有设置到pmNone),回落至HandleMainForm如果需要的话.如果你想要更多控制,你应该直接调用另一个重载,然后你可以传递动态表单的Handle属性作为参数值.