太多调用paint方法

时间:2016-06-27 12:50:57

标签: delphi firemonkey delphi-xe7

我创建了一个测试组件

unit Control1;

interface

uses
  System.SysUtils, System.Classes, FMX.Types, FMX.Controls;

type
  TTestComp = class(TControl)
  private
    i: integer;
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Width;
    property Height;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Test', [TTestComp]);
end;

{ TTestComp }

constructor TTestComp.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  i := 0;
end;

procedure TTestComp.Paint;
begin
  inherited;
  inc(i);
  canvas.BeginScene;
  canvas.Fill.Color := $FF000000;
  canvas.FillRect(localrect, 0, 0, [], 1);
  canvas.Fill.Color := $FFFFFFFF;
  canvas.FillText(localrect, IntToStr(i), false, 1, [], TTextAlign.Center);
  canvas.EndScene;
end;

end.

问题在于:

  1. 组件正在左上角绘制
  2. 调整表单大小时,绘制方法调用太多。
  3. Just resized form

    刚重新调整表格。

    我有很多组件,根据这个原则构建。当我改变表格的大小时,它们开始滞后(低FPS)。

    标准组件(TButton等)工作正常

1 个答案:

答案 0 :(得分:0)

  

1.Component正在左上角绘图

您的组件正在精确绘制它的位置(Position属性)。如果您没有为Position.XPosition.Y分配任何值,则默认值0将用于两者。

  

2.调整表单大小时,调用很多绘制方法。

当您调整表单大小时,所有组件都会重新绘制,同样也是f.ex.纽扣。在81个控件的测试中,我没有意识到任何滞后(但我认为你的实际控件比这个示例控件做了更多的绘画)。