Подкласс Firemonkey TControl не может использовать компонент

Я хочу попытаться создать визуальный компонент firemonkey, и я видел онлайн, который TControlдает основные потребности. Это то, что я сделал до сих пор:

  TMyTest = class(TControl)
  strict private
    //code...
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    //code...
  end;

Я посмотрел на исходный код компонента FMX, PlotGridи я скопировал, что он делает. Мой класс спускается с TControl (например, PlotGrid) и переопределяет конструктор TMyTest . Создать ( AOwner : TComponent ); begin inherited Create ( AOwner ); SetAcceptsControls ( False ); конец ; деструктор TMyTest . Уничтожить ; начать унаследовать ; конец ; процедура TMyTest . Краска ; var i : integer ; a , b : TPointF ; начать Холст . Заполните . Цвет : = TAlphaColorRec . Белый ; Холст . Ход . Цвет : = TAlphaColorRec . Черный ; Холст . Ход . Толщина : = 2 ; a . X : = 0 ; a . Y : = Высота / 2 ; b . X : = Ширина ; b . Y : = Высота / 2 ; Холст . DrawLine ( a , b , 1 ); конец ; (например, PlotGrid). Посмотрите на код:

Opacity := 1;

Учитывая этот код, я ожидаю иметь что-то вроде этого (я отредактировал с изображением Paint, это не настоящий)

введите описание изображения здесь

Проблема в том, что я получаю это

введите описание изображения здесь

Компонент отлично, потому что я вижу все методы и свойства, и они работают. Компонент функциональный, но я не вижу его в дизайнере! Если я запустил приложение FMX, я не вижу цветов:

введите описание изображения здесь

Есть идеи?


Я установил Paintв начале Paintсобытия, но все равно ничего.

delphi,firemonkey,

1

Ответов: 1


Я установил Paintв начале Paintсобытия, но все равно ничего.

11
5 принят

Ваш контроль рисуется на общем холсте. К тому времени, когда он достигнет значения вашего Paintметода управления, Canvas.Stroke.Kindэто TBrushKind.Noneтак, если вы не присвоите ему какое-то другое значение, оно на самом деле ничего не накрасит.

Вы должны добавить

Canvas.Stroke.Kind := TBrushKind.Solid;

Но это будет только рисовать горизонтальную линию (вы забыли создать точки и сделать DrawLineпризыв к вертикальной), и она не будет заполнять фон белым цветом.

Самый простой способ сделать это

Canvas.ClearRect(ClipRect, TAlphaColorRec.White);

Обычно общие значения холста могут (и будут) меняться другими элементами управления. Лучший способ справиться с этим - подражать коду от TShapeпредоставления ваших собственных TFillи TStrokeполей и назначать их холсту перед рисованием. Таким образом, вы можете быть уверены, что не пропустите установку определенного значения Stroke или Fill, которое может быть изменено вне вашего контроля.

Дельфы, FireMonkey,
Похожие вопросы