powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Функция с обратным вызовом
9 сообщений из 9, страница 1 из 1
Функция с обратным вызовом
    #32878145
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу сообразить, как сделать комбобокс из нескольких столбцов с заполнением его через функцию с обратным вызовом. Один столбец- все получается, с двумя и более - многомерный массив не прокатывает. И почему-то не могу сбросить в массив данные через GetRows. Каких-то элементарных вещей я не догоняю, но тут на форуме обсуждений этого предмета не нашла. Не подскажете ли, может, есть FAQ соответствующий?
...
Рейтинг: 0 / 0
Функция с обратным вызовом
    #32878256
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы в Case acLBGetValue получаете значение для каждого столбца?
...
Case acLBGetValue
Select Case col
Case 0
val =
Case 1
val =
Case 2
val =
End Select
...
...
Рейтинг: 0 / 0
Функция с обратным вызовом
    #32881154
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет.
Там как с Гетца содрано,
Код: plaintext
1.
2.
Case acLBGetValue
      'Возвращаем данные для указанной строки
      varRetval = sastrNames(lngRow)
И выдает ошибку "Subscpipt out of range".
...
Рейтинг: 0 / 0
Функция с обратным вызовом
    #32881158
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
varRetval = sastrNames(lngRow, lngCol)
Делов-то.
Спасибо!
...
Рейтинг: 0 / 0
Функция с обратным вызовом
    #32881159
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему GetRows не работает, посему такой массив нельзя присвоить?
...
Рейтинг: 0 / 0
Функция с обратным вызовом
    #32881187
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА почему GetRows не работает, посему такой массив нельзя присвоить?
А как вы это делаете?
Покажите код.
На всякий случай, немного из Help

автор...
Метод GetRows используется для копирования записей из объекта Recordset в двумерный массив. Первый индекс массива определяет поле, а второй номер строки, как в следующей примере, где intField представляет поле, а intRecord задает номер строки:

avarRecords(intField, intRecord)

Для того чтобы возвратить значение первого поля во второй записи, следует использовать такие значения индексов:

field1 = avarRecords(0,1)

Значение второго поля в первой записи возвращается с помощью следующей инструкции:

field2 = avarRecords(1,0)

При возвращении данных методом GetRows переменная avarRecords автоматически превращается в двумерный массив. ...
...
Рейтинг: 0 / 0
Функция с обратным вызовом
    #32882549
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
Option Compare Database
Option Explicit

Function FillList(ctl As Control, VarID As Variant, lngRow As Long, lngCol As Long, intCode As Integer) As Variant
  Dim varRetval As Variant
  Dim intRows As Integer
  Dim intCols As Integer
  Static aData() As Variant
  
  Select Case intCode
    Case acLBInitialize
      'Код инициализации определяет число строк и колонок
      'необходимых для хранения списка, и переопределяет массив aData.
      ReDim aData(intRows, intCols)
      'Здесь должен находиться код, заполняющий этот массив
      varRetval = True
    Case acLBOpen
      'Возвращаем уникальный идентификатор. Для этого
      'используем встроенную функцию Timer
      varRetval = True
    Case acLBGetRowCount
      'Возвращаем число строк
      varRetval = intRows
    Case acLBGetColumnCount
      'Возвращаем число колонок
      varRetval = intCols
    Case acLBGetColumnWidth
      'Возвращаем значение ширины колонок. Если вернуть
      'значение, равное -1, Access установит для
      'данной колонки ширину по умолчанию.
      'Следовательно, это значение можно залдать в окне свойств.
      Select Case lngCol
        Case  0 
          'Задаем ширину первой колонки
          varRetval =  1440 
        Case  1 
          'Задаем ширину второй колонки и т.д.
          varRetval = - 1 
          'varRetval = 1440
        Case Else
          varRetval = - 1 
          'varRetval = 1440
      End Select
    Case acLBGetValue
      'Возвращаем значение элемента списка.
      'Здесь возвращается элемент массива
      'aData, заполненного кодом инициализации
      varRetval = aData(lngRow, lngCol)
    Case acLBGetFormat
      'Возвращаем строку формата
      'указанной строки и колонки
      Select Case lngCol
        Case  0 
          'Устанавливаем формат для всех колонок
          varRetval = "ddd"
      End Select
    Case acLBEnd
      '
      Erase aData
  End Select
  FillList = varRetval

End Function



Public Function FillCtrCombo(ctl As Control, VarID As Variant, lngRow As Long, lngCol As Long, intCode As Integer) As Variant
  'Заполняет список или поле со списком перечнем
  'таблиц или запросов базы данных
  '
  'Эти переменняе сохраняют свои значения
  'между вызовами функции
  Static sastrNames() As String
  Static sintItems As Integer
  
  Dim varRetval As Variant
  
  varRetval = Null
  Select Case intCode
    'инициализация
    Case acLBInitialize
      sastrNames = InitCtrArray()
      'Заносим в переменную массив имен.
      sintItems = FillCtrArray(sastrNames)
      'Сообщаем Access, что список подготовлен
      'и она может запрашивать его элементы.
      varRetval = (sintItems >  0 )
    Case acLBOpen
      'Назначаем элементу управления уникальный идентификатор
      varRetval = Timer
    Case acLBGetRowCount
      'Возвращаем количество строк
      varRetval = sintItems
    Case acLBGetValue
      'Возвращаем данные для указанной строки
      varRetval = sastrNames(lngRow, lngCol)
      
    Case acLBEnd
      'Освобождаем память
      Erase sastrNames
  End Select
  FillCtrCombo = varRetval
  
