Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Visual Basic - Трюки и Хитрости, советы и ответы на вопросы


Служба Рассылок Subscribe.Ru проекта Citycat.Ru
VB Хитрости - советы и ответы на вопросы

Реакция на прошлый выпуск:

Определение размера динамического массива. (выпуск 2 )

В последней рассылке речь шла о сабже. Так вот, хочу предложить свой
вариант определения как числа измерений массива, так и их размер.
Как известно Бейсиковый массив это тип данных SAFEARRAY Автоматизации.
Ниже приведённая ф-я просто считывает поля этой структуры.

Private Type SAFEARRAYBOUND
cElements As Long 'число элементов в данном измерении массива
lLbound As Long 'нижняя граница данного измерения
End Type

'Непосредственно не используется, приведена для ознакомления
Private Type SAFEARRAY
cDims As Integer 'число измерений
fFeatures As Integer 'флаги атрибутов массива
cbElements As Long 'размер элемента массива в байтах
cLocks As Long 'текущее число блокировок массива
pvData As Long 'указатель на данные массива
' rgsabound() As SAFEARRAYBOUND
rgsabound As Long 'указатель на массив данных структуры
'SAFEARRAYBOUND
End Type


Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, _
ByVal Length As Long _
)

Private Declare Sub CopyMemoryArr Lib "kernel32" Alias "RtlMoveMemory" ( _
Destination As Any, _
Source() As Any, _
ByVal Length As Long _
)

'********** Собственно функция ****************

Private Function GetDims(Arr() As Byte, Bounds() As SAFEARRAYBOUND) As Long

'Возвращает число измерений массива, если массив не иннициализирован
'возвращает 0
' Вместо параметра Arr() As Byte нужно написать тип данных который нужен,
' например Arr() As String и т.п.
'В параметре Bounds() возвращается информация об измерениях массива
'но "наоборот" т.е. в Bounds(1&) будет содержаться информация о самом
'правом измерении массива Arr()

Dim AdressArray As Long

CopyMemoryArr AdressArray, Arr(), 4& 'получаем адресс структуры
SAFEARRAY
CopyMemory GetDims, ByVal AdressArray, 2& 'узнаём содержание поля cDims
структуры SAFEARRAY
If GetDims = 0& Then Exit Function 'значит массив не иннициализирован
ReDim Bounds(1& To GetDims) 'иннициализируем массив, который будет
содержать информацию о границах
CopyMemory Bounds(1&), ByVal AdressArray + 16&, GetDims * 8&

End Function

************* Пример использования ***************************

Dim bArr() As Byte

Private Sub Form_Load()
Dim i As Long
Dim ArrDims As Long
Dim ArrBounds() As SAFEARRAYBOUND

ReDim bArr(2, 1 To 3, 0, 1)

ArrDims = GetDims(bArr(), ArrBounds())

If ArrDims > 0 Then

Debug.Print "Число измерений массива - ", ArrDims

For i = ArrDims To 1 Step -1
Debug.Print
Debug.Print "Измерение номер ", ArrDims - i + 1
Debug.Print Tab(10), "нижняя граница - ", ArrBounds(i).lLbound
Debug.Print Tab(10), "число элементов - ", ArrBounds(i).cElements
Next i
Else
'MsgBox "Массив не инициализирован"
End If

End Sub


С Уважением, Виталий Бочкарев.

P.S. Работает, почти, в два раза быстрее GetUpper:)

Cовет 2 - Получаем значения разделителя для цифровых данных (точка или запятая) без использования API

Программа работающая с данными может оказаться неприменима в виндах , настроенных на другие региональные установки. Например Я напишу 3.5 или 3,5

В зависимости от региональных установок числа будут распознаны по разному.
Можно этот разделитель найти с использованием api , а можно так:

Function RegionalSymbol() as string

RegionalSymbol = mid(cStr(1.1),2,1)

end function

Для тех, у кого есть любые вопросы, имеюшие отношение к тематике Visual Basic, рекомендую место, где на них можно получить ответ. Причем в течении совершенно разумного и небольшего промежутка времени - от нескольких часов до нескольких дней. Место это - конференция RU.Visual.Basic, расположенная на сайте Visual Basic на русском
Для сомневающихся в эффективности такого метода получения ответов, информирую, что за декабрь месяц среднее ежедневное количество сообщений составлило 65 - общее за месяц - 2031 , за январь - 2033 , за февраль - 1995
Архивы конфференции также доступны для скачивания с сайта.

Хочу поставить в известность всех подписчиков этого листа - лист создается в html , а потом автоматом на Ситикоте из него создается текстовый вариант. Так что, если вы, по ошибке, подписались на текстовую версию - рекомендую изменить этот параметр, так как за качество конвертации я не отвечаю, а создавать отдельную версию у меня не хватает времени. Сорри

 

Успехов в программировании!

Борис Рудой

Автор сайта - Visual Basic на русском



http://subscribe.ru/
E-mail: ask@subscribe.ru
Поиск

В избранное