Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> центрирование диалогов, относительно отдельных контролов 
V
    Опции темы
shmelina
Дата 15.6.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



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

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

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

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

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;

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

Помогите решить задачу.
PM MAIL   Вверх
Keeper89
Дата 15.6.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Цитата(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));



--------------------
PM MAIL WWW   Вверх
shmelina
Дата 15.6.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) shmelina - 15.6.2009, 14:24
PM MAIL   Вверх
shmelina
Дата 15.6.2009, 14:58 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 5.6.2009

Репутация: нет
Всего: нет



Вот готовый код. Вы создаете свою форму (.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;



Это сообщение отредактировал(а) shmelina - 15.6.2009, 15:34
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0409 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.