Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#10

AW: Position der FMX-Formulare zur Laufzeit verändern (Delphi XE 10.1)

  Alt 3. Nov 2016, 10:24
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat