Как сохранить модальный диалог поверх динамически создаваемой формы? (CreateParams - переопределено) - PullRequest
2 голосов
/ 04 октября 2011

Я динамически создаю форму, которая переопределяет CreateParams, чтобы я мог отображать ее на панели задач. Из динамически созданной формы я вызываю TColorDialog, но как только она отобразится, моя форма перейдет под MainForm с ColorDialog поверх этого.

После закрытия ColorDialog динамическая форма вернется обратно через MainForm.

Я вижу, что в методе ColorDialog Execute есть дескриптор, который можно передать, но я не уверен, что я на правильном пути с этим?

Если я щелкну под диалоговым окном в 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 в форме, в любом случае результат будет тот же. Я хочу, чтобы оно принадлежало динамической Форме.

EDIT Я сейчас добавлю:

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;

Это работает нормально, но может ли быть какое-то необычное поведение при установке этого?

Спасибо

Chris

1 Ответ

8 голосов
/ 04 октября 2011

TColorDialog происходит от TCommonDialog, у которого есть две перегруженные версии Execute() - устаревшая версия без параметров, существовавшая годами, и более новая перегрузка, которая принимает родительский HWND в качестве входного параметра.Вы, вероятно, звоните первым.Эта перегрузка использует свойство Handle текущего активного TForm (только если свойство TApplication.ModalPopupMode не установлено в pmNone), возвращаясь к Handle из MainForm, если необходимо.Если вы хотите больше контроля, вы должны вместо этого вызывать другую перегрузку напрямую, тогда вы можете передать свойство Handle динамической формы в качестве значения параметра.

...