为什么我的 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
文件,那么实际问题就会很快得到解决。
现在,在删除其中一个子表单后,表单的 WindowState
从 wsMaximized
变为 wsNormal
的问题。
当您从 BorderIcons
中删除 Form2
和 Form3
的 biMaximise
时会发生这种情况
解决:让 BorderIcons.biMaximise
被选中。
我还建议您从主窗体中删除 PosicionarForm(AForm: TForm);
。它似乎没有做任何有用的事情。
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
文件,那么实际问题就会很快得到解决。
现在,在删除其中一个子表单后,表单的 WindowState
从 wsMaximized
变为 wsNormal
的问题。
当您从 BorderIcons
中删除 Form2
和 Form3
biMaximise
时会发生这种情况
解决:让 BorderIcons.biMaximise
被选中。
我还建议您从主窗体中删除 PosicionarForm(AForm: TForm);
。它似乎没有做任何有用的事情。