FireMonkey и отображение модального диалогового центра формы владельца - PullRequest
7 голосов
/ 19 ноября 2011

У меня проблема с отображением модального диалога в центре формы владельца. Мой код для отображения модального диалога:

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;

Пытался изменить свойство Position в конструкторе, но, похоже, он не центрирует диалог.

Можете ли вы сказать мне, что здесь не так?

1 Ответ

8 голосов
/ 19 ноября 2011

Позиция не реализована в FireMonkey от ShowModal. С помощником класса ниже вы можете использовать: sdSettingsDialog.UpdateFormPosition перед вызовом 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;
...