Автоматизация учета

V8 Engine: формы и управление формами

Появление бета-версии V8 означает, что можно отложить в сторону любимые игрушки (видели Postal-2? чума, а не игрушка) и заняться изучением новой платформы уже по-серьёзному Первый вдумчивый взгляд, брошенный на дерево Синтаксис-Помощника (который и в бете остался всё таким же откровенно ущербным в использовании) вызывает лёгкую оторопь. Всё не так. Вдумчивое изучение кода той же ТиС вызывает оторопь уже тяжёлую.

Автор:WildHare

Источник: B-LOG

Появление бета-версии V8 означает, что можно отложить в сторону любимые игрушки (видели Postal-2? чума, а не игрушка) и заняться изучением новой платформы уже по-серьёзному
Первый вдумчивый взгляд, брошенный на дерево Синтаксис-Помощника (который и в бете остался всё таким же откровенно ущербным в использовании) вызывает лёгкую оторопь. Всё не так. Вдумчивое изучение кода той же ТиС вызывает оторопь уже тяжёлую.

Но ведь поговорку про "тяжело в учении" придумали умные люди, верно? ;-)

Начал я, естественно, не с "прикладных объектов" и даже не с "системных коллекций". Я начал с форм. При беглом осмотре СП мне попалась ветка "ЭлементыУправления" – сами понимаете, дальше я уже не ушёл. Это что же, у нас наконец-то появилось настоящее управление формой из кода? Проведенные эксперименты показали – таки да, появилось.

Сами по себе формы V8, даже без динамического управления – это уже вещь. И дело не в том, что программисту доступна куча "предустановленных" бантиков (прогресс-бары, календари, тулбары, бегущие строки и прочее). Вовсе нет. Главных фич две: панели и привязки.

Что есть панели? Это значит, что форму теперь можно делить на области, каждая из которых живёт своей жизнью. Каждая может содержать любое количество страниц (переключаемых закладками). И настраивается всё это хозяйство визуально. Никаких больше Закладки.ДобавитьЗначение… Ёмкость форм увеличилась несказанно, формы стали если и не совсем резиновыми, то очень близкими к этому состоянию.

А что есть привязки? Это управление масштабированием элементов формы. Поведение элементов формы при изменении размеров окна теперь полностью под нашим контролем: этот остаётся слева внизу, этот прижимается к верхней границе и растягивается по горизонтали на сколько хватит места. Ну и так далее. Правда, управление привязками сделано через задний проход: привязки настраиваются отдельно для каждого элемента (группы элементов), и происходит это в модальном окне.

Такое впечатление, что разработчики V8 в глаза не видели дизайнера форм из VisualStudio 7 (а уже доступна версия 7.1). Также из рук вон плохо сделана отработка ошибок, возникающих в процессе настройки привязок. Если вы задаёте некорректную привязку (скажем, привязываете левую границу контрола к правому соседу, а правую – к левому), то вы получаете сообщение из трёх букв. Никакой информации в сообщении не содержится, и искать неправильную привязку вам придётся самостоятельно. Более того, модальное окно откажется закрываться – придётся отключить все привязки, закрыть модальное окно, а потом уже думать, что же вы сделали не так.

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

Но человек привыкает ко всему. Начав с полного нуля я за каких-то два часа изваял вот такую форму:

Справедливости ради стоит отметить, что на V7 за те же два часа можно изваять не только форму, но и написать весь код для неё.. Но та же справедливость требует отметить – это была моя первая форма на V8.

Естественно, при изменении размеров окна моя форма ведёт себя, как положено: рамки растягиваются, некоторые контролы (ползунки) тоже, некоторые контролы остаются при прежних размерах, но занимают позиции в нужных углах формы, ну и всё такое прочее.

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

Примеры кода я тут приводить не буду – в качестве примера см. внешнюю обработку, ссылка внизу.

Зачем это может быть нужно? Ну, скажем, если мы рисуем сложную форму, работающую по принципу wizard'а, и у нас много ветвлений и много разных вариантов – можно не рисовать контролы заранее, а создавать их прямо из кода. Любые сложные универсальные формы, состав контролов которых зависит от контекста вызова формы – это потенциальная область применения.

Да и в любом случае – лучше, когда динамическое управление формами заложено в платформу, чем когда его нет в принципе.

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

Начать дискуссию