Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > центрирование диалогов


Автор: shmelina 15.6.2009, 12:08
Задача: Есть желание показывать диалоги по центрируя их относительно компонент из которых они вызываются.

Показывать диалоги по центру формы не всегда красиво. 

Допустим, у меня есть форма, на которой два грида, занимающие по ширине формы равное пространство. Когда я нажимаю кнопку "Удалить" для определенного грида, то я хочу, чтобы сообщение "Удалить запись?" возникало посередине (к примеру) соответствующего грида.

Написал отдельную процедурку, которую вызываю перед показом формы:
Код

procedure SetCenterPosition(AParent: TWinControl; AModal: TForm);
var
  MyPoint: TPoint;
begin
  if Assigned(AParent) then
  begin
    MyPoint := AParent.ClientToScreen(Point(AParent.Left, AParent.Top));
    AModal.Left := (MyPoint.X + AParent.Width div 2) - (AModal.Width div 2);
    AModal.Top := (MyPoint.Y + AParent.Height div 2) - (AModal.Height div 2);
  end
  else
    AModal.Position := poOwnerFormCenter;
end;


Но приглядевших, вижу, что не совсем она и по центру, как мне хотелось бы.

Написал тестовый код для проверки моих опасений:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  P: TPoint;
begin
  Form2 := TForm2.Create(Self);
  P := Button1.ClientToScreen(Point(Button1.Left, Button1.Top));
  Form2.Left := P.X;
  Form2.Top := P.Y;
  Form2.ShowModal;
end;

По идее, левый верхний край формы должен совпадать с координатами кнопки. Но он ниже и правее.

Помогите решить задачу.

Автор: Keeper89 15.6.2009, 12:39
Цитата(shmelina @  15.6.2009,  13:08 Найти цитируемый пост)
Но приглядевших, вижу, что не совсем она и по центру, как мне хотелось бы.

У меня все выстраивается по центру, единственное - небольшой сдвиг вниз по Y.
Цитата(shmelina @  15.6.2009,  13:08 Найти цитируемый пост)
По идее, левый верхний край формы должен совпадать с координатами кнопки. Но он ниже и правее.

А здесь вместо
Код

P := Button1.ClientToScreen(Point(Button1.Left, Button1.Top));

используйте
Код

P := ClientToScreen(Point(Button1.Left, Button1.Top));

Автор: shmelina 15.6.2009, 14:19
Спасибо! Там координаты кнопки прибавлялись, т.к. ClientToScreen я вызывал у нее.

Автор: shmelina 15.6.2009, 14:58
Вот готовый код. Вы создаете свою форму (.Create), а перед показом (.ShowModal) вызываете эту функцию, которая центрирует диалог относительно того визуального компонента, который вы ей передадите в параметре AParent.
Код

procedure SetCenterPosition(AParent: TWinControl; AModal: TForm);
var
  MyPoint: TPoint;
begin
  if Assigned(AParent) then
  begin
    if Assigned(AParent.Parent) then
      MyPoint := AParent.Parent.ClientToScreen(Point(AParent.Left, AParent.Top))
    else
      MyPoint := Point(AParent.Left, AParent.Top);
    AModal.Left := (MyPoint.X + AParent.Width div 2) - (AModal.Width div 2);
    AModal.Top := (MyPoint.Y + AParent.Height div 2) - (AModal.Height div 2);
    if AModal.Left < 0 then
      AModal.Left := 0;
    if AModal.Left + AModal.Width > Screen.WorkAreaWidth then
      AModal.Left := Screen.WorkAreaWidth - AModal.Width;
    if AModal.Top < 0 then
      AModal.Top := 0;
    if AModal.Top + AModal.Height > Screen.WorkAreaHeight then
      AModal.Top := Screen.WorkAreaHeight - AModal.Height;
  end
  else
    AModal.Position := poOwnerFormCenter;
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)