Grundsätzlich würde das Reagieren auf Änderungen von
Position
auch zur Laufzeit funktionieren (zumindest unter Windows). Mit folgendem, zugegeben ziemlich dirty Hack lässt sich die Funktionalität auch transparent nachbilden. In einem echten Projekt würde ich von dieser Lösung allerdings Abstand nehmen.
Delphi-Quellcode:
type
TFormHelper = class helper for TForm
private type
TFormStateHack = class(TFmxObject)
private
FDesigner: Pointer;
FCaption: Pointer;
FLeft: Integer;
FTop: Integer;
FTransparency: Boolean;
FHandle: Pointer;
FContextHandle: THandle;
FBorderStyle: TFmxFormBorderStyle;
FBorderIcons: TBorderIcons;
FVisible: Boolean;
FExplicitVisible: Boolean;
FModalResult: TModalResult;
FFormState: TFmxFormStates;
public
procedure ResetFormState;
end;
public
function GetPosition: TFormPosition;
procedure SetPosition(const Value: TFormPosition);
property Position: TFormPosition read GetPosition write SetPosition;
end;
procedure TFormHelper.TFormStateHack.ResetFormState;
begin
Include(FFormState, TFMXFormState.WasNotShown);
end;
function TFormHelper.GetPosition: TFormPosition;
begin
Result := inherited Position;
end;
procedure TFormHelper.SetPosition(const Value: TFormPosition);
begin
Hide;
inherited Position := TFormPosition.ScreenCenter;
TFormStateHack(Self).ResetFormState;
Show;
end;