Распечатать страницу

Создание массива VFP

« Назад

Команда

DIMENSION ArrayName1(nRows1 [, nColumns1]) [AS cType]
                   [, ArrayName2(nRows2 [, nColumns2])] ...

создает один или несколько одномерных или двумерных массивов. При создании все элементы массива получают значение .F.

Параметры и опция:

ArrayName1, ArrayName2 ... – имена создаваемых массивов.

nRows1 [, nColumns1] – протяженности массива ArrayName1 по первому и второму измерениям (число строк и столбцов массива). Если указывается только nRows1, то создается одномерный массив, если добавляется и nColumns1, то – двумерный.

AS cType – тип массива. Задается, когда нужно указать тип, отличный от Variant. Опция употребляется при передачи массива COM-компоненту. Если тип указан неверно, то VFP устанавливает для массива тип Variant. Данные типа Variant могут передаваться только по ссылке.

Возможные значения параметра cType и варианты преобразования типа cType приведены в табл. 6.2.

Таблица 6.2

Значения cType и варианты преобразования типа, заданного cType

cType

IntelliSense-информация

COM-имя

COM Typelib-имя

.NET system
тип

XSD (SOAP)
тип

Array

Array

SAFEARRAY(type)

Type[ ]

Base64Binary

BinaryMemo

Variant

VARIANT (VT_VARIANT)

System.Object

anyType

Boolean

Logical

Boolean

VARIANT_BOOL (VT_BOOL)

System.Boolean

boolean

Byte

Number

Byte

unsigned char (VT_UI1)

System.Byte

Character

String

String

BSTR (VT_BSTR)

System.String

string

Currency

Currency

Currency

CURRENCY (VT_CY)

Date

Date

Date

DATE (VT_DATE)

System.DateTime

dateTime

DateTime

Date

Date

DATE (VT_DATE)

System.DateTime

dateTime

Decimal

Number

wchar_t (VT_DECIMAL)

System.UInt16

Double

Number

Double

double (VT_R8)

System.Double

double

Float

Variant

VARIANT (VT_VARIANT)

System.Object

anyType

Integer

Number

Long

long (VT_I4)

System.Int32

int

Logical

Logical

Boolean

VARIANT_BOOL (VT_BOOL)

System.Boolean

boolean

Long

Number

Long

long (VT_I4)

System.Int32

int

Memo

Variant

VARIANT (VT_VARIANT)

System.Object

anyTyp

Number

Number

Double

double (VT_R8)

System.Double

double

Object

Object

Object

IDispatch* (VT_DISPATCH)

System.Object

Short

Number

Long

long (VT_I4)

System.Int32

int

Single

Number

Single

single (VT_R4)

System.Single

String

String

String

BSTR (VT_BSTR)

System.String

string

Variant

Variant

VARIANT (VT_VARIANT)

System.Object

anyType

Void

VOID

Void

void (VT_VOID)

System.IntPtr

В общем случае массив может содержать данные разных типов. Присвоить всем элементам массива одно и то же значение позволяют, если SET COMPATIBLE установлен в OFF, команда STORE или =.

Элементы двумерного массива располагаются в памяти построчно. Номер строки (столбца) элемента массива по его номеру возвращает функция ASUBSCRIPT( ). Номер элемента массива по его индексам возвращает функция AELEMENT( ).

Функции ADEL( ) и AINS( ) соответственно удаляют и вставляют элементы строки или столбцы массива. Команды APPEND FROM ARRAY, COPY TO ARRAY, SCATTER и GATHER осуществляют обмен данными между массивом и записями таблицы.

По ходу выполнения программы форма массива может быть изменена (путем повторного употребления команды DIMENSION): двумерный массив может быть объявлен как одномерный, и наоборот. Могут быть произвольным образом изменены протяженности по каждому из измерений.

Если двумерный массив объявляется повторно с меньшим числом строк или столбцов, то уменьшение массива производится не по строкам или столбцам, а отбрасываются элементы с номерами, большими нового размера массива. Так, если массив формы 10´10 объявляется как массив формы 10´7, то теряются элементы с номерами 71, 72, …, 100.

При увеличении размера массива новые элементы получают значение .F. Если SET COMPATIBLE установлен в OFF, то значения прежних элементов сохраняются, а если – в ON или DB4, заменяются на .F.

Типизированный массив может быть передан COM-объекту как по ссылке, так и по значению. Объявляя формальный параметр-массив, не следует явно указывать тип объекта, например CommandButton, взамен нужно употреблять Object:

procedure someProc

lparameters aObjects[ ]

dimension aObjects[ ] as CommandButton        && Не поддерживается

endProc 

procedure someProc

lparameters aObjects[ ]

dimension aObjects[ ] as Object     && Рекомендуется

endProc

Для определения способа передачи массива COM-объекту употребляется функция COMARRAY( ).

Замечание. При передаче массива серверу, обслуживающему Microsoft .NET Framework, необходимо вызвать COMARRAY(<object>, 10), чтобы обеспечить передачу массива по ссылке.

Тип Single поддерживается только VFP COM-серверами. Тип Currency не может быть передан серверу, управляющему Microsoft .NET Framework. Когда такой сервер возвращает тип System.Decimal или System.UInt16, то он преобразовывается в тип wchart_t, который согласуется с VFP-типом Decimal.

Пример. Массив aMyArray создается в VFP, а затем передается Visual Basic COM-серверу, ожидающему тип данных Long.

&& Код VFP

dimension aMyArray [10] as Long

&& Передаем массив Visual Basic COM-серверу

lo.FillIntArray(@aMyArray, 100) 

' Этот код нужно добавить в Visual Basic CLS-file

' и откомпилировать как COM-компонент

Public Sub FillIntArray(ByRef aInts( ) as Long, iCount as Long)

ReDim aInts(1 to 100)

Dim ii as Integer

For ii = 1 to 100

aInts(ii) = ii

Next

End Sub

Команда

DECLARE ArrayName1(nRows1 [, nColumns1]) [AS cType]
                   [, ArrayName2(nRows2 [, nColumns2])] ...

полностью аналогична команде DIMENSION.