Форма вместо раскрывающегося списка

В этой заметке я хочу продемонстрировать два новых для меня подхода в области построения пользовательского интерфейса. Точнее, они относятся к проблеме улучшения стандартного раскрывающегося списка (Combo Box). Пример для Access'97 находится здесь.

Сначала рассмотрим реализацию замены раскрывающегося списка на форму. Она представляет собой попытку использовать для этой цели комбинацию поля ввода, кнопки и формы. Форма открывается при нажатии на кнопку непосредственно под полем, имитируя таким образом поведение раскрывающегося списка.

Не вдаваясь в подробности, замечу, что удовлетворительный результат (нужное место открытия, тонкая граница, отсутствие заголовка окна и т.п.) можно получить только путем использования большого числа функций Windows API. Я не большой специалист в этой области, поэтому сделал всё наверняка не самым оптимальным образом, и, кроме того, пока не стал оформлять всё как отдельную функцию или какой-либо другой структурный элемент программы. Возможно я сделаю это позднее.

Другой новый подход относится к реализации передачи параметров между формой и программой, которая её контролирует. Сначала создаётся новый экземпляр формы как объектная переменная:

 Dim frmChoose As New Form_choose_color

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

Private lngValue As Long

Public Property Get ChoosedValue() As Variant ChoosedValue = lngValue End Property

Public Property Let ChoosedValue(ByVal vNewValue As Variant) If lngValue <> vNewValue Then Me.RecordsetClone.FindFirst "c_id = " & vNewValue Me.Bookmark = Me.RecordsetClone.Bookmark lngValue = Me.ed_c_id End If End Property

Таких свойств может быть несколько, в зависимости от потребностей программы. В данном случае присвоение значения свойству устанавливает текущую запись в форме:

 frmChoose.ChoosedValue = Nz(Me!i_color_id, 0)
 frmChoose.Visible = True

После чего форма делается видимой. Так как форма открывается не командой

DoCmd.OpenForm "choose_color", , , , , acDialog

то управление в конце концов передаётся следующей строке программы. Это вынуждает выполнять в цикле простейшую проверку состояния формы:

 While frmChoose.Visible = True
 DoEvents
 Wend

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

 Me!i_color_id = frmChoose.ChoosedValue
 Set frmChoose = Nothing

 


Страница сайта http://www.silicontaiga.ru
Оригинал находится по адресу http://www.silicontaiga.ru/home.asp?artId=6444