gpt4 book ai didi

delphi - 如何在 FireMonkey 中限制最小表单的宽度?

转载 作者:行者123 更新时间:2023-12-03 14:42:31 25 4
gpt4 key购买 nike

如何在 FireMonkey 中限制最小表单的宽度?它曾经在 VCL 中非常简单 - 它只在表单属性中具有 Max 和 Min 约束。

最佳答案

future 读者注意事项:

这仅适用于 XE3 以下的版本,因为 XE3 中删除了 Fmx::Platform::TPlatform 类。感谢@Alain Thiffault 在评论中指出。

原帖:

这是一个更复杂(但更优雅)的替代解决方案,定义一个完全自定义的 Form 类,您可以从中继承自己的...

unit FMX.ConstrainedForm;

interface

uses
System.Classes, System.Types, System.UITypes, FMX.Forms, FMX.Platform, FMX.Types;

type
TFormConstraints = class(TPersistent)
private
FMaxHeight: Integer;
FMaxLeft: Integer;
FMaxWidth: Integer;
FMaxTop: Integer;
FMinHeight: Integer;
FMinLeft: Integer;
FMinWidth: Integer;
FMinTop: Integer;
public
constructor Create;
published
property MaxHeight: Integer read FMaxHeight write FMaxHeight default 0;
property MaxLeft: Integer read FMaxLeft write FMaxLeft default 0;
property MaxWidth: Integer read FMaxWidth write FMaxWidth default 0;
property MaxTop: Integer read FMaxTop write FMaxTop default 0;
property MinHeight: Integer read FMinHeight write FMinHeight default 0;
property MinLeft: Integer read FMinLeft write FMinLeft default 0;
property MinWidth: Integer read FMinWidth write FMinWidth default 0;
property MinTop: Integer read FMinTop write FMinTop default 0;
end;

TConstrainedForm = class(TCustomForm)
private
FConstraints: TFormConstraints;
protected
procedure StartWindowResize; override;
procedure StartWindowDrag; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
published
property Constraints: TFormConstraints read FConstraints write FConstraints;
property BiDiMode;
property Caption;
property Cursor default crDefault;
property BorderStyle default TFmxFormBorderStyle.bsSizeable;
property BorderIcons default [TBorderIcon.biSystemMenu, TBorderIcon.biMinimize, TBorderIcon.biMaximize];
property ClientHeight;
property ClientWidth;
property Left;
property Top;
property Margins;
property Position default TFormPosition.poDefaultPosOnly;
property Width;
property Height;
property ShowActivated default True;
property StaysOpen default True;
property Transparency;
property TopMost default False;
property Visible;
property WindowState default TWindowState.wsNormal;
property OnCreate;
property OnDestroy;
property OnClose;
property OnCloseQuery;
property OnActivate;
property OnDeactivate;
property OnResize;
property Fill;
property StyleBook;
property ActiveControl;
property StyleLookup;
property OnPaint;
end;

procedure Register;

implementation

{ TFormConstraints }

constructor TFormConstraints.Create;
begin
inherited;
FMaxHeight := 0;
FMaxLeft := 0;
FMaxWidth := 0;
FMaxTop := 0;
FMinHeight := 0;
FMinLeft := 0;
FMinWidth := 0;
FMinTop := 0;
end;

{ TConstrainedForm }

constructor TConstrainedForm.Create(AOwner: TComponent);
begin
FConstraints := TFormConstraints.Create;
inherited;
end;

destructor TConstrainedForm.Destroy;
begin
FConstraints.Free;
inherited;
end;

procedure TConstrainedForm.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
if (FConstraints.FMinWidth > 0) and (AWidth < FConstraints.FMinWidth) then
AWidth := FConstraints.FMinWidth;

if (FConstraints.FMaxWidth > 0) and (AWidth > FConstraints.FMaxWidth) then
AWidth := FConstraints.FMaxWidth;

if (FConstraints.FMinHeight > 0) and (AHeight < FConstraints.FMinHeight) then
AHeight := FConstraints.FMinHeight;

if (FConstraints.FMaxHeight > 0) and (AHeight > FConstraints.FMaxHeight) then
AHeight := FConstraints.FMaxHeight;

if (FConstraints.FMinLeft > 0) and (ALeft < FConstraints.FMinLeft) then
ALeft := FConstraints.FMinLeft;

if (FConstraints.FMaxLeft > 0) and (ALeft > FConstraints.FMaxLeft) then
ALeft := FConstraints.FMaxLeft;

if (FConstraints.FMinTop > 0) and (ATop < FConstraints.FMinTop) then
ATop := FConstraints.FMinTop;

if (FConstraints.FMaxTop > 0) and (ATop > FConstraints.FMaxTop) then
ATop := FConstraints.FMaxTop;

Platform.SetWindowRect(Self, RectF(ALeft, ATop, ALeft + AWidth, ATop + AHeight));
inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;

procedure TConstrainedForm.StartWindowDrag;
begin
inherited;

end;

procedure TConstrainedForm.StartWindowResize;
begin
inherited;
end;

procedure Register;
begin
RegisterClass(TConstrainedForm);
end;

end.

将此文件存储为 FMX.ConstrainedForm.pas,将其添加到表单的“使用”部分,然后修改表单的声明,以便:

TForm1 = class(TForm)

它说:

TForm1 = class(TConstrainedForm)

由于缺乏自定义设计(无论如何,这是一个“快速解决方案”),您需要按如下方式 Hook 表单的 OnCreate 事件:

procedure TForm1.FormCreate(Sender: TObject);
begin
Constraints.MinWidth := 400;
Constraints.MinHeight := 400;
end;

现在该表单将不允许用户将其宽度或高度设置为低于 400!

再次强调,无需对 FireMonkey 平台本身进行任何实质性更改,这是您目前所能获得的最好的结果!

关于delphi - 如何在 FireMonkey 中限制最小表单的宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8031685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com