delphi 动态创建表单-边框行为

mftmpeh8  于 2023-05-06  发布在  其他
关注(0)|答案(1)|浏览(166)

我需要动态地创建具有固定宽度和高度的FMX表单,但是当删除边框或设置为BorderStyle=Single时,我会得到更大的尺寸。
BorderStyle设置为NoneSingle时,即使设置固定的ClientWidthClientHeight,窗体的大小也会保持原来的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,无论边框如何更改。

xj3cbfub

xj3cbfub1#

我认为这是一个应该报告的bug。但这里有一个解决方案,尽管它有几个硬编码的值。
我认为您希望为表单的工作区给予固定的大小。下面的大部分代码只是用于测试目的,所以关键部分只有大约九行。

var
  Form: TForm;

  function CreateForm(bs:TFMXFormBorderStyle; X,Y:Integer; w:Integer=300; h:Integer=300):TForm; //X and Y are just for testing purposes.
  var   Line:   TLine;  //Both variables are just for testing purposes.
    Shape: TRectangle;

    procedure AddLabel(Y:Single; s:string; Value:Integer);  //Only for testing purposes
    var Lbl:    TLabel;
    begin
      Lbl:=TLabel.Create(Result);
      with Lbl do begin
        Parent:=Result;
        Position.Y:=Y;
        Position.X:=150;
        Text:=s+'='+Value.ToString;
      end;
    end;

  begin
    Result:=TForm.CreateNew(Application);
    with Result do begin
      BorderStyle:=bs;
      case bs of
        TFMXFormBorderStyle.None:       begin Width:=w;         Height:=h;       end;
        TFMXFormBorderStyle.Single:     begin Width:=w+6;       Height:=h+29;    end;
        TFMXFormBorderStyle.Sizeable:   begin ClientWidth:=w;   ClientHeight:=h; end;
      end;
    end;

    //Everything below here is just for testing purposes.

    with Result do begin
      Fill.Color := TAlphaColors.Yellow;
      Fill.Kind := TBrushKind.Solid;
      Left:=X; Top:=Y;
    end;

    Shape := TRectangle.Create(Result);
    Shape.Parent := Result;
    Shape.SetBounds(0, 0, 300, 300);

    Line:=TLine.Create(Result);
    with Line do begin
      Parent:=Shape;
      ALign:=TAlignLayout.Contents;
    end;

    Result.Show;    //This needs to come before getting the widths and heights for the labels.

    AddLabel(20,'Width',        Result.Width);
    AddLabel(40,'Height',       Result.Height);
    AddLabel(60,'ClientWidth',  Result.ClientWidth);
    AddLabel(80,'ClientHeight', Result.ClientHeight);
  end;

begin
  //Form with Border Sizeable
  Form := CreateForm(TFmxFormBorderStyle.Sizeable,1200,30);

  //Form with Border Single
  Form := CreateForm(TFmxFormBorderStyle.Single,800,30);

  //Form with Border None
  Form := CreateForm(TFmxFormBorderStyle.None,300,30);
end;

相关问题