End Function

Private Function InitCtrArray() As Variant
  Dim astrItems() As String 'Variant
  Dim intCount As Long
  
  'With Application.CurrentData
  '  intCount = .AllTables.Count + .AllQueries.Count
  'End With
  'If intCount > 0 Then
  '  'Выделяем память под массив для хранения имен объектов
  '  ReDim astrItems(0 To intCount - 1)
  'End If
  
  Dim cnn As New ADODB.Connection
  Dim rst As New ADODB.Recordset
  
  cnn.Open "DRIVER=SQL Server;SERVER=EDURSS\SQL_URSS;APP=Microsoft Access;WSID=EDURSS;DATABASE=TB2K;Trusted_Connection=Yes"
  rst.CursorLocation = adUseClient
  rst.Open "EXEC CtrComboP 0 ", cnn, adOpenKeyset, adLockOptimistic, adCmdText
  intCount = rst.RecordCount
  If intCount >  0  Then
    'Выделяем память под массив для хранения имен объектов
    ReDim astrItems( 0  To rst.RecordCount -  1 ,  0  To  4 )
    'ReDim astrItems(0 To (intCount - 1) * 5)
  End If
    
  'astrItems = rst.GetRows(rst.RecordCount)
  'ReDim astrItems(0 To rst.RecordCount - 1)
  
  InitCtrArray = astrItems
  Set cnn = Nothing
  Set rst = Nothing
End Function

Private Function FillCtrArray(astrNames() As String) As Integer
  Dim intItems As Integer
  'Dim astrNames As Variant
  Dim cnn As New ADODB.Connection
  Dim rst As New ADODB.Recordset
  Dim I As Long
  On Error GoTo Err_Function
  
  cnn.Open "DRIVER=SQL Server;SERVER=EDURSS\SQL_URSS;APP=Microsoft Access;WSID=EDURSS;DATABASE=TB2K;Trusted_Connection=Yes"
  rst.CursorLocation = adUseClient
  rst.Open "EXEC CtrComboP 0 ", cnn, adOpenKeyset, adLockOptimistic, adCmdText
  
  intItems = rst.RecordCount
  If intItems >  0  Then
    'Выделяем память под массив для хранения имен объектов
    ReDim astrItems( 0  To intItems -  1 ,  0  To  4 )
    'ReDim astrItems(0 To (intCount - 1) * 5)
  End If
  
  'intItems = 0
  'Заполнение массива с просчетеом intItems
  rst.MoveFirst
  'astrNames = rst.GetRows
  'If Err > 0 Then
  For I =  0  To rst.RecordCount -  1 
    If rst.EOF Then Exit For
    astrNames(I,  0 ) = rst!CtrID
    astrNames(I,  1 ) = rst!CtrNick
    astrNames(I,  2 ) = rst!CtrName
    astrNames(I,  3 ) = rst!CtrAddr
    astrNames(I,  4 ) = rst!CtrID
  
    If Not rst.EOF Then rst.MoveNext
  Next I
  'End If
 
  If intItems >  0  Then
    ReDim Preserve astrNames( 0  To intItems -  1 ,  0  To  4 )
  End If
  FillCtrArray = intItems
  'Debug.Print rst.RecordCount
  'Debug.Print astrNames(100) & " " & astrNames(500) & " " & astrNames(15000)
  Set cnn = Nothing
  Set rst = Nothing
Exit_Function:
    DoCmd.Hourglass False
    DoCmd.SetWarnings True
    Exit Function
Err_Function:
    MsgBox Err.Number & " " & Err.Description
    Resume Exit_Function
End Function
В приведенном виде этот код работает. astrItems и astrNames задекларированы, как у Гетца, As String. При этом GetRows вызывает ошибку type mismatch (естественно:)). Если задекларировать astrItems и astrNames As Variant, лезут непонятные ошибки в FillList и код вообще перестает работать, комбобокс не заполняется.
...
Рейтинг: 0 / 0
Функция с обратным вызовом
    #32882819
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы не пробовали декларировать astrItems as Variant?
И Redim делать не надо, ведь в Help сказано
HelpПри возвращении данных методом GetRows переменная avarRecords автоматически превращается в двумерный массив. ...
...
Рейтинг: 0 / 0
Функция с обратным вызовом
    #32882862
Ольга_Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно, что пробовала. При этом комбобокс пустой, первая функция, заполняющая список, вываливается по неопознанной ошибке.
Redim стоит для заполнения массива в цикле, как содрано с Гетца.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Функция с обратным вызовом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]