Программирование >>  Проектирование интерфейса пользователя 

1 ... 62 63 64 [ 65 ] 66 67 68 ... 153


Rijn-Sjme error 9 ; Subscri out Qf range

Help

Puc. /22 Окно сообщения о выходе значения индекса массива за допустимые пределы

Проверка переменных с помощью функции IsArray

Функции ray в качестве аргумента принимает переменную любого типа и возвращает булево значение, определяющее, является ли переменная массивом. В функцию IsArray можно передавать и переменные, и литеральные значения. Данная функция оказывается особенно полезной при работе с данными типа Variant, когда

реальный тип данных не очевиден. Пример использования функции IsArray приведен в листинге 12.6.

Листинг 12.6. Использование функции гау для проверки, является ли переменная массивом

1: Dim A

2: MsgBox IsArray (А) Отображает значение False 3:

4: Dim В ()

5t MsgBox IsArray(B) Отображает значение True 6:

7: Dim С As Variant

8: С = A-v-.= vf A , B , C )

9: MsgBox IsArray (C) Отображает значение True 10:

11 - ijim В As Integer

12::MsgBox IsArray (D) Отображает значение F.alse

13 !

14:Dim У As ADODB.Recordset

15:MsgBox IsArray(E) Отображает значение False

11 : Dim F(10) As String

idiMsgBox IsArray(F) Отображает значение True

20:MsgBox IsArray (Array (1, 2, 3)) Отображает значение True

Настоятельно советуем избегать создания такого двусмысленного кода, в котором требовалось бы использовать функции типа IsArray. Однако вы можете попасть в ситуацию, когда без данной функции не обойтись. В этом случае еще раз пересмотрите код - возможно, его удастся переработать так, чтобы он стал более ясным.



Передача массивов параметров в процедуры

Последний аргумент процедуры можно объявить как параметр (массив

значений типа Variant), что позволит передавать в процедуру набор значений, которые

будут преобразованы в массив. Как это сделать, показано в листинге 12.7.

Листинг 12.7. Использование параметра типа ParamArray

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16

Sub CallTestO

Call TestParamArray ( Paul Kimmel , (517) 555-1234 , pkimmel@softconcepts.com )

End Sub

Sub TestParamArray(ContactName As String,

ParamArray Contactinf о {, As Variant)

Dim S As String

S = ContactName Dim I As Integer

For I = LBound(Contactlnfo) To UBound(Contactinfo) S = S & Contactlnfo(I)

Next I

MsgBox Информация о пользователе: End Sub

& S


Тестирование процедуры начните с запуска CallTest. Эта процедура

вызывает подпрограмму TestParamArray с тремя аргументами. Как видно из текста листинга, процедура TestParamArray имеет всего два аргумента: ContactName и ParamArray. При тестировании аргументу Con-

tactName присваивается значение Paul Kimmel , а два других аргумента помещаются в массив ParamArray. В результате работы программы в окне сообщений появится вся известная информация о пользователе, независимо от того, сколько аргументов передается в подпрограмму.

Программистам, использующим язык Ассемблер, наверное, будет легче изучить массивы параметров, поскольку технология их применения сходна с тем, как данные помещают в стековый фрейм перед вызовом функции и получают из него при вызове функции. Всего несколько лет назад программисты вручную управляли стековым фреймом, теперь его обработка производится компиляторами.

ParamArray необходим по двум причинам. Язык программирования С поддерживает переменное число аргументов функции, поэтому Visual Basic, вероятно, наследует эту возможность. Такая техника работает, поскольку передаваемые в функцию данные помещаются в стековый фрейм, который на самом деле является массивом данных. Несмотря на то, что стековый фрейм управляется компьютером, в компилятор автоматически добавляется код обработки стекового фрейма, поэтому массив аргументов может пригодиться. От разработчиков компиляторов потребуется больше усилий для того, чтобы преобразовать данные из стека в специальную переменную, которая обеспечивает доступ к стековому фрейму как к массиву.



Функции, возвращающие массивы

не дает возможности непосредственного возврата массива из функции. Впрочем, один способ решения подобной задачи все-таки существует - он основан на модели поведения функции Array, которая, по существу, возвращает значение типа Variant.

Поскольку возвращаемое значение имеет тип Variant, вероятно, придется использовать функцию IsArray.

Тип Variant представляет собой обобщение самых разнообразных типов данных. В программу, обращения к элементам данных типа Variant, компилятор добавляет специальные фрагменты кода, которые позволяют определить (на основе избранных вами способов инициализации переменных) действительные типы

значений, содержащихся в объектах Variant.

Если в ходе решения поставленной задачи потребуется функция, возвращающая

массив, обратитесь к типу Variant. В листинге 12.8 демонстрируется соответствующий пример.

Листинг 12.8. Пример построения функции, возвращающей массив типа Variant

1: Function Array( ) As Variant

2: Static Data (100) As Integer

3 : GetMyArray = Data

4: End Eunction

6: Sub TestReturnArray( )

7: Dim MyArray As Variant

8: MyArray = GetMyArray( )

9: If (IsArray(MyArray)) Then

10: MsgBox Ubound(MyArray)

11: End If

12 : End Sub

Строке-4 листинга 12.8 содержат определение функции GetMyArray, которая объявляет и возвращает статический массив. Локальные переменные, которые должны быть использованы вне контекста их объявления, следует определять как статические, - в строке 2 мы так и поступили, чтобы гарантировать корректность обращения к данным после выхода из функции, в которой они объявлены. В строках приведен пример подпрограммы, которая демонстрирует использование массива, возвращенного функцией GetMyArray.

В данном случае можно говорить еще об одном ходе: зная, что данные нам понадобятся, мы объявили их не заблаговременно, а именно тогда, когда это оказалось необходимым - т.е. внутри функции GetMyArray. На самом деле процедура размещения и инициализации массива - ни что иное, как конструктор. Конструктор - термин объектно-ориентированного профаммирования, и в данной части книги используется нечасто. Конструктор - это специальный метод класса, который выполняет размещение и инициализацию класса (подробнее см. главу 21).



1 ... 62 63 64 [ 65 ] 66 67 68 ... 153

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика