Создание массива VFP
« Назад Команда DIMENSION ArrayName1(nRows1 [, nColumns1]) [AS 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.