В процессе разработки интерфейсов на платформе 1С 7.7 часто возникает потребность зафиксировать размер формы, чтобы пользователь не мог его изменить. В отличие от модальных форм, где эта настройка доступна в свойствах, обычные формы лишены такой штатной опции. Мы разберем, как реализовать подобное поведение с помощью внешней компоненты FormEx.
Основная сложность заключается в том, что системное событие ПриИзмененииРазмераОкна срабатывает на ранних этапах инициализации формы. Если мы попытаемся принудительно задать ширину и высоту окна сразу при открытии, это может привести к мерцанию, некорректному позиционированию элементов или к тому, что система попросту проигнорирует наши команды. Важно также понимать, что попытка задать размеры жестко «в лоб» часто конфликтует с оконным менеджером Windows.
Для того чтобы добиться стабильного результата, воспользуемся компонентой РасширениеФормы из состава FormEx. Рассмотрим порядок действий, который позволит нам зафиксировать геометрию окна.
РасширениеФормы в процедуре ПослеСозданияФормы. Именно это событие является оптимальным, так как оно срабатывает, когда структура формы уже сформирована, но окно еще не успело «скакнуть» в непредвиденные размеры.ПослеСозданияФормы мы сохраняем начальные значения ширины, высоты и позиции формы в переменные модуля.ПриИзмененииРазмераОкна мы будем сравнивать текущие параметры окна с нашими эталонными значениями и возвращать их обратно в случае отклонения.Давайте посмотрим на готовый шаблон кода, который можно использовать в модуле формы. Этот подход исключает нежелательные изменения размеров и предотвращает конфликты с системой.
Перем гРФорма, СтараяШирина, СтараяВысота, Верх;
// Вызывается платформой при создании формы
Процедура ПослеСозданияФормы()
гРФорма = СоздатьОбъект("РасширениеФормы");
гРФорма.УстановитьФорму(Форма);
// Принудительно отключаем максимизацию
гРФорма.Максимизирована = 0;
// Запоминаем текущие (штатные) размеры
СтараяШирина = гРФорма.Ширина;
СтараяВысота = гРФорма.Высота;
Верх = гРФорма.Верх;
КонецПроцедуры
// Событие FormEx, срабатывающее при попытке пользователя изменить размер окна
Процедура ПриИзмененииРазмераОкна(ТипСобытия, Ширина, Высота)
Если ПустоеЗначение(гРФорма) = 1 Тогда
Возврат;
КонецЕсли;
// Если размеры изменились, возвращаем их к эталонным
Если (Ширина <> СтараяШирина) или (Высота <> СтараяВысота) Тогда
гРФорма.Ширина = СтараяШирина;
гРФорма.Высота = СтараяВысота;
гРФорма.Верх = Верх;
гРФорма.Максимизирована = 0;
КонецЕсли;
КонецПроцедуры
Рассмотрим несколько нюансов, которые помогут сделать интерфейс более профессиональным:
Максимизирована = 0 обязательна, чтобы ОС не пыталась растянуть окно на весь экран при попытке перетаскивания или изменении системных настроек отображения.ПослеСозданияФормы вместо ПослеОткрытия. В ряде случаев, если инициализация происходит слишком поздно, окно может успеть отрисоваться с неверными габаритами, что вызовет неприятный визуальный эффект «скачка» размеров.Таким образом, использование предложенного кода позволяет добиться «эффекта модальности» без принудительной остановки выполнения программы. Форма остается интерактивной, но сохраняет свои исходные пропорции независимо от действий пользователя.