Страница: 1 |
Вопрос: Загадка ;) | Добавлено: 08.10.04 02:01 |
Автор вопроса: ![]() |
Как узнать, инициализирован ли массив типов 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 Автор ответа: ![]() ![]() ![]() ICQ: 288367795 Вопросов: 7 Ответов: 15 |
Профиль | Цитата | #1 | Добавлено: 08.10.04 03:40 |
Проверь на возникновение ошибки
ТИПА on error goto 1 a = MyType.string1 ... ... 1 |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик 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 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 298621256 Вопросов: 57 Ответов: 304 |
Профиль | Цитата | #4 | Добавлено: 08.10.04 03:50 |
А я вот что придумал:
Private Function ArrayIsEmpty(tMT() As MyType) As Boolean
On Error Resume Next ArrayIsEmpty = (Len(CStr(UBound(tMT))) > 0) End Function Если массива нет, значит UBound вызовет ошибку и ArrayIsEmpty останется False Если массив создан - True |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 08.10.04 04:30 |
Дело в том, что массив в VB - это не обычная последовательность байт в памяти. Не, ну в конечном счете конечно - обычная последовательность. Но для неё ещё есть обёртка SAFEARRAY. И если какой то другой язык просто выделяет глобальную или локальную память, то VB создаёт массив посредством COM. И обращаясь к массиву он обращается не к адресу, а к этой обёртке. Как и всякий объект эта обёртка имеет логический номер (Handle). Если массив не инициализирован, то значит COM-массив ещё не создавался и хендл обёртки равен нулю. Вот тут он и генерирует тебе ошибку. |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 08.10.04 11:40 |
Хе... ну и глюки ![]() |
Страница: 1 |
|