Где обрабатывать изменение размера компонента?

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

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

Где обрабатывать изменение размера компонента?

Сообщение Flanter » 20.10.2009 19:09:51

Собственно, вопрос такой. Есть форма, которая пока не отображена, хотя и создана. На ней есть компонент, у которого Anchors равно [akTop,akLeft,akRight,akBottom], т.е. он должен автоматом растягиваться при изменении размеров формы. Теперь устанавливаем данной форме новую высоту, например (Form2.Height := 500). Затем отображаем форму (Form2.Show). Если поставить обработчики событий OnResize или OnShow формы, то видно, что в них компонент ещё имеет старые размеры. А хотелось бы расчитать некоторые параметры для корректного отображения его содержимого! Компонент не имеет собственного обработчика события OnResize.

Собственно, вопросы: в какой момент форма подгоняет размеры размещенных на ней компонентов со свойством Anchors при изменении собственного размера? Как принудительно заставить форму подогнать размеры дочерних компонентов в нужный мне момент?

Прикладываю пример проекта. На первой форме кнопка - в её обработчике выполняется изменение размеров второй формы и её отображение. На второй форме компонент, привязанный ко всем сторонам. В обработчиках OnResize и OnShow показывается высота компонента - к этому моменту она должна была уже стать 500, но показывается старое значение 281... При этом после появления на экране компонент на форме уже нового размера...

Подскажите, пожалуйста, что у меня не так! :(
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Re: Где обрабатывать изменение размера компонента?

Сообщение v-t-l » 21.10.2009 11:12:51

например Form2.OnPaint - правда вызываться будет очень часто.
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Где обрабатывать изменение размера компонента?

Сообщение Flanter » 21.10.2009 15:16:08

С одной стороны, это, конечно, выход - в OnPaint компонент действительно имеет уже новую высоту. Одна проблема: это событие вызывается уже после того как форма появилась на экране. То есть, форма появляется со старым рисунком на компоненте, а потом на виду у пользователя перерисовывается в новое состояние. Пусть быстро, но всё равно визуально заметно :(

Неужели нет какой-нибудь функции, чтобы заставить форму перераспределить компоненты по приказу?.. И потом, разве такое поведение OnResize (вызов обработчика, когда дочерние компоненты ещё не заняли новые места) не является багом? Может, заявить его в багтрекере?..
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Re: Где обрабатывать изменение размера компонента?

Сообщение v-t-l » 21.10.2009 16:40:26

Flanter писал(а):Может, заявить его в багтрекере

думаю надо было бы.

Добавлено спустя 8 минут 38 секунд:
Причем проявляется только для невидимой формы.
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Где обрабатывать изменение размера компонента?

Сообщение Flanter » 21.10.2009 16:58:07

Да, это так. Но производить на форме манипуляции перед её показом - вещь довольно обычная, я уже в двух проектах с этим багом столкнулся :( Сейчас пробую сформулировать это всё на английском в багтрекере.

Добавлено спустя 8 минут 56 секунд:
Создал тикет, надеюсь, достаточно корректно описал ситуацию... на русском-то трудно сформулировать, чтобы не утонуть в деталях :oops:

http://bugs.freepascal.org/view.php?id=14864
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Re: Где обрабатывать изменение размера компонента?

Сообщение ViTality » 21.10.2009 22:25:35

может вы уже и сами догадались. но подскажу костыль(сам не проверял): предварительно переносить форму в минусовые координаты, там делать OnShow. ну а потом переносить ее на необходимое место.
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02


Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

Рейтинг@Mail.ru