Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VisualFoxPro.doc
Скачиваний:
15
Добавлен:
01.07.2025
Размер:
11 Мб
Скачать
☆

6.1.4. Массив как параметр программных компонентов

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

Пример. Процедура InitArray( ) принимает массив, переданный по ссылке, и выполняет его инициализацию, записывая в каждый элемент массива его номер. Результат используется в основной программе.

dimension someArray(3, 4)

&& Передаем массив someArray по ссылке

InitArray(@someArray)

&& Печатаем значение 7-го элемента массива

? someArray(2, 3) && Напечатает: 7

procedure InitArray(someArray)

&& elemNo – номер элемента массива

&& Обращаемся к двумерному массиву, как к одномерному

for elemNo = 1 to Alen(someArray)

someArray(elemNo) = elemNo

endFor

endProc

Массив, переданный другому программному компоненту по ссылке, объявлять в программе-приемнике нет необходимости.

Также передачу массива, как и иного параметра, по ссылке обеспечит установка SET UDFPARMS в REFERENCE, например:

set udfparms to reference

InitArray(someArray) && Знак @ уже не нужен

Если же передавать массив по значению и если соответствующий формальный параметр процедуры не объявлен как массив, то будет передан только первый элемент массива, а формальный параметр процедуры будет интерпретироваться как скаляр, например:

dimension someArray(3, 4)

someArray = 2

&& Передаем массив someArray по значению

set udfparms to value

PassAsValue(someArray)

procedure PassAsValue(someArray)

? someArray && Напечатает: 2

endProc

Если же при передаче по значению соответствующий формальный параметр объявлен как массив, то все его значения будут равны .F.

Замечание. Массив как параметр может быть передан и таким объектам VFP, как форма, меню и др.

Для передачи массива в программный компонент иного файла помимо рассмотренного механизма можно в вызываемом программном компоненте наряду с командой PARAMETERS употребить команду EXTERNAL.

Команда

EXTERNAL ARRAY ArrayList

обеспечивает доступ к массивам, созданным в другом программном компоненте.

Параметр:

ArrayList – список внешних массивов; в качестве разделителя между элементами списка применяется запятая.

Пример. Массив объявляется и инициализируется в основной программе файла d:\Prog1.prg и передается и выводится в основной программе файла d:\Output.prg.

&& Состав файла d:\Prog1.prg

&&

local someArray(2, 3)

store 5 to someArray && Инициализация массива someArray

&& Печатаем массив; массив передается по ссылке

do d:\Output with someArray

&& Содержимое файла d:\Output.prg

&&

parameters someArray

external array someArray

for iRow = 1 to Alen(someArray, 1)

for iCol = 1 to Alen(someArray, 2)

?? someArray(iRow, iCol) && Напечатает: 5 5 5 5 5 5

endFor

endFor

Также команда EXTERNAL ARRAY может быть употреблена и в вызывающей программе (см. описание команды в справке VFP).

6.1.5. Функции для массивов

Все рассматриваемые в разделе функции имеют параметр ArrayName – имя формируемого или преобразовываемого, или анализируемого функцией массива.

Для функций, извлекающих информацию в массив, справедливо следующее: если массив ArrayName не существует, то он будет создан, если существует, то приобретет форму, необходимую для хранения результата. Если функция не находит необходимых для заполнения массива данных, то несуществующий массив, создан не будет, а существующий останется без изменений.

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

Функции для массивов приводятся в алфавитном порядке.

Функция

ACLASS(ArrayName, oExpression)

заносит в одномерный массив ArrayName имя класса объекта oExpression и имена классов-потомков. Функция возвращает число занесенных в массив элементов.

Пример. Создается класс VectorInit, содержащий метод InitArray, выполняющий инициализацию вектора. На его основе создается класс VectorFunction, содержащий метод DotProduct, возвращающий скалярное произведение двух векторов одной длины. Длина векторов задается свойством arraySize класса VectorInit.

&& Создаем объект типа VectorFunction

vFunc = CreateObject("VectorFunction")

