Форма вместо раскрывающегося списка
В этой заметке я хочу продемонстрировать два новых для меня подхода в области построения пользовательского интерфейса. Точнее, они относятся к проблеме улучшения стандартного раскрывающегося списка (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
|