Mir ist der Gedanke gekommen, dass man das doch mit einfacher Prozentrechnung lösen könnte. Dazu merkt man sich den prozentualen Anteil (als Gleitkommazahl für größere Genauigkeit) der Koordinaten relativ zum gewünschten Rechteck. Der Einfachheit halber habe ich hier testhalber einen neuen Datentyp definiert und als privates Feld in meinem Formular deklariert:
Delphi-Quellcode:
type
TPercentRect = record
Left, Top, Width, Height: double;
end;
TFormTest = class(TForm)
Image1: TImage;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private-Deklarationen }
FPercent: TPercentRect;
public
{ Public-Deklarationen }
end;
So, nun rechnet man vor der ersten Größenänderung den jeweiligen Anteil aus und merkt sich den im Record.
Delphi-Quellcode:
procedure TFormTest.FormCreate(Sender: TObject);
begin
FPercent.Left := Button1.Left / ClientWidth * 100;
FPercent.Top := Button1.Top / ClientHeight * 100;
FPercent.Width := Button1.Width / ClientWidth * 100;
FPercent.Height := Button1.Height / ClientHeight * 100;
end;
Wird nun die Größe geändert, rechnet man die neuen Koordinaten zurück und positioniert den Button neu.
Delphi-Quellcode:
procedure TFormTest.FormResize(Sender: TObject);
var
NewLeft, NewTop, NewWidth, NewHeight: integer;
begin
NewLeft := round(ClientWidth / 100 * FPercent.Left);
NewTop := round(ClientHeight / 100 * FPercent.Top);
NewWidth := round(ClientWidth / 100 * FPercent.Width);
NewHeight := round(ClientHeight / 100 * FPercent.Height);
Button1.SetBounds(NewLeft, NewTop, NewWidth, NewHeight);
end;
In einem kleinen Testprogramm funktioniert das abgesehen von logischerweise auftretenden kleinen Rundungsungenauigkeiten ganz gut. Normalerweise würde ich zwar eher den Button ableiten und den Record dort deklarieren, aber ich wollte es so einfach wie möglich halten.