&& Формируем и печатаем массив arrayClassNames

nCount = Aclass(arrayClassNames, vFunc)

for k = 1 to nCount

? arrayClassNames(k)

endFor

&&

&& Напечатает:

&& VectorFunction

&& VectorInit

&& Custom

&&

&& Создаем одномерные массивы arrayA и arrayB

&& Размер массивов

vFunc.ArraySize = 10

dimension arrayA(vFunc.ArraySize), arrayB(vFunc.ArraySize)

&& Выполняем их инициализацию массивов

&& Передаем имена массивов по ссылке

vFunc.InitArray(@arrayA)

vFunc.InitArray(@arrayB)

&& Вычисляем скалярное произведение векторов arrayA и arrayB

&& Массивы должны быть переданы по ссылке

? vFunc.DotProduct(@arrayA, @arrayB)

&&

&& Возможный результат: 2.5671

&& Освобождаем объект vFunc

release vFunc

&& Создаем класс VectorInit

define class VectorInit as Custom

&& ArraySize – свойство класса VectorInit

&& используется для задания размера инициализируемого вектора

ArraySize = 1

&& Инициализация вектора vect размера This.ArraySize случайными числами

procedure InitArray(vect)

for k = 1 to This.ArraySize

vect(k) = Rand( )

endFor

endProc

endDefine

&& Создаем класс VectorFunction; VectorInit – имя класса-родителя

define class VectorFunction as VectorInit

&& Вычисляет скалярное произведение векторов равной длины

function DotProduct(a, b)

dp = 0

for k = 1 to This.ArraySize

dp = dp + a(k) * b(k)

endFor

return dp

endFunc

endDefine

Функция

ACOPY(SourceArrayName, DestinationArrayName [, nFirstSourceElement [, nNumberElements [, nFirstDestElement]]])

копирует элементы одного массива в другой. При копировании данные приемника заменяются данными источника. Если массив-приемник не существует, то он будет создан. Форма созданного массива будет совпадать с формой массива-источника. Если массив приемник существует, то он при копировании примет форму массива-источника.

Параметры:

SourceArrayName, DestinationArrayName – соответственно имена массивов источника и приемника данных.

nFirstSourceElement – номер элемента массива-источника, с которого начинается копирование. При отсутствии параметра копирование начинается с первого элемента.

nNumberElements – число копируемых элементов. Если параметр отсутствует или равен 1, то копируются все элементы начиная с nFirstSourceElement.

nFirstDestElement – первый замещаемый элемент массива-приемника.

Замечание. Если задание параметров nFirstSourceElement, nNumberElements и nFirstDestElement приведет к нарушению границ массива, то возникнет ошибка Subscript is outside range.

Функция ACOPY( ) возвращает число скопированных элементов.

Пример. Копируются начиная со второго 3 элемента массива sArray в массив dArray, в котором первым замещается 3-й элемент.

dimension sArray(2, 3), dArray(2, 3)

store "s" to sArray

store "d" to dArray

Acopy(sArray, dArray, 2, 3, 3)

&& Массив dArray:

d

d

s

&&

s

s

d

Функция

ADATABASES(ArrayName)

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

Пример:

close databases

open database 'd:\HomeLibrary\HomeLibrary'

Adatabases(arrayDBC)

? arrayDBC(1, 1)

? arrayDBC(1, 2)

close databases

Результат:

HOMELIBRARY

D:\HOMELIBRARY\HOMELIBRARY.DBC

Функция

ADBOBJECTS(ArrayName, cSetting)

записывает имена соединений, отношений, таблиц и SQL-видов текущей базы данных в массив ArrayName. Если параметр cSetting имеет значение CONNECTION, TABLE или VIEW, то формируется одномерный массив, если RELATION – двумерный. Каждая строка одномерного массива содержит имя соединения, таблицы или SQL-вида, в каждой строке двумерного массива ее 1-й элемент содержит имя дочерней таблицы, 2-й – имя родительской таблицы, 3-й – имя индекса дочерней, а 4-й – имя индекса родительской таблицы. В 5-й элемент записывается информация о ссылочной целостности данных.

