Ответ 1. Я бы сказал так, что элементы FlexGrid и DataGrid практически не применяю (справедливо для Access, а не VB). Напротив элемент TreeView имеет повышенное внимание у заказчиков. Примерно 9 из 10 хотят его куда-нибудь добавить. Например, были разговоры по применению у юридической компании (для учета договоров в формате word и excel), у производственной фирмы (для учета электронных компонентов) и в торговых компаниях. Так что советую его серьезно изучить. Надо отметить, что элемент TreeView, с моей точки зрения, достаточно капризный и имеет много "проблем" в разных операционных системах. Например, если при открытии формы в событии Open (не Load) Вы поставите загрузку узлов дерева, то получите только "каркас" (дерево без текста). Справедливо - для Windows 2000, но не Windows 98. Исправить ошибку бывает очень сложно, даже прямой ввод текста не помогает. Бывает при редактировании класса разрушается вся база данных. Есть и другие ошибки, которые предлагается исправить через api-интерфейс. Подробности смотрите в библиотеке разработчика MSDN. В файле la_activex.mdb есть пример 5 по применению TreeView. Он основан на создании нового класса MicrosoftTree и имеет большую надежность, чем создание дерева без класса. Все события дерева отображаются в форме. Для операций Drag & Drop также показано добавление узла красным цветом. Пример дан в сокращенном варианте. Коммерческая версия имеет больше возможностей. Она позволяет привязать TreeView к любой таблице, сохранить дерево после редактирования, удаления и сортировки узлов, отобразить всплывающее меню и иконки, позволяет в операциях drag & drop изменять drag-иконку и работать с подчиненными узлами. А теперь изучите класс для работы с TreeView ' Объявляем класс Tree с событиями Public WithEvents Tree As TreeView ' Объявляем собственное событие для сообщений в главной форме Public Event progress(strMsg As String) ' Переменные для сохранения узлов в операции DragDrop Private Type DropDrag idxStart As Long ' Начальный узел перемещения idxEnd As Long ' Конечный узел перемещения End Type 'События при создании/уничтожении класса. Можете добавить в них свои функции при создании или уничтожении дерева Private Sub Class_Initialize() Private Sub Class_Terminate() ' События до и после редактирования текста узла Private Sub Tree_BeforeLabelEdit(Cancel As Integer) ' Перед редактированием Private Sub Tree_AfterLabelEdit(Cancel As Integer, NewString As String) ' После редактирования ' События мышки при работе с узлами дерева Private Sub Tree_NodeClick(ByVal node As node) ' Выбор узла Private Sub Tree_NodeCheck(ByVal node As node) ' Установка флажка Private Sub Tree_Expand(ByVal node As node) ' Расширение узла Private Sub Tree_Collapse(ByVal node As node) ' Сворачивание узла ' События при управлении левой кнопкой мыши Private Sub Tree_Click() ' Одно нажатие Private Sub Tree_DblClick() ' Двойное нажатие ' События клавиатуры Private Sub Tree_KeyUp(KeyCode As Integer, ByVal Shift As Integer) Private Sub Tree_KeyDown(KeyCode As Integer, ByVal Shift As Integer) Private Sub Tree_KeyPress(KeyAscii As Integer) ' События типа DragDrop. Возможны только при настройках TreeView: OLEDragMode = ccOLEDragAutomatic и OLEDropMode = ccOLEDropManual ' Событие мышки, а также OLEStartDrag используем для определения выбранного узла для перемещения. Public Sub MouseDown(Button As Integer, Shift As Integer, x As Long, y As Long) ' 1 dragdrop. Начало перемещения. Используется для настройки режимов перемещения или копирования. Private Sub Tree_OLEStartDrag(Data As DataObject, AllowedEffects As Long) ' 2 dragdrop. Изменение координат мыши x и y. Используется для изменения режимов dragdrop. Для работы с узлами используем DropHighlight и HitTest(X, y) Private Sub Tree_OLEDragOver(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer) ' 3 dragdrop. Событие срабатывает после OLEDragOver. Используем для определения режима перемещения Private Sub Tree_OLEGiveFeedback(Effect As Long, DefaultCursors As Boolean) ... ' 4 dragdrop. Последние событие до завершения перемещения. Используем для определения конечного узла перемещения Private Sub Tree_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single) ' 5 dragdrop. Конец перемещения. Используем для управления узлами (перемещением, удалением, копированием) выбранными до и после перемещения Private Sub Tree_OLECompleteDrag(Effect As Long) ' Функция сообщающая о получении событий Private Function funPrintProgress(myMsg As String) RaiseEvent progress(myMsg) ' Генерируем событие для узла End Function ' Главная функция загрузки узлов из таблицы Public Function Load(strSQL As String) As Boolean Dim myУзел As String, myКлюч As String, idx As Long Dim rst As ADODB.Recordset On Error GoTo 999 ' Загрузка дерева Set rst = New ADODB.Recordset rst.Open strSQL, Application.CurrentProject.Connection Me.Tree.Nodes.Clear Do Until rst.EOF ' Создание узла и его ключей myУзел = "la_" & rst!Relative myКлюч = "la_" & rst!Key If Not IsNull(rst!Relative) Then idx = Me.Tree.Nodes.Add(myУзел, tvwChild, myКлюч).Index Else idx = Me.Tree.Nodes.Add(, , myКлюч).Index End If ' Изменение нового узла With Me.Tree.Nodes(idx) .Text = Nz(rst!Text) .Selected = True End With rst.MoveNext Loop ' Настраиваем класс With Me.Tree ' Разрешаем операцию DragDrop .OLEDragMode = ccOLEDragAutomatic .OLEDropMode = ccOLEDropManual ' Стили дерева .Style = tvwTreelinesPlusMinusText .LineStyle = tvwRootLines ' Использование корневого узла .Indentation = 300 ' Длина штриха узла .Checkboxes = True ' Показываем флажки End With Load = True 998: rst.Close Set rst = Nothing Err.Clear Exit Function 999: Load = False MsgBox Err.Description On Error Resume Next Resume 998 End Function Ответ 2. Элемент TreeView входит в поставку Windows (98-2000) или Office (97-2000), но точно не проверял. Если у Вас установлены эти программы (по умолчанию), то проблем с ним быть не должно. |