首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当owner是MDI时,如何定位TForm poOwnerFormCenter?

当owner是MDI时,如何定位TForm poOwnerFormCenter?
EN

Stack Overflow用户
提问于 2018-06-07 23:21:33
回答 1查看 900关注 0票数 2

我想将TCustomForm的后代显示为对话框,以便将它们定位为poOwnerFormCenter。但是,当FormStylefsNormal时,正确定位窗体的代码不会在FormStylefsMDIChild时设置正确的位置。

当辅助表单具有FormStyle = fsNormal时,Button1将打开模式对话框,如下所示:

但是,当辅助窗体具有FormStyle = fsMDIChild时,定位似乎是相对于MDI子窗体相对于MDI父窗体的位置,而不是相对于MDI子窗体的绝对位置:

我不确定我是否犯了任何错误,这可能是一个bug或正常行为。

下面的代码用于显示对话框:

代码语言:javascript
复制
procedure TForm3.Button1Click(Sender: TObject);
var
  AModalForm: TForm;
begin
  AModalForm := TForm.Create(Self);
  try
    AModalForm.Position := poOwnerFormCenter;
    AModalForm.ShowModal;
  finally
    AModalForm.Free;
  end;
end;

要复制的项目:

dpr

代码语言:javascript
复制
program Project2;

uses
  Vcl.Forms,
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3};

{$R *.res}

var
  AMainForm: TForm2;
  A: TApplication;
begin
  A := Application;
  A.Initialize;
  A.MainFormOnTaskbar := True;
  A.CreateForm(TForm2, AMainForm);
  A.Run;
end.

Unit2

pas

代码语言:javascript
复制
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Menus;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

uses
  Unit3;

procedure TForm2.Button1Click(Sender: TObject);
var
  AForm: TForm3;
begin
  AForm := TForm3.Create(Self);
  AForm.FormStyle := fsMDIChild;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
  AForm: TForm3;
begin
  AForm := TForm3.Create(Self);
  AForm.FormStyle := fsNormal;
end;

end.

dfm

代码语言:javascript
复制
object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'Form2'
  ClientHeight = 356
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  FormStyle = fsMDIForm
  OldCreateOrder = False
  Visible = True
  PixelsPerInch = 96
  TextHeight = 13
  object Panel1: TPanel
    Left = 0
    Top = 0
    Width = 97
    Height = 356
    Align = alLeft
    TabOrder = 0
    object Button1: TButton
      Left = 8
      Top = 39
      Width = 75
      Height = 25
      Caption = 'fsMDIChild'
      TabOrder = 0
      OnClick = Button1Click
    end
    object Button2: TButton
      Left = 8
      Top = 8
      Width = 75
      Height = 25
      Caption = 'fsNormal'
      TabOrder = 1
      OnClick = Button2Click
    end
  end
end

Unit3

pas

代码语言:javascript
复制
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm3 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
  AModalForm: TForm;
begin
  AModalForm := TForm.Create(Self);
  try
    AModalForm.Position := poOwnerFormCenter;
    AModalForm.ShowModal;
  finally
    AModalForm.Free;
  end;
end;


end.

dfm

代码语言:javascript
复制
object Form3: TForm3
  Left = 0
  Top = 0
  Caption = 'Form3'
  ClientHeight = 336
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Visible = True
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 06:11:49

在尝试了在这里和其他地方找到的几个想法之后,我所有的尝试都失败了,我想最安全的解决方案如下所示。

代码语言:javascript
复制
Unit1 - Form1:TForm1 - fsMDIForm
Unit2 - Form2:TForm2 - fsMDIChild
Unit3 - AModalForm:TFom3 - ordinary form, shown modally, centered on the Form2

最重要的部分仅仅是手动计算和设置AModalFormLeftTop属性,使其居中。它还需要将Position属性设置为poDesigned

代码语言:javascript
复制
// Showing the modal form centered by a fsMDIChild form
procedure TForm2.Button1Click(Sender: TObject);
var
  AModalForm: TForm3;
begin
  AModalForm := TForm3.Create(self);
  try
    AModalForm.Left := Self.ClientOrigin.X + (Self.ClientWidth-AModalForm.Width) div 2;
    AModalForm.Top  := Self.ClientOrigin.Y + (Self.ClientHeight-AModalForm.Height) div 2;
    AModalForm.Position := poDesigned;

    AModalForm.ShowModal;
    // use modalresult as needed
  finally
    AModalForm.Free;
  end;
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50744920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档