Если межтабличная связь не имеет пользовательских правил контроля ссылочной целостности, то элемент содержит 3 символа, соответствующие типу задаваемых в Referential Integrity Builder (см. рис. 2.11) правил контроля ссылочной целостности для обновления, удаления и вставки записей. При этом 1-й символ означает тип правила обновления, 2-й – удаления, а 3-й – вставки. Возможные значения для правил обновления и удаления следующие: "C" – каскадирование, "R" – запрет и "I" – игнорирование. Для правила вставки употребляются только "R" и "I". Так, если для связи заданы следующие правила контроля ссылочной целостности: при обновлении – каскадирование; при удалении – запрет, а при вставке – игнорирование, то 5-й элемент строки массива будет равен "CRI".

В момент исполнения ADBOBJECTS( ) база данных должна быть открыта, в противном случае будет сгенерировано сообщение об ошибке.

Пример:

close databases

open database 'd:\HomeLibrary\HomeLibrary'

declare arrayOfSettings(4)

arrayOfSettings(1) = "CONNECTION"

arrayOfSettings(2) = "TABLE"

arrayOfSettings(3) = "VIEW"

arrayOfSettings(4) = "RELATION"

for k = 1 to 4

if ADBObjects(arrayDBO, arrayOfSettings(k)) > 0 then

&& Печатаем значение cSetting

? arrayOfSettings(k)

display memory like arrayDBO

endif

endFor

close databases

Результат:

ARRAYDBO Priv A test

( 1 ) C "AUTHORS"

( 2 ) C "BOOKS"

( 3 ) C "BOOKSCONTENT"

( 4 ) C "BOOKSAUTHORS"

( 5 ) C "WORKTYPE"

RELATION

ARRAYDBO Priv A test

( 1, 1) C "BOOKSAUTHORS"

( 1, 2) C "BOOKS"

( 1, 3) C "BOOKID"

( 1, 4) C "BOOKID"

( 1, 5) C "CRI "

…

Функция

ADEL(ArrayName, nElementNumber [, 2])

удаляет элемент одномерного или строку или столбец двумерного массива ArrayName.

Удаление элементов не приводит к изменению формы массива. При удалении элемента или строки последние элементы соответствующим образом смещаются по направлению к началу массива. На их месте возникают элементы равные .F. При удалении столбца сдвигаются столбцы по направлению к первому столбцу; элементы последнего столбца оказываются равными .F.

Параметр:

nElementNumber – номер удаляемого элемента, если массив одномерный. Если массив двумерный, то параметр при отсутствии последнего параметра задает номер удаляемой строки, а при наличии последнего параметра – номер удаляемого столбца.

При успешном удалении функция вернет 1, при неудаче – 0.

Пример. Удаляется элемент одномерного массива: строка, а затем столбец двумерного массива.

dimension oneDArray(7), twoDArray(2, 3)

&& Инициализация массивов

store 4 to oneDArray, twoDArray

for iCol = 1 to 3

&& Изменяем 2-ю строку массива twoDArray

twoDArray(2, iCol) = 5

endFor

Adel(oneDArray, 2) && Результат: 4 4 4 4 4 4 .F.

&& Удаляем 1-ю строку

Adel(twoDArray, 1)

&& Массив twoDArray:

5

5

5

&&

.F.

.F.

.F.

&& Повторная инициализация массива twoDArray

store 7 to twoDArray

&& Удаляем 2-й столбец

Adel(twoDArray, 2, 2)

&& Массив twoDArray:

7

7

.F.

&&

7

7

.F.

Функция

ADIR(ArrayName [, cFileSkeleton [, cAttribute [, nFlag]]])

помещает информацию о файлах в массив ArrayName и возвращает число файлов, описанных в массиве.

Результирующий массив имеет 5 столбцов; число строк массива равно числу описанных в нем файлов. Содержимое каждой строки раскрыто в табл. 6.3.

Таблица 6.3

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]