我需要动态地创建具有固定宽度和高度的FMX表单,但是当删除边框或设置为BorderStyle=Single时,我会得到更大的尺寸。
当BorderStyle设置为None或Single时,即使设置固定的ClientWidth和ClientHeight,窗体的大小也会保持原来的Windows边框,因此如果我创建Sizeable(默认)窗体,两个窗体的大小会保持相同,这是不正确的。
请看图片以更好地理解:
使用 Delphi 10.4和Windows 11,但我在其他环境中测试过,它也有同样的问题。
var
Form: TForm;
Shape: TRectangle;
begin
//Form with Border Sizeable
Form := TForm.CreateNew(Application);
Form.BorderStyle := TFmxFormBorderStyle.Sizeable;
Form.Fill.Color := TAlphaColors.Yellow;
Form.Fill.Kind := TBrushKind.Solid;
Form.ClientWidth := 300;
Form.ClientHeight := 300;
Shape := TRectangle.Create(Form);
Shape.Parent := Form;
Shape.SetBounds(0, 0, 300, 300);
Form.Show;
//Form with Border Single
Form := TForm.CreateNew(Application);
Form.BorderStyle := TFmxFormBorderStyle.Single;
Form.Fill.Color := TAlphaColors.Yellow;
Form.Fill.Kind := TBrushKind.Solid;
Form.ClientWidth := 300;
Form.ClientHeight := 300;
Shape := TRectangle.Create(Form);
Shape.Parent := Form;
Shape.SetBounds(0, 0, 300, 300);
Form.Show;
//Form with Border None
Form := TForm.CreateNew(Application);
Form.BorderStyle := TFmxFormBorderStyle.None;
Form.Fill.Color := TAlphaColors.Yellow;
Form.Fill.Kind := TBrushKind.Solid;
Form.ClientWidth := 300;
Form.ClientHeight := 300;
Shape := TRectangle.Create(Form);
Shape.Parent := Form;
Shape.SetBounds(0, 0, 300, 300);
Form.Show;
end;
在表单设计器中做同样的事情,不会出现问题。
如果在BorderStyle = None时设置Width和Height而不是ClientWidth和ClientHeight,则可以正常工作,但当我设置BorderStyle = Single时,就会出现问题,在这种情况下,我无法设置Width和Height,因为我仍然有表单边框。
在VCL环境中,这完全符合预期,其中通过更改边框来改变真实的窗口大小(考虑边框),始终保持ClientRect(ClientWidth和ClientHeight)相同。
预期(在具有相同大小的VCL中运行):所有表单都具有相同的ClientRect,无论边框如何更改。
1条答案
按热度按时间xj3cbfub1#
我认为这是一个应该报告的bug。但这里有一个解决方案,尽管它有几个硬编码的值。
我认为您希望为表单的工作区给予固定的大小。下面的大部分代码只是用于测试目的,所以关键部分只有大约九行。