#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
добавил.