Страница: 1 |
Страница: 1 |
Вопрос: Загадка ;)
Добавлено: 08.10.04 02:01
Автор вопроса: Lister | ICQ: 298621256
Как узнать, инициализирован ли массив типов MyType?
Type MyType
String_1 As String
String_2 As String
String_3 As String
End Type
Dim tMT() As MyType
IsEmpty(tMT) здесь, естественно, не подходит.
Может в VB есть еще какая-нибудь функция?
Ответы
Всего ответов: 7
Номер ответа: 1
Автор ответа:
war
ICQ: 288367795
Вопросов: 7
Ответов: 15
Профиль | | #1
Добавлено: 08.10.04 03:40
Проверь на возникновение ошибки
ТИПА
on error goto 1
a = MyType.string1
...
...
1
Номер ответа: 2
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #2
Добавлено: 08.10.04 03:41
Никак. Оно не только с пользовательскими, а и с обычными типами не работает. Да и вообще VB ориентирован на Variant. Вот так:
Dim a As Variant
MsgBox IsArray
a = Array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
MsgBox IsArray
Erase a
MsgBox IsArray
Номер ответа: 3
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #3
Добавлено: 08.10.04 03:47
Да нет, можно гораздо проще.
Private Initialized as Boolean
Sub RedimAray()
if Initialized then
Redim Array(Ubound(Array)+1)
Else
Initialized=True
Redim Array(0)
End If
End Sub
Номер ответа: 4
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #4
Добавлено: 08.10.04 03:50
А я вот что придумал:
On Error Resume Next
ArrayIsEmpty = (Len(CStr(UBound(tMT))) > 0)
End Function
Если массива нет, значит UBound вызовет ошибку и ArrayIsEmpty останется False
Если массив создан - True
Номер ответа: 5
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 08.10.04 04:30
Дело в том, что массив в VB - это не обычная последовательность байт в памяти. Не, ну в конечном счете конечно - обычная последовательность. Но для неё ещё есть обёртка SAFEARRAY. И если какой то другой язык просто выделяет глобальную или локальную память, то VB создаёт массив посредством COM. И обращаясь к массиву он обращается не к адресу, а к этой обёртке. Как и всякий объект эта обёртка имеет логический номер (Handle). Если массив не инициализирован, то значит COM-массив ещё не создавался и хендл обёртки равен нулю. Вот тут он и генерирует тебе ошибку.
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 08.10.04 11:39
1.
Public Function usrUB(ByRef gArray() As gbUsers) As Long
On Error Resume Next
usrUB = &HFFFF
usrUB = UBound(gArray)
End Function
[/code]
2.
[code]
Public Function usrUB(ByRef gArray() As MyType) As Long
On Error GoTo err
usrUB = UBound(gArray)
Exit Function
err:
usrUB = &HFFFF
End Function
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 08.10.04 11:40
Хе... ну и глюки