Основная форма не отображается при отображении модальной формы в OnShow основной формы? - PullRequest
1 голос
/ 17 августа 2011

Я создал одно приложение, в котором Main Form вызывает Sub Form для события FormShow Main Form. Sub Form отображается и дает два варианта на выбор. Если в подполе выбрана опция «Первый», то отображается «Сообщение», а после этого - «Основная форма». Теперь, когда приложение запускается впервые, после выбранной опции в подчиненной форме Meassage будет отображаться. Но я хочу отобразить сообщение с главной формой в качестве фона. Так что любое решение этого. ниже приведен код FormShow.

Procedure TMainForm.FormShow(Sender:TObject);
begin
  if (SubForm.ShowModal = mrOK) and bOption1 then
  begin
    ShowMessage('Enter the value');
  end;
end;

Ответы [ 5 ]

2 голосов
/ 17 августа 2011

Другим вариантом будет использование OnActivate Mainform вместо onShow.

2 голосов
/ 17 августа 2011

Если я правильно понимаю, то ваша проблема в том, что когда появляется окно сообщения, ваша основная форма все еще невидима.

Если это так, то у вас есть два варианта:

  1. Не показывать свои SubForm из события OnShow основной формы, но позже
  2. Не показывать сообщение сразу после возврата ShowModal, но в более позднее время

Для пункта 2 вы можете использовать аналогичный подход, как я предложил здесь , используя PostMessage. Итак, ваш код будет выглядеть примерно так:

procedure TMainForm.FormShow(Sender:TObject);
begin
  if (SubForm.ShowModal = mrOK) and bOption1 then
  begin
    PostMessage(Self.Handle, WM_SHOWMYDIALOG, 0, 0);
  end;
end;

Затем обработчик WM_SHOWMYDIALOG отображает фактическое сообщение. Этот подход может также работать для пункта 1, см. ain's answer .

PostMessage отправляет сообщение в очередь сообщений вашего приложения, которое будет обработано после того, как основная форма станет видимой.

1 голос
/ 17 августа 2011

Если я вас правильно понимаю, вы хотите

const
    UM_AFTERSHOW   = WM_APP + 1;

type
  TForm1 = class(TForm)
  protected
    procedure UMAfterShow(var Msg: TMessage); message UM_AFTERSHOW;
    procedure DoShow; override;
  end;


procedure TForm1.DoShow;
begin
  inherited;
  PostMessage(Self.Handle, UM_AFTERSHOW, 0, 0);
end;

procedure TForm1.UMAfterShow(var Msg: TMessage);
begin
  ShowMessage('Enter the value');
end;

Показывая ваше сообщение в обработчике UMAfterShow, вы даете главной форме возможность стать видимой и, следовательно, быть в фоновом режиме.

0 голосов
/ 18 августа 2011

Еще один вариант - добавить компонент TTimer в основную форму, чтобы вызвать диалоговое окно сообщения.

Удалите компонент TTimer в главной форме и установите для свойства enabled значение False и измените время с 1000 на 100. Кодируйте диалоговое окно сообщения, а также установите для свойства Timer.Enabled значение False в событии timer, чтобы избежать повторных срабатываний.

Теперь вы можете включить таймер в том месте, где вы бы показали диалоговое окно сообщения в событии OnShow вашей главной формы.

0 голосов
/ 17 августа 2011

Проблема, которую вы видите (если я правильно понимаю), заключается в том, что FormShow вызывается до того, как ваша основная форма станет видимой. Таким образом, диалоговое окно сообщения отображается перед вашей основной формой.

Что вам нужно сделать, это использовать PostMessage для отправки сообщения в вашу основную форму, которую вы затем обрабатываете. Это позволит завершить ваш код FormShow, и код будет активирован после отображения формы.

Взгляните здесь для примера.

...