позицирование формы (с изменяемыми размерами)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

позицирование формы (с изменяемыми размерами)

Сообщение sunjob »

день добрей!

имеется главная форма, размер которой может меняться. надо что-бы форма "автоматом" центрировалась посреди экрана.

проперть отрабатывает только в момент запуска

Код: Выделить всё

form_main.Position:=poScreenCenter;


на все остальные события не реагирует

Код: Выделить всё

OnPaint()
OnResize()
OnShow()


пробовал "математику"

Код: Выделить всё

form_main.Top := (Screen.WorkAreaRect.Height - form_main.Height) div 2;
form_main.Left:= (Screen.WorkAreaRect.Width  - form_main.Width ) div 2;

form_main.Top := (Screen.DesktopRect.Height - form_main.Height) div 2;
form_main.Left:= (Screen.DesktopRect.Width  - form_main.Width ) div 2;

// если будет находиться на 2м мониторе, то при перерисовки перенесется на 1й
form_main.Top := (Screen.Monitors[0].WorkareaRect.Height - form_main.Height) div 2;
form_main.Left:= (Screen.Monitors[0].WorkareaRect.Width  - form_main.Width ) div 2;

form_main.Top := (Screen.Height - form_main.Height) div 2;
form_main.Left:= (Screen.Width  - form_main.Width ) div 2;

// как-то корявинько
form_main.Top := (Screen.MonitorFromWindow().WorkareaRect.Height - form_main.Height) div 2;
form_main.Left:= (Screen.MonitorFromWindow().WorkareaRect.Width  - form_main.Width ) div 2;

если юзать на основном мониторе, то проблем почти нет (не помню уже, что-то по мелочи бячит, но это по мелочи)
главное неудобство, что форму можно перенести на другой монитор и тогда на прорисовке она перенесется обратно на основной монитор

можно попробовать определить "текущий" монитор и использовать

Код: Выделить всё

Screen.Monitors[]

но пока тоже не расковырял, как это сделать.

какие будут идеи?

спасибо
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Screen.Monitors[I].WorkareaRect - даёт прямоугольник нужного монитора. С ним и работайте.
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

спасибо, конечно, но вы как обычно ни чего не поняли :mrgreen:
// если будет находиться на 2м мониторе, то при перерисовки перенесется на 1й
form_main.Top := (Screen.Monitors[0].WorkareaRect.Height - form_main.Height) div 2;
form_main.Left:= (Screen.Monitors[0].WorkareaRect.Width - form_main.Width ) div 2;


проблема в идентификации индекса активного монитора.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

sunjob, Forms.TMonitor.MonitorNum - индекс монитора на котором показывается форма.
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

во-во-во!!! золотые слова !!! щас попробуем-с... :D
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

Попробуйте MoveToDefaultPosition (если Position:= poScreenCenter, то этот метод должен поместить окно в центр).
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

спасибо за еще один пендиль! кланяюсь!!! :D

Снег Север писал(а):Forms.TMonitor.MonitorNum

как-то ... все так-же не катит, или я что не так не понял (скатывается на дефолтный монитор, т.е. непонятно, что делать?! если форма перенесена на 2й монитор то после "перерасчета" переносится обратно на 1й монитор)

Код: Выделить всё

i_mon := form_main.Monitor.MonitorNum;
form_main.Top := (Screen.Monitors[i_mon].WorkareaRect.Height - form_main.Height) div 2;
form_main.Left:= (Screen.Monitors[i_mon].WorkareaRect.Width  - form_main.Width ) div 2;


Alexx2000 писал(а):MoveToDefaultPosition

это отрабатывает так как надо! но... со второго раза (на первый раз перерисовывается со сдвигом, второй раз в центре, надо разбираться)
Последний раз редактировалось sunjob 28.01.2022 05:25:27, всего редактировалось 1 раз.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

sunjob попробйте еще у формы устанавливать свойство SetWindowToMonitor.
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

SetWindowToMonitor - это, видимо, из дельфи?! в fpc & lazarus нет упоминания в коде/исходниках (не нашел)
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

sunjob писал(а):SetWindowToMonitor - это, видимо, из дельфи?!

Да, не знал. что в лазаре его нет. Но в лазаре можно использовать getmonitor и MakeFullyVisible с указанием монитора.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Снег Север писал(а):Да, не знал. что в лазаре его нет.

Видимо не знают, как сделать кроссплатформенно...
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

спасибо за подсказку! в ближайшее время, как вернусь на лазаря, попробую (сейчас другие задачи)
если у кого еще будут мысли, пишите, высказывайтесь, постараюсь "отработать" все версии :P
Ответить