【问题标题】:MessageDlg showing before FormMessageDlg 显示在 Form 之前
【发布时间】:2021-08-27 23:10:57
【问题描述】:

我有一个 MainForm,它在激活时会调用另一个 Form 来更改应用程序日期(模态、显示、关闭),然后进行一些检查并显示一条消息(如果它适用于检查)。

有没有办法在关闭第一个窗体之后但在显示消息之前显示(绘制)主窗体?

今天:

  • MainForm.Activate
  • 日期表单使用
  • 在桌面(或其他应用程序)上显示 MessageDlg
  • MainForm 绘制且可见

我想要这样的东西,但我可以弄清楚如何:

  • MainForm.Activate
  • 日期表单使用
  • MainForm 绘制且可见
  • 在 MainForm 上显示 MessageDlg

感谢您的任何想法!

【问题讨论】:

  • 如果您可以显示您正在使用的代码,这将有所帮助。但是在这种情况下我可能会做的是使用TThread.ForceQueue() 或等效于延迟显示MessageDlg() 直到MainForm 准备好之后,例如:TThread.ForceQueue(nil, procedure begin MessageDlg(...); end);
  • 你说:有没有办法在关闭第一个表单之后,但在显示消息之前显示(绘制)MainForm? 之后关闭第一个表单,但之前显示消息。如果您在 date-set-check-something 表单中显示消息,如果表单关闭,它们如何显示。为什么需要表格来检查日期?你真的应该像现在一样展示你的代码。
  • 使用 OnShow 代替 OnActivate 怎么样? (现在无法测试自己)

标签: delphi delphi-10.3-rio


【解决方案1】:

在其 OnActivate 事件中将延迟消息发布到 MainForm,然后在收到并处理该消息时显示 MessageDlg。首次使用后停用 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;

【讨论】:

  • 绝对没有理由从 WMPostActivate 调用 FormActivate(Self) 而不是直接在该消息处理程序中运行适当的代码。
  • @DalijaPrasnikar 这是一个品味问题。局外人会怀疑并搜索 FormActivate 中的事件。如果他能快速找到相关代码,他会很高兴。
  • 虽然PostMessage() 肯定是解决此问题的有效方法,但此代码与 OP 的描述不太匹配。正是MainForm 使用OnActivate 以模态方式显示第二个表单,然后在第二个表单关闭后显示MessageDlg()。如果您更新示例以将OnActivate 移动到MainForm,并在Form2.ShowModal() 退出后将PostMessage() 移动到MainForm,那么我会投票赞成。
  • @RemyLebeau procedure TForm2.Start 已添加。
猜你喜欢
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 2011-09-14
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
相关资源
最近更新 更多