Появилась у меня очередная программка в жанре "складской учет".
Дошло дело до форм и тут опять обычная история.
Связанные контролы я почему-то не люблю (сам не знаю, почему, но вот стараюсь не использовать). А значит, надо писать код, который будет заполнять элементы управления значениями при открытии формы, выгружать эти значения в источник данных при закрытии формы, а также попутно обслуживать эти элементы управления таким сервисом, как выделение текстовых полей при получении фокуса, автопоиск (и автоподстановка) для ComboBox-ов и т.п.
Форм таким много, все они разные и использовать кучу однообразного кода утомляет.
И вот решил я сделать такую штуку (правда заранее скажу, что идея не моя).
Итак, пишу данный код в инициализацию формы (Form_Load или где еще):
- Код: Выделить всё
Dim objFormControls As FormControls
Set objFormControls = New FormControls
objFormControls.Add "Name", txtName, lblName, fctString
objFormControls.Add "Type", cmbType, lblType, fctReference
objFormControls.Add "Changed", dtpChanged, lblChanged, fctDateTime
...
objFormControls.Add "Notes", txtNotes, lblNotes, fctString
...
With objFormControls("Type")
Set .RefDataSource = rsTypes
.RefFieldID = "ID"
.RefFieldValue = "Title"
End With
...
objFormControls("Changed").Locked = True
...
Set objFormControls.DataSource = rsData
...
objFormControls.Refresh
В этом случае загрузка/выгрузка данных становится тривиальной операцией. Либо rsData будет открытым и спозиционированным рекордсетом (и тогда при сохранении данных достаточно сделать rsData.Update), либо rsData будет рекордсетом отвязанным и тогда надо будет его снова присоединить и выполнить пакетное обновление. Либо просто вручную перенести данные из отвязанного рекордсета в БД.
FormControls представляет собой класс-коллекцию из FormControlItem, а так же ряд дополнительных методов, свойств и событий.
FormControlItem представляет собой отдельное поле, связанное с элементом управления. Данное поле при необходимости может использоваться автономно от основной коллекции.
Вообщем, должна хорошая штука получиться.
Вот, к примеру, список событий у FormControls:
- Код: Выделить всё
Public Event Click(Field As FormControlField)
Public Event DblClick(Field As FormControlField)
Public Event DropDown(Field As FormControlField)
Public Event CloseUp(Field As FormControlField)
Public Event Scroll(Field As FormControlField)
Public Event ItemCheck(Field As FormControlField, ByVal Index As Long)
Public Event ItemSelect(Field As FormControlField, ByVal Index As Long)
Public Event Change(Field As FormControlField)
Public Event KeyDown(Field As FormControlField, ByRef KeyCode As Integer, ByRef Shift As Integer)
Public Event KeyPress(Field As FormControlField, ByRef KeyAscii As Integer)
Public Event KeyUp(Field As FormControlField, ByRef KeyCode As Integer, ByRef Shift As Integer)
Public Event GotFocus(Field As FormControlField)
Public Event LostFocus(Field As FormControlField)
Public Event CustomData(Field As FormControlField, ByVal Value, ByRef Result As Variant)
Public Event Validate(Field As FormControlField, ByRef Cancel As Boolean)