fsStayOnTop表单隐藏的模态表单 [英] Modal forms hidden by fsStayOnTop forms

查看:125
本文介绍了fsStayOnTop表单隐藏的模态表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个表单(在下面的示例中为TBigForm),该表单允许处理一些复杂的数据并需要显示其他信息.我将此信息放在fsStayOnTop表单(示例中为OnTopForm)中,以确保它始终可见,但在必要时可以移开.现在,当TBigForm中的某些用户操作显示模式窗体时,这通常会隐藏在OnTopForm后面,这会使应用程序看起来冻结.如何避免这种情况? (搜索会产生很多很多匹配,但我无法从中提取解决方案.)

I have a form (TBigForm in the example below) which allows to manipulate some complex data and needs additional information to be shown. I put this info in a fsStayOnTop form (OnTopForm in the example) to ensure it's always visible but can be moved out of the way if necessary. Now when some user action in TBigForm shows a modal form this often gets hidden behind OnTopForm which makes the app look frozen. How can I avoid this? (Searching yields many, many hits but I wasn't able to distill a solution out of them.)

在我的真实应用中,有很多地方显示模态形式,所以我要避免更改所有这些调用.

In my real app there are a lot of places where modal forms are shown, so I would like to avoid changing all of these calls.

示例:创建一个新的VCL应用程序,在Form1上放置一个TButton,双击该按钮,并将生成的Button1Click实现存根替换为以下内容:

Example: Create a new VCL application, drop a TButton on Form1, double-click the button and replace the generated Button1Click implementation stub with the following:

type
  TBigForm = class(TForm)
  strict private
    OnTopForm: TForm;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  protected
    procedure DoHide; override;
    procedure DoShow; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

{ TBigForm }

procedure TBigForm.Button1Click(Sender: TObject);
begin
  ShowMessage('Test');
end;

constructor TBigForm.Create(AOwner: TComponent);
begin
  inherited CreateNew(AOwner);

  Caption := 'Big form';
  WindowState := wsMaximized;

  Button1 := TButton.Create(Self);
  Button1.Parent := Self;
  Button1.Caption := 'Freeze!';
  Button1.SetBounds(10, 10, 100, 100);
  Button1.OnClick := Button1Click;
end;

procedure TBigForm.DoHide;
begin
  OnTopForm.Free;
  inherited DoHide;
end;

procedure TBigForm.DoShow;
begin
  inherited DoShow;
  OnTopForm := TForm.Create(Self);
  OnTopForm.Caption := 'Important information';
  OnTopForm.BorderStyle := bsToolWindow;
  OnTopForm.FormStyle := fsStayOnTop;
  OnTopForm.Position := poScreenCenter;
  OnTopForm.Show;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  f: TBigForm;
begin
  f := TBigForm.Create(nil);
  try
    f.ShowModal;
  finally
    f.Free;
  end;
end;

启动应用程序,单击按钮1",然后单击冻结!".

Start the app, click on "Button1" and then on "Freeze!".

(顺便说一句:我们使用D2007.)

(BTW: We use D2007.)

推荐答案

在调用ShowModal()之前,尝试将模式窗体的PopupParent属性设置为StayOnTop Form,或者将Application.ModalPopupMode属性设置为pmNone以外的其他属性.

Try setting the modal Form's PopupParent property to be the StayOnTop Form, or set the Application.ModalPopupMode property to something other than pmNone, prior to calling ShowModal().

这篇关于fsStayOnTop表单隐藏的模态表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