Здравствуйте, уважаемые читатели.
Продолжаем наши нечастые выпуски. Все же луше хоть изредка., чем совсем
мертвая рассылка.
Совет 1 - Определение размера динамического массива.
Динамические массивы (array) являются очень неплохим средством для
создания коллекций значений "на лету" Однако, вы можете натолкнуться
на некоторые трудности с определением - содержит ли массив какие- либо
значения. Применение UBound() в этом случае работает только, если массив
уже инициализирован. В противном случае вылезет рантайм error
Чтобы избежать этой ошибки некторые рекомендуют инициализировать массив
сразу после его обьявления
ReDim strCats(0)
Однако зачем бэйсику создавать массив, который возможно и не будет
не разу использован? Другие рекомендуют использовать переменную-счетчик,
содержащий количество элементов:
MyUpper = 0
Sub AddValue(strValue as String)
ReDim Preserve strCats(MyUpper)
strCats(MyUpper) = strValue
MyUpper = MyUpper + 1
End Sub
Этот метод работает, однако его использование может вызвать беспорядок
в больших приложениях. Т.е подразумевается, что всюду, при изменении
количества элементов надо обновлять и переменную. Бэйсик ведь уже хранит
в массиве его верхнюю границу (ubound), и это наиболее эффективный метод
хранения (как и любой другой обьектный метод - обьект знает сам о себе
все)
Как кажется мне - наиболее удачным решением является отлавливание ошибки
при попытке узнать ubound массива, не содержащего ни одного элемента
(Error 9, subscript out of range)
Private Function GetUpper(varArray As Variant)
As Integer
Dim Upper As Integer
On Error Resume Next
Upper = UBound(varArray)
If Err.Number Then
If Err.Number = 9 Then
Upper = 0
Else
With Err
MsgBox "Error:" & .Number & "-" & .Description
End With
Exit Function
End If
Else
Upper = UBound(varArray) + 1
End If
On Error GoTo 0
GetUpper = Upper
End Function
Совет 2 - Исправляем поведение IDE при работе с Enums
Перечисление (Enum) постоянных является удобном способом использования
фиксированных значений
Вот например вы пишете функцию, в которую надо передать False или True
для этого надо обьявить ее так -
Function A ( myVal as Boolean)
И при использовании функции А IDE VB (интрегрированная среда разработчика
VB) подскажет вам, что здесь ожидается именно True/False
A теперь усложним ситуацию - передать надо значение имеющее одно из
четырех состовляющих - например 1 , 3 , 5 , 7
Для этого в зоне деклараций модуля обьявляем
Public Enum Aenum
A_One = 1
A_Tree = 3
A_Five = 5
A_Seven = 7
end enum
Тепрь функцию надо обьявить так -
Function A ( myVal as Aenum)
К сожалению vb периодически валяет дурака и не желает менять написание
букв.
т.е. вызов a(a_oNE) будет исправлен на A(a_oNE), констнта внутри функции
не будет исправлена ( временами это работает, временами нет)
Короче, недостаток косметический, но раздражающий. Особенно если таких
енумов десяток полтора, и хочется быть уверенным, что не напутал с написанием.
итак идите в модуль и вставьте там процедуру условной компиляции.
#IF FALSE then
Public A_One
Public A_Tree
Public A_Five
Public A_Seven
#End IF
Этот код никогда не исполняется, и никогда не компилируется. Однако
IDE после этого не путается с этим 4 константами.
Для тех, у кого есть любые вопросы, имеюшие отношение к тематике Visual
Basic, рекомендую место, где на них можно получить ответ. Причем в течении
совершенно разумного и небольшего промежутка времени - от нескольких
часов до нескольких дней. Место это - конференция RU.Visual.Basic,
расположенная
на сайте Visual Basic на русском
Для сомневающихся в эффективности такого метода получения ответов, информирую,
что за декабрь месяц среднее ежедневное количество сообщений составлило
65 - общее за месяц - 2031 , за январь - 2033 , за февраль - 1995
Архивы конфференции также доступны для скачивания с сайта.
Хочу поставить в известность всех
подписчиков этого листа - лист создается в html , а потом автоматом на
Ситикоте из него создается текстовый вариант. Так что, если вы, по ошибке,
подписались на текстовую версию - рекомендую изменить этот параметр, так
как за качество конвертации я не отвечаю, а создавать отдельную версию
у меня не хватает времени. Сорри