3.4.7. Неправильное поведение свойства Anchors
3.4.7. Неправильное поведение свойства Anchors
Свойство Anchors, появившееся в Delphi 5, является очень удобным средством управления положением и размерами визуальных компонентов при изменении размера родителя. Однако в тех случаях, когда начальные размеры формы по каким-то причинам не совпадают с установленными при проектировании, задание значения свойства Anchors не приносит желаемого эффекта: первоначальное расположение визуальных компонентов на форме соответствует размерам, установленным при проектировании, а не тем, которые реально получила форма. Примеры такого некорректного поведения демонстрирует программа WrongAnchors на компакт-диске.
Программа WrongAnchors — это MDI-приложение, в котором открываются две дочерние формы разных классов: ChildForm1 (класс TChildForm1) и ChildForm2 (класс TChildForm2). Во время проектирования эти две формы выглядят совершенно одинаково, но при запуске программы только вторая форма сохраняет заданные при проектировании размеры, а первая становится больше. При этом панель, лежащая на ней, не адаптирует свои размеры к изменившемуся размеру формы, хотя свойство Anchors обязывает ее к этому (это легко видеть, изменяя размеры формы после ее создания). Самый простой способ борьбы с этой неприятностью — заставить дочернюю MDI-форму иметь такой же начальный размер, какой задан при проектировании.
Дочерняя MDI-форма приобретает отличный от заданного размер потому, что метод CreateParams для ширины и высоты окна устанавливает не те значения, которые хранятся в свойствах Width и Height, а значение CW_USERDEFAULT. Это значение говорит системе, что она должна выбрать размеры окна на свое усмотрение. Чтобы этого не происходило, нужно вновь вернуть установленные при проектировании значения ширины и высоты в перекрытом методе CreateParams. Именно этим класс TChildForm2 отличается от TChildForm1 (листинг 3.59).
Листинг 3.59. Установка значений ширины и высоты, заданных при проектировании
procedure TChildForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Width:= Width;
Params.Height: = Height;
end;
Значение CW_USERDEFAULT присваивается ширине и высоте окна не только в том случае, если это дочерняя MDI-форма, но и когда значение свойства Position формы равно poDefault или poDefaultSizeOnly. Но в этом случае перекрывать CreateParams нет нужды, достаточно просто изменить значение свойства Position на другое. Просто необходимо помнить, что если свойство Position формы имеет одно из этих значений, свойства Anchors лежащих на форме компонентов должны иметь значения по умолчанию.
Другой случай, когда окно может при создании иметь размеры, отличные от заданных при проектировании, — это когда свойство WindowState равно wsMaximized. При этом окно растягивается на весь экран. В примере WrongAnchors в главном меню есть пункты Развернутое окно 1 и Развернутое окно 2, которые открывают диалоговые окна, развернутые на весь экран. Но в первом из этих окон панель опять не адаптируется к новым размеру окна, в то время как во втором — адаптируется, хотя значения свойства Anchors у обеих панелей одинаковые. Это происходит потому, что в первом случае значение wsMaximized присваивается свойству WindowState во время проектирования, и поэтому окно сразу создается развернутым. А во втором случае значение wsMaximized присваивается свойству WindowState только при обработке события OnShow формы, т. е. тогда, когда форма уже создана с заданными при проектировании размерами, но еще не видна на экране. При этом свойство Anchors работает так, как требуется. Это и есть решение проблемы — значение свойству WindowState нужно присваивать не во время проектирования, а в обработчике события OnShow.
Но самое интересное происходит, если свойство WindowState во время проектирования получило значение wsMaximized, а свойство Position — значение poDefault или poDefaultSizeOnly. Тогда размеры и положения визуальных компонентов на форме будут адаптированы к размеру, который не совпадает ни с размером развернутой формы, ни с размером, заданным во время проектирования. Если такой форме отменить развертывание на весь экран, то визуальные компоненты получат размеры и положения, установленные в режиме проектирования.
Нельзя сказать, что разработчики Delphi не знакомы с этой проблемой, они даже что-то делают, чтобы ее решить. Начиная с BDS 2006 можно устанавливать значение свойства WindowState в режиме проектирования, и визуальные компоненты на такой форме будут вести себя интуитивно ожидаемым образом, т. е. адаптироваться к размеру формы, растянутой на весь экран. Правда, с двумя существенными оговорками. Во-первых, свойство Position формы не должно быть равно poDefault или poDefaultSizeOnly. Во-вторых, это относится только к главной форме приложения, для всех остальных форм проблема сохраняется. Поэтому пример WrongAnchors будет работать одинаково и в новых версиях Delphi, и в старых — там на весь экран разворачиваются не главные формы.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Пакет Общее поведение
Пакет Общее поведение Пакет Общее поведение является наиболее фундаментальным из всех подпакетов и определяет базовые понятия ядра, необходимые для всех элементов поведения. В этом пакете специфицирована семантика для динамических элементов, которые включены в другие
(4.9) Как восстановить систему, если поставлено неправильное ядро?
(4.9) Как восстановить систему, если поставлено неправильное ядро? Так как система не загружается, придётся загрузиться либо с другой ОС, либо в recovery console от W2k. После этого останется извлечь нужное ядро из WindowsDriver Cachei386driver.cab, скопировать его с Windowssystem32, и переименовать его в
4.7. Поведение по-умолчанию
4.7. Поведение по-умолчанию В некоторых случаях механизм определения состояния не может распознать протокол обмена и, соответственно, не может выбрать стратегию обработки этого соединения. В этом случае он переходит к заданному по-умолчанию поведению. Поведение
3.2.6. "Неправильное" значение
3.2.6. "Неправильное" значение Самый первый "подводный камень", на котором спотыкаются новички — это то, что вещественная переменная может получить не совсем то значение, которое ей присвоено. Рассмотрим это на простом примере (листинг 3.9, примеp WrongValue на
1.4. Поведение округления
1.4. Поведение округления Этот раздел обсуждает точность математического округления для функции ROUND() и для вставок в столбцы с типами с точным значением.Функция ROUND() работает по-разному в зависимости от того, является ли параметр точным или приблизительным числом:Для
Поведение типов с фиксированной точкой в операциях
Поведение типов с фиксированной точкой в операциях ДелениеПри выполнении деления типов с фиксированной точкой диалекты 1 и 3 ведут себя по-разному.В диалекте 3, когда оба операнда являются типами с фиксированной точкой, Firebird суммирует масштабы обоих операндов для
Субкультурное поведение
Субкультурное поведение Существует понятие культурно-речевого статуса, то есть принадлежности индивида к конкретному типу языковой культуры. Выделяют следующие формы языков: литературный, разговорный, просторечие, территориальные диалекты, социальные диалекты (язык
S.LOG: Неправильное цветоделение — 3. Продано
S.LOG: Неправильное цветоделение — 3. Продано Автор: Серж СкаутДля тех, кто /в зоне неуверенного приема/(зачеркнуто) не в курсе происходящего в этой рубрике в последние пару недель, на всякий случай сообщу: мы продолжаем /КВН/(зачеркнуто) обсуждать неправильное цветоделение
S.LOG: Неправильное цветоделение 2: Если бумага, на которой вы печатаете, темнее изображения — плесните белил
S.LOG: Неправильное цветоделение 2: Если бумага, на которой вы печатаете, темнее изображения — плесните белил Автор: Серж СкаутВ прошлый раз мы обсуждали, как решить проблему цветоделения, если нужно отпечатать картинку на цветной бумаге пастельных тонов, да так, чтобы и
СЕЛО ЩЕПЕТНЕВКА: Поведение собаки
СЕЛО ЩЕПЕТНЕВКА: Поведение собаки В следующем воплощении я стану полярником тридцатых годов. Может быть, даже папанинцем. Или седовцем: подобно им, я больше всего на свете люблю получать письма. Работая на льдине, на дрейфующем пароходе или в кабинете с окном, зашторенным
Ошибка 0x000000C2: неправильное выделение памяти
Ошибка 0x000000C2: неправильное выделение памяти Некорректное выделение памяти. Причина – некорректно работающий