为什么我的 MDI 子窗体不是每次都以最大化状态打开?

Why my MDIChild forms not open in wsMaximized state every time?

Delphi MDIChild 窗口状态问题

我有一个带有 MDI 和 childs 的 delphi 项目。当我创建一个新的 child 表单时,它完全占据了主表单 (child wsMaximized) 上保留的 space。

但是当创建另一个child表单时(没有关闭第一个child),第一个child "lost a wsMaximized state".

简历:我每次都需要最大化child表格,但是当第二个child打开时,"windowstate"另一个childs被改变了。

第一child:

procedure TfrmPrincipal.PosicionarForm(AForm: TForm);
var
  Rect: TRect;
begin
  GetWindowRect(Application.MainForm.ClientHandle, Rect);

  InflateRect(Rect, -2 * GetSystemMetrics(SM_CXBORDER),
    -2 * GetSystemMetrics(SM_CYBORDER));
  OffsetRect(Rect, -Rect.Left, -Rect.Top);

  AForm.BoundsRect := Rect;
end;

procedure TfrmPrincipal.actCadastroFornecedorExecute(Sender: TObject);
begin
    frmCadastroFornecedor := TfrmCadastroFornecedor.Create(Application);
    PosicionarForm(frmCadastroFornecedor);
    frmCadastroFornecedor.Show;
  svSub.Visible := False;
  SV.Opened := False;
end;

第二 child:

procedure TfrmPrincipal.actCadastroProdutosExecute(Sender: TObject);
begin
  frmCadastroProduto := TfrmCadastroProduto.Create(Application);
  PosicionarForm(frmCadastroProduto);

  frmCadastroProduto.Show;

  svSub.Visible := False;
  SV.Opened := False;
end;

编辑:

我创建了一个新项目,有3个表单。代码非常简单,但这种行为仍在继续。

主表格:

 unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    screen11: TMenuItem;
    screen21: TMenuItem;
    procedure screen11Click(Sender: TObject);
    procedure screen21Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
unit2, unit3;

{$R *.dfm}

procedure TForm1.screen11Click(Sender: TObject);
begin
  form2 := tform2.Create(Application);
  form2.Show;
end;

procedure TForm1.screen21Click(Sender: TObject);
begin
form3 := tform3.Create(Application);
  form3.Show;
end;

end.

Child 1:

unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

end.

Child 2:

unit Unit3;

interface

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

type
  TForm3 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

end.

经过反复试验(再一次说明 完整 的重要性,最小的、可重现的示例)我能够重现您询问的错误。如果您包含了 .dfm 文件,那么实际问题就会很快得到解决。

现在,在删除其中一个子表单后,表单的 WindowStatewsMaximized 变为 wsNormal 的问题。

当您从 BorderIcons 中删除 Form2Form3

biMaximise 时会发生这种情况

解决:让 BorderIcons.biMaximise 被选中。

我还建议您从主窗体中删除 PosicionarForm(AForm: TForm);。它似乎没有做任何有用的事情。