|
::Главная страница :: 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, обновляется вид контролов.
Тематические
ссылки
|
Ваша ссылка | Ваша ссылка |
Обмен кнопками, ведение статистики, реклама. |
|||