Сообщение, отображаемое перед формой

#delphi #delphi-10.3-rio

Вопрос:

У меня есть основная форма, которая при активации вызовет другую форму для изменения даты приложения (модальная, показать, закрыть), а затем выполнит некоторые проверки и отобразит сообщение, если оно будет применено в ответ на проверку.

Есть ли способ показать (нарисовать) основную форму после закрытия первой формы, но перед отображением сообщений?

Сегодня:

  • Основная форма.Активировать
  • Использование формы данных
  • отображение списка сообщений на рабочем столе (или в других приложениях)
  • Основная форма окрашена и видна

Я хочу чего-то подобного, но я могу понять, как:

  • Основная форма.Активировать
  • Использование формы данных
  • Основная форма окрашена и видна
  • отображать сообщение LG через основную форму

Спасибо за любую идею!

Комментарии:

1. Было бы полезно, если бы вы могли показать код, который вы используете. Но то, что я, вероятно, сделал бы в этой ситуации, — это использовать TThread.ForceQueue() или эквивалентно задержке отображения MessageDlg() до тех пор, пока основная форма не будет готова, например: TThread.ForceQueue(nil, procedure begin MessageDlg(...); end);

2.Вы спрашиваете: Есть ли способ показать (нарисовать) основную форму после закрытия первой формы, но до показа сообщений? после закрытия первой формы, но до показа сообщений. Если вы показываете сообщения в форме «установить дату», как их можно отобразить, если форма закрыта. И зачем вам нужна форма для проверки даты? Вам действительно следует показать свой код в том виде, в каком он у вас есть сейчас.

3. Как насчет использования OnShow вместо OnActivate? (Не могу проверить себя прямо сейчас)

Ответ №1:

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

 const
  WM_DISPLAY_MSG = WM_APP   1000;

type
  TMainForm = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    procedure WMDisplayMsg(var Message: TMessage); message WM_DISPLAY_MSG;
  end;

var
 MainForm: TMainForm;

implementation

{$R *.dfm}

uses
  DateForm;

procedure TMainForm.FormActivate(Sender: TObject);
var
  frm: TDateForm; 
begin
  OnActivate := nil;
  frm := TDateForm.Create(Self);
  try
    frm.ShowModal;
    if (some condition) then
      PostMessage(Handle, WM_DISPLAY_MSG, 0, 0);
  finally
    frm.Free;
  end;
end;

procedure TMainForm.WMDisplayMsg(var Message: TMessage);
begin
  MessageDlg('Message Here', mtInformation, [mbOK], 0);
end;
 

Комментарии:

1. Нет абсолютно никаких причин для вызова FormActivate(Self) из WMPostActivate вместо прямого запуска соответствующего кода в этом обработчике сообщений.

2. @DalijaPrasnikar Это дело вкуса. Посторонний будет подозревать и искать событие в FormActivate. Он будет счастлив, если быстро найдет соответствующий код.

3. Хотя PostMessage() это, безусловно, правильное решение этой проблемы, этот код не совсем соответствует описанию операции. Это то MainForm , что используется OnActivate для модального отображения второй формы, а затем для отображения MessageDlg() после закрытия этой второй формы. Если вы обновите свой пример , чтобы перейти OnActivate к MainForm , и перейти PostMessage() к MainForm следующим Form2.ShowModal() выходам, тогда я буду голосовать.

4. @RemyLebeau procedure TForm2.Start добавил.