FAQ по Visual Basic

Содержание / Примеры программ Поиск | Далее

§ 7.1. Как правильно реализовать стиль Wizard?

Q: Как правильно реализовать стиль визарда? Это где кнопочки Далее и Назад? Я делаю несколько окон по числу шагов, но постоянно лезут глюки. Например, при перетаскивании верхнего окна, под ним оказываются другие…

Вообще, гораздо безгеморройнее реализовать визарда на контролах, являющихся контейнерами. Например, фрейм или пикчебокс. Правда, использовать пикчебокс не советую, ибо он будет ловить фокусы, портя интерфейс. А у фрейма надо бордюр воткнуть в None, дабы он не мешался. Во время дизайна, растяните окно и разместите фреймы так, чтобы они все были видны. Когда интерфейс будет доделан, разместите фреймы один над другим.

Теперь о коде. В нем нет ничего сложного. Но после N-ного визарда, я плюнул и решил написать классик, дабы по многу раз не набивать один и тот же набивший оскомину код. Этот классик и небольшой примерчик предлагаю вам. Проект лежит в архиве WizardStyle, и там же находится класс Frames.cls.

Использование класса видно на примере и по небольшому описанию в самом классе. Я лишь хочу акцентировать ваше внимание на ряде тонкостей.

Используйте только массив контролов (фреймов, пикчебоксов или других контейнеров). Работать не с массивом (Frame1, Frame2, Frame3…) класс не может и, вообще-то, не должен.

Метод HideFrames был введен сознательно. Дело в том, что во время дизайна вы можете оставить самым верхним любой фрейм, а не только с индексом 0. Так как свойство Frame устанавливается в 0 после визуализации формы, то возможно некоторое мелькание фреймов. HideFrames позволяет избежать этого.

Ивенты. Зачем нужны аж 3 ивента, спросите вы? Опять же это потребность выкристаллизовалась на практике.

Ивент BeforeLoad удобно использовать для проверки валидности введенных данных, и запрещения изменений фрейма, если данные некорректны. Кроме того этот ивент как нельзя кстати подходит для инициализации контролов и т.п., перед тем как страница содержащая эти контролы будет визуализирована.

Ивент AfterLoad в основном нужен для длительных операций. Например, вы создали визарда для проверки валидности вашей базы данных. Если проверку проводить в ивенте BeforeLoad, то пользователь столкнется с тем, что после нажатия на кнопку Далее программа «замерзла» или «зависла». Наличие ивента AfterLoad позволяет избежать этого. Вы можете на странице разместить прогрессбар и в ивенте AfterLoad его менять синхронно с проверкой базы данных.

И, наконец, ивент OverLoad. Когда вы нажимаете кнопку Назад или Далее и свойство Frame устнавливает несуществующую страницу, то возникает этот ивент, который позволяет нормально завершить программу, или «закольцевать» ее, как, например, это сделано в WinZip, когда с последней страницы, посредством кнопки Повторить, вы переходите на первую страницу визарда.

Автор:
Александр Щербаков

Предыдущий раздел Следующий раздел

© 2004. При цитировании, пожалуйста, не забудьте поставить ссылку на оригинальную страницу.