2011-11-19 15 views
7

Mam problem z wyświetlaniem modalnego okna dialogowego w środku formularza właściciela. Mój kod pokazując okno modalne to:FireMonkey i pokazujące modalne okno dialogowe właściciela formularza

procedure TfrmMain.btnOpenSettingsClick(Sender: TObject); 
var 
    sdSettingsDialog: TdlgSettings; 

begin 
    sdSettingsDialog := TdlgSettings.Create(Self); 
    sdSettingsDialog.Position := TFormPosition.poOwnerFormCenter; 

    try 
     sdSettingsDialog.ShowModal; 
    finally 
    sdSettingsDialog.Free; 
    end; 
end; 

Próbowano zmienić właściwość Pozycja w projektanta też, ale nie wydaje się, aby wyśrodkować okno.

Czy możesz mi powiedzieć, co jest nie tak?

Odpowiedz

8

Pozycja nie jest zaimplementowana w FireMonkey przez ShowModal. z klasą pomocnika poniżej można użyć: sdSettingsDialog.UpdateFormPosition przed wywołaniem ShowModal:

type 
    TFormHelper = class helper for TForm 
    procedure UpdateFormPosition; 
    end; 

procedure TFormHelper.UpdateFormPosition; 
var 
    RefForm: TCommonCustomForm; 
begin 
    RefForm := nil; 

    case Position of 
    // TFormPosition.poScreenCenter: implemented in FMX.Forms (only one) 
    TFormPosition.poOwnerFormCenter: 
     if Assigned(Owner) and (Owner is TCommonCustomForm) then 
     RefForm := Owner as TCommonCustomForm; 
    TFormPosition.poMainFormCenter: 
     RefForm := Application.MainForm; 
    end; 

    if Assigned(RefForm) then 
    begin 
    SetBounds(
     System.Round((RefForm.Width - Width)/2) + RefForm.Left, 
     System.Round((RefForm.Height - Height)/2) + RefForm.Top, 
     Width, Height); 
    end; 
end; 
+0

Czy korzystanie z klasy pomocnika istotne? –

+0

Trudne pytanie David, nie pomocnik klasy nie jest niezbędny, jeśli wolisz: procedura UpdateFormPos (aForm: TForm) bądź moim gościem. –

+3

@ArjenvanderSpek Dzięki, działa świetnie! Dlaczego czuję, że FireMonkey nie jest jeszcze całkiem gotowy i jest jak pół upieczony muffin ... – evilone