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

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

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

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

Сообщение sunjob » 27.01.2022 13:57:52

день добрей!

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

проперть отрабатывает только в момент запуска
Код: Выделить всё
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[]

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

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

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

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

Сообщение Снег Север » 27.01.2022 15:25:50

Screen.Monitors[I].WorkareaRect - даёт прямоугольник нужного монитора. С ним и работайте.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3051
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение sunjob » 27.01.2022 15:48:04

спасибо, конечно, но вы как обычно ни чего не поняли :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;


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

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

Сообщение Снег Север » 27.01.2022 16:15:05

sunjob, Forms.TMonitor.MonitorNum - индекс монитора на котором показывается форма.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3051
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение sunjob » 27.01.2022 16:47:01

во-во-во!!! золотые слова !!! щас попробуем-с... :D
Аватара пользователя
sunjob
постоялец
 
Сообщения: 176
Зарегистрирован: 12.01.2011 15:19:54

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

Сообщение Alexx2000 » 27.01.2022 16:49:04

Попробуйте MoveToDefaultPosition (если Position:= poScreenCenter, то этот метод должен поместить окно в центр).
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 489
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

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

Сообщение sunjob » 27.01.2022 16:57:40

спасибо за еще один пендиль! кланяюсь!!! :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 06:25:27, всего редактировалось 1 раз.
Аватара пользователя
sunjob
постоялец
 
Сообщения: 176
Зарегистрирован: 12.01.2011 15:19:54

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

Сообщение Снег Север » 27.01.2022 20:22:16

sunjob попробйте еще у формы устанавливать свойство SetWindowToMonitor.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3051
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение sunjob » 28.01.2022 06:41:08

SetWindowToMonitor - это, видимо, из дельфи?! в fpc & lazarus нет упоминания в коде/исходниках (не нашел)
Аватара пользователя
sunjob
постоялец
 
Сообщения: 176
Зарегистрирован: 12.01.2011 15:19:54

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

Сообщение Снег Север » 28.01.2022 12:22:46

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

Да, не знал. что в лазаре его нет. Но в лазаре можно использовать getmonitor и MakeFullyVisible с указанием монитора.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3051
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение Vadim » 28.01.2022 15:32:06

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

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

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

Сообщение sunjob » 28.01.2022 16:50:46

спасибо за подсказку! в ближайшее время, как вернусь на лазаря, попробую (сейчас другие задачи)
если у кого еще будут мысли, пишите, высказывайтесь, постараюсь "отработать" все версии :P
Аватара пользователя
sunjob
постоялец
 
Сообщения: 176
Зарегистрирован: 12.01.2011 15:19:54


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 12

Рейтинг@Mail.ru