2011-11-19 29 views
7

Tengo un problema al mostrar el cuadro de diálogo modal en el centro del formulario de propietario. Mi código para mostrar diálogo modal es:FireMonkey y muestra el cuadro de diálogo modal del formulario de propietario

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; 

tratado de cambiar la propiedad Posición en el diseñador también, pero no parece centrar el diálogo.

¿Puede decirme qué sucede aquí?

Respuesta

8

La posición no está implementada en FireMonkey por ShowModal. Con el ayudante de clase a continuación se puede utilizar: sdSettingsDialog.UpdateFormPosition antes de llamar 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

es el uso de un ayudante de clase esencial? –

+0

Pregunta difícil David, no el ayudante de clase no es esencial, si lo prefiere: procedure UpdateFormPos (aForm: TForm) sea mi invitado. –

+3

@ArjenvanderSpek ¡Gracias, funciona genial! Por qué siento que FireMonkey todavía no está terminado y es como panecillo medio horneado ... – evilone

Cuestiones relacionadas