1
votes

I've recently started converting an application to FireMonkey, and started with the simple controls. For some reason, their position is off, compared to dropped components on the form like say TPanel or TButton. From my tests, it appears the position is doubled.

My test project is simple: (in Delphi XE5)

  • create a new firemonkey HD application
  • drop a panel on the form at position (100,100) right click on it and "send to back"
  • paste the following code (adapt names where needed) for the custom component

code:

type
  TTest = class(TPaintBox)
  private
    FBitmap: TBitmap;
  public
    Constructor Create(AOwner:TComponent); override;
    Destructor Destroy; override;
    procedure Paint; override;
  end;

{ TTest }

constructor TTest.Create(AOwner: TComponent);
begin
  inherited;
  FBitmap := TBitmap.Create;
  FBitmap.LoadFromFile('c:\test.png');
  Width := FBitmap.Width;
  Height := FBitmap.Height;
end;

destructor TTest.Destroy;
begin
  FreeAndNil(FBitmap);
  inherited;
end;

procedure TTest.Paint;
begin
  Canvas.DrawBitmap(FBitmap,
     TRectf.Create(0, 0, FBitmap.Width, FBitmap.Height),
     AbsoluteRect,
     1);
end;
  • paste the following code to dynamically create the above component

code:

procedure TForm2.FormCreate(Sender: TObject);
var t: TTest;
begin
  t := TTest.Create(self);
  t.Parent := self;
  t.Position.X := 50;
  t.Position.Y := 50;
end;

Build it for Win32.

On my end, the image appears in the upper left corner for the panel, which is at 100,100 but the control is clearly set to position itself at 50,50

Debugging shows correct values on positions and rects.

I can't figure out what is going on. Maybe somebody has some suggestions/explanations.

Thanks.

1

1 Answers

3
votes

AbsoluteRect ist the rectangle of the Control relative to it's Form. If you want to paint something you have to use local coordinates, in this case LocalRect.

Canvas.DrawBitmap(FBitmap, TRectf.Create(0, 0, FBitmap.Width, FBitmap.Height), LocalRect, 1);