2011-11-19 7 views
7

Ho un problema con la visualizzazione della finestra di dialogo modale al centro del modulo proprietario. Il mio codice per mostrare finestra di dialogo modale è:FireMonkey e visualizzazione del centro di dialogo modale del modulo proprietario

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; 

provato a cambiare proprietà Posizione in designer troppo, ma non sembra per centrare la finestra di dialogo.

Puoi dirmi cosa c'è che non va qui?

risposta

8

La posizione non è implementata in FireMonkey da ShowModal. Con l'aiuto di classe di seguito è possibile utilizzare: sdSettingsDialog.UpdateFormPosition Prima di chiamare 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

È l'uso di un aiutante di classe essenziale? –

+0

Domanda difficile David, no l'aiutante di classe non è essenziale, se preferisci: procedura UpdateFormPos (aForm: TForm) essere mio ospite. –

+3

@ArjenvanderSpek Grazie, funziona benissimo! Perché mi sembra che FireMonkey non sia ancora finito ed è come un muffin cotto a metà ... – evilone