Delphi onshow主要表单/模态表单

col*_*lin 8 forms delphi modal-dialog

我有一个项目,主要形式和其他形式.当应用程序加载时,它需要执行一些任务并在主窗体顶部以模式形式显示结果.我遇到的问题是,如果我调用函数来执行任务/创建并在主窗体onshow事件中显示模态窗体,则会出现模态窗体,但主窗体不会直到模态窗体关闭,这是我期望发生什么.为了解决这个问题,我在主表单上添加了一个计时器,并在主表单onshow事件上启动它,计时器调用该函数来执行任务/创建并显示模态表单.所以现在主要形式出现在模态形式之前.

但是,我不认为这是最好的解决方案,并且想知道是否有人能提供更好的解决方案.

我使用的是Delphi 7

科林

Dav*_*nan 10

一个常用的选项是在表单中发布消息OnShow.像这样:

const
  WM_SHOWMYOTHERFORM = WM_USER + 0;

type
  TMyMainForm = class(TForm)
    procedure FormShow(Sender: TObject);
  protected
    procedure WMShowMyOtherForm(var Message: TMessage); message WM_SHOWMYOTHERFORM;
  end;

...


procedure TMyMainForm.FormShow(Sender: TObject);
begin
  PostMessage(Handle, WM_SHOWMYOTHERFORM, 0, 0);
end;

procedure TMyMainForm.WMShowMyOtherForm(var Message: TMessage);
begin
  inherited;
  with TMyOtherForm.Create(nil) do begin
    try
      ShowModal;
    finally
      Free;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是一个解决方案的正确理念,但它的实现并不是那么好.:)使用自定义消息,并为该特定消息实现处理程序,而不是替换整个WndProc.只需在表单的类型声明之前声明自定义消息,并添加`procedure UMShowMyOtherForm(var Message:TMessage); 消息UM_SHOWMYOTHERFORM;`.然后唯一中断"WndProc"正常流程的是你的自定义消息. (2认同)