12 сентября 2022

Проблема с цветом контролов в дизайнере VCL-форм Delphi 11.2

    При одном из первых запусков Delphi 11.2 Alexandria меня ждал неприятный сюрприз – изменение цвета контрола не работает в design-time. Например, бросаем на форму memo, меняем его свойство Color с clWindow на clRed и никого эффекта – цвет memo не изменился. Запускаем проект и видим memo красного цвета. Значит в run-time подобной проблемы нет.
Memo в design-time и run-time
Memo в design-time и run-time

И это оказывается не баг! Причина такого поведения дизайнера форм – постоянное желание разработчиков RAD Studio улучить поддержку High DPI.

    Когда дизайнер VCL-форм запускался в режиме высокого разрешения с использованием масштаба не равного 100% некоторые основанные на Windows API контролы отрисовывались неправильно. Наиболее заметные были проблемы у TRadioButton и TCheckBox. Чтобы решить проблему, дизайнер VCL-форм для рисования контролов теперь использует Windows-подобный стиль, который имитирует светлую или темную тему Windows (в зависимости от того, какая из них используется операционной системой в данный момент).

    Это означает, что дизайнер VCL-форм Delphi 11.2 по умолчанию использует VCL-стили. Поддержка отображения контролов в дизайнере форм с учетом стилей была добавлена еще в версии 11.0, но по умолчанию она была отключена. Это было сделано для того, чтобы дать разработчикам библиотек время убедиться, что их контролы правильно отображаются в design-time с учетом стилей. Теперь, чтобы решить эту проблему с контролами в High DPI, разработчики Delphi были вынуждены включить использование VCL-стилей по умолчанию.

    Как заставить дизайнер VCL-форм Delphi 11.2 отображать цвет контрола? Для этого можно отключить использование стилей в дизайнере форм. Открываем параметры Delphi и убираем флажок "Enable VCL Styles".

Delphi 11.2 - Tools > Options > User interface > Form designer > Enable VCL Styles
Tools > Options > User interface > Form designer > Enable VCL Styles

Если этот параметр включен, то VCL-контролы в design-time соответствуют их внешнему виду в run-time, так как рисуются с использованием установленного для формы или контрола VCL-стиля. Можно не отключать использование VCL-стилей совсем, а выключить только имитацию системного стиля (новый параметр "Mimic the system style").
Memo в дизайнере VCL-форм после отключения использования VCL-стилей
Memo в дизайнере VCL-форм после отключения использования VCL-стилей

    Подобного эффекта можно добиться и без отключения использования VCL-стилей в дизайнере форм. Достаточно для формы или контрола установить стиль "Windows". Например, наше memo окрасится в красный цвет, как только мы свойству StyleName формы присвоим "Windows".

Memo в дизайнере VCL-форм с StyleName=Windows
Memo в дизайнере VCL-форм с включенным стилем "Windows"

Комментариев нет:

Отправить комментарий