delphi - 如何将模态对话框保持在动态创建的表单之上? (CreateParams - 覆盖)

标签 delphi modal-dialog delphi-2010

我正在动态创建一个覆盖 CreateParams 的表单,以便我可以将其显示在任务栏上。从动态创建的表单中,我调用 TColorDialog,但一旦显示,我的表单将进入 MainForm 下方,而 ColorDialog 位于其顶部。

关闭 ColorDialog 后,动态表单将返回到 MainForm。

我看到 ColorDialog 执行方法上有一个可以传递的句柄,但我不确定我是否走在正确的轨道上?

如果我单击 MainForm 上的对话框,它会闪烁,但是如何让动态创建的表单“拥有”此对话框,而 MainForm 位于后面?

我创建这样的表单:

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

并且它在 OnClose 事件中被释放:

procedure TWriteSEMArcFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

我像这样重写 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;

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

编辑 我现在补充一下:

Application.ModalPopupMode := pmAuto;

完整代码:

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;

这工作正常,但是设置这个会不会有任何异常行为?

谢谢

克里斯

最佳答案

TColorDialog 派生自 TCommonDialog,它有两个可用的 Execute() 重载版本 - 已存在多年的遗留无参数版本,以及一个较新的重载,它将父级 HWND 作为输入参数。您可能会调用前者。该重载使用当前事件 TFormHandle 属性(仅当 TApplication.ModalPopupMode 属性未设置为 pmNone),如果需要,则返回到 MainFormHandle。如果您想要更多控制,则应该直接调用其他重载,然后可以将动态表单的 Handle 属性作为参数值传递。

关于delphi - 如何将模态对话框保持在动态创建的表单之上? (CreateParams - 覆盖),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7642651/

相关文章:

javascript - 动态调整 Bootstrap 中模态对话框的大小

c# - 无法在 WPF 中设置 DialogResult

delphi - 在 Delphi 中使用 XSLT 2.0 需要什么

android - 如何生成Android设备的唯一ID?

delphi - 更改adoquery.active时条件表达式中的数据类型不匹配

javascript - Bootstrap 模式委托(delegate)事件类型语法

delphi - 为什么我的通用匿名方法类型不兼容?

delphi - Unicode 字符串上的 Length() 与 Sizeof()

delphi - 寻找 Delphi 的径向弹出菜单组件

sql - 适用于 Delphi 2010 和 Unidac 的可视化 SQL 查询生成器