::Главная страница :: Visual Basic :: Статьи

Реализация командного переключателя в Visual Basic

По роду деятельности мне постоянно приходится заниматся реализацией пользовательского интерфейса. Надо сказать, что все Windows приложения строятся обычно по одному шаблону - главное окно, меню, панель инструментов (toolbar), контекстное меню. Такой подход к построению интерфейса подробно описан и даже стандартизирован.

Для удобства работы делают так, что каждая из команд может быть вызвана из нескольких мест: основное меню, контекстное меню и т.д. В зависимости от текущего состояния команда может быть разрешена/запрещена (enabled/disabled), отмечена (checked) или даже может считаться командой по умолчанию (default).

Как реализовать такой подход в приложении на Visual Basic? Проблема здесь не только в том что одна и та же команда вызывается из нескольких мест. Для каждой команды нужно еще и отслеживать ее состояние. Здесь излагается подход к решению этой проблемы. Такую схему я с успехом использую во многих своих приложениях.

Итак, источники команд - это Menu Bar, Toolbar(s), Context Menu и другие controls. Введем понятие идентификатор команды (Command ID).

Идентификатор команды - это строка, содержащая только символы a-z, A-Z (регистр важен). В сущности, можно было бы использовать и числовые константы, но строка удобнее для хранения ее в свойствах Tag различных элементов управления. В сложной команде идентификатор и параметр разделяются двоеточием: "CommandID:Parameter". Примером сложной команды может служить команда сортировки - "SortBy:Name".

Команды можно группировать в множества команд, которые легко описать строкой команд, перечисленных через запятую: "Cmd1,Cmd2,Cmd3". Такая строка легко разделяется на отдельные команды функцией Split.

Обработчики Click пунктов меню, кнопок панели инструментов и т.п. - все содержат только вызов процедуры DoCommand с параметром - ID команды. Тем самым, вся обработка команд сведена в одно место.

Процедура DoCommand вызывает по команде соответствующее ей действие:
Private Sub DoCommand(ByVal sID as String)
Select Case sID
Case "Exit": Unload Me
Case "About": FormAbout.Show
Case "HelpContents": DoShowHelpContents
End Select
End Sub

Для определения свойств команды в соответствием с текущим состоянием заводим пару булевых функций:

IsCommandEnabled(sID) As Boolean Определение разрешенности команды IsCommandChecked(sID) As Boolean Определение checked команды

Еще нужна процедура для обновления свойств контролов в соответствии с текущим состоянием приложения:

Private Sub UpdateEnable() В ней свойства Enabled и Checked выставляются по результату IsCommandEnabled и IsCommandChecked. UpdateEnable должна вызываться в начале работы программы и в процедурах-действиях - при изменении текущего состояния программы.

Все изменения состояния программы полезно также свести в несколько процедур с названием SetXxx (например, SetSortOrder(sFieldName)). В конце каждой из этих процедур вызывается UpdateEnable, приводя в соответствие состояние программы и состояние контролов команд.

 Тем самым, команда теперь выполняется так:
человек вызывает команду (например, File|Exit)
вызывается событие (например, mnuFileExit_Click)
вызывается DoCommand
вызывается процедура действия, производится действие
вызывается процедура изменения состояния SetXxx
вызывается UpdateEnable, обновляется вид контролов.
Тематические ссылки
Ваша ссылка Ваша ссылка

Обмен кнопками, ведение статистики, реклама.