[Delphi] Плывут формы при изменении темы

yolki

Я понимаю, что проблема известная. но мне не понятно, как её обходить.
Но имеется такой вот косяк. Нужно иметь форму, которую пользователь может ресайзить вширину, но не может в высоту.
1. Создаём форму, задаём Constraints.Min/MaxHeight = <нужная высота> . кладём кнопку в правый нижний угол, ставим анкоры низ/право.
2. компилируем, запускаем.
3. изменяем тему - конкретно я экспериментирую с CaptionSize - и смотрим результат. (я меняю с 18 на 48)
поведение разное -
1. если запустить приложение, скомпилированное под одни SystemMetrics в теме с другими SM.
2. если менять SM в процессе работы приложения
в первом случае ClientArea уменьшается на величину CaptionSize и кнопка съезжает за нижнюю границу формы.
во втором случае catpion отъедает кусок клиентской области (ClientArea) и накрывает собой компоненты, которые были на самом верху формы
что делать? Была идея перехватывать WM_SETTINGCHANGE/WM_THEMECHANGE и подправлять Constraints под новые SystemMetrics. однако событие в форму доставляется после того, как она отресайзена.

zorin29

Попробуй отказаться от Custom Anchor-ов, вместо них используй TPanel, которым ставится Align. Так чтобы у всех Control-ов Anchor-ы стояли одни и те же: Top, Left.
У нас тоже была проблема с ресайзами, правда, не из-за изменения Metrics, а из-за самодельного DockManager-а, который в каком-то странном порядке слал ресайзы.

yolki

там не в анкорах дело

Andbar

что делать? Была идея перехватывать WM_SETTINGCHANGE/WM_THEMECHANGE и подправлять Constraints под новые SystemMetrics. однако событие в форму доставляется после того, как она отресайзена.
Попробуй перехватывать сообщения изменения размера.
У форм есть события OnCanResize и OnConstrainedResize, подозреваю что какое-то из них должно помочь.

kill-still

А если BorderStyle сделать bsNone, то тоже самое происходит? (у меня виста, не могу проверить)

Serab

однако событие в форму доставляется после того, как она отресайзена.
Ну и что, ресайзи еще раз сам, будет едва заметное моргание. Разве нет?
Оставить комментарий
Имя или ник:
Комментарий: