Компонент Firemonkey сохраняет размер времени разработки - PullRequest
0 голосов
/ 26 августа 2018

Что касается этого вопроса, я смог создать компонент FMX, представляющий собой белый прямоугольник с черной рамкой, который можно нарисовать внутри курсором мыши (как в MS Paint).

enter image description here

Когда я компилирую и запускаю программу, я получаю это:

enter image description here

Почему?

Если я установлю, например, свойство Align, оно будет работать (клиент выравнивает его с клиентом). Если я выровняю компонент по Center, он будет в центре, но его размер будет меньше (как на картинке).

Похоже, он не "сохраняет" ширину и высоту, которые я установил в Инспекторе объектов. Мой компонент имеет этот соответствующий код:

type
  Test = class(TControl)
  strict private
    FLineFill: TStrokeBrush;
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Align;
property Anchors;
property ClipChildren;
property ClipParent;
property Cursor;
property Enabled;
property Locked;
property Height;
property HitTest;
property Opacity;
property Margins;
property Position;
property Visible;
property Width;
property OnClick;
property OnDblClick;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnMouseWheel;
property OnMouseEnter;
property OnMouseLeave;
property OnPainting;
property OnPaint;
property OnResize;
property OnResized;
end;

А вот и реализация:

constructor Test.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FLineFill := TStrokeBrush.Create(TBrushKind.Solid, $FF222222);
  //more...
end;

destructor Test.Destroy;
begin
  FLineFill.Free;
  inherited;
end;

procedure Test.Paint;
var
begin
  Canvas.Stroke.Assign(FLineFill);
  Canvas.ClearRect(ClipRect, TAlphaColorRec.White);

  Canvas.Stroke.Color := TAlphaColorRec.Black;
  //more code...
end;

Я посмотрел на исходный код TPlotGrid, который является простым компонентом, и он делает то, что я делаю в основном. Нужно ли настраивать что-то еще в событии Paint?

1 Ответ

0 голосов
/ 26 августа 2018

Вам необходимо добавить свойство Size, потому что именно оно заботится о измерении компонента.Он возвращает TControlSize, что делает именно то, что вам нужно.Из документа:

Объект TControlSize используется для управления размером компонента.Это можно указать с помощью атрибутов Size, Width, Height и PlatformDefault.

Просто добавьте этот код в опубликованную часть:

property Size;

Если вы посмотрите наего реализацию вы найдете

property Width: Single read GetWidth write SetWidth stored StoreWidthHeight;
property Height: Single read GetHeight write SetHeight stored StoreWidthHeight;
...