Файл: Особенности и примеры использования массивов при разработке программ.pdf
Добавлен: 28.03.2023
Просмотров: 142
Скачиваний: 2
Пример. Печатаются имена всех функций VFP, имена которых в программах должны записываться без сокращений.
Alanguage(arrayOfFuncNames, 2)
for k = 1 to Alen(arrayOfFuncNames, 1)
if 'M' $ arrayOfFuncNames(k, 2) then
? arrayOfFuncNames(k, 1), arrayOfFuncNames(k, 2)
endif
next
Результат:
COMPROP |
M2-3 |
CREATEOBJECTEX |
M2-3 |
CURSORTOXML |
M2-8 |
DDEABORTTRANS |
M1 |
DDEADVISE |
M4 |
DDEENABLED |
M0-2 |
DDEEXECUTE |
M2-4 |
DDEINITIATE |
M2 |
DDELASTERROR |
M0-1 |
DDEPOKE |
M3-5 |
DDEREQUEST |
M2-4 |
DDESETOPTION |
M1-2 |
DDESETSERVICE |
M2-3 |
DDESETTOPIC |
M2-3 |
DDETERMINATE |
M1 |
DISPLAYPATH |
M2 |
FORCEEXT |
M2 |
FORCEPATH |
M2 |
GETINTERFACE |
M1-3 |
GETWORDCOUNT |
M1-2 |
GETWORDNUM |
M2-3 |
JUSTDRIVE |
M1 |
JUSTEXT |
M1 |
JUSTFNAME |
M1 |
JUSTPATH |
M1 |
JUSTSTEM |
M1 |
XMLTOCURSOR |
M1-3 |
XMLUPDATEGRAM |
M0-3 |
Функция ALEN(ArrayName [, nArrayAttribute]) возвращает число элементов, строк или столбцов в массиве ArrayName.
Параметр:
nArrayAttribute – принимает следующие значения:
0 (или опущен) – функция вернет число элементов в массиве;
1 – функция вернет число строк в массиве;
2 – функция в случае двумерного массива вернет число столбцов в массиве, а в случае одномерного массива – 0.
Пример. Печатаются имена файлов и поддиректорий, отобранных в массив fileArray.
&& Устанавливаем директорию по умолчанию
set default to c:
&& Формируем массив fileArray, занося в него описания системных и скрытых файлов,
&& а также поддиректорий корневого каталога диска с:
if Adir(fileArray, "", "DHS") > 0 then
&& Вывод имен файлов и поддиректорий
&& для определения верхней границы цикла FOR используем ALEN( )
for iRow = 1 to Alen(fileArray, 1)
fileName = fileArray(iRow, 1)
fileAtributes = fileArray(iRow, 5)
do case
case "D" $ fileAtributes
? "Папка ", fileName
case "S" $ fileAtributes
? "Системный" + Iif("H" $ fileAtributes, ", скрытый", "") + " файл", fileName
case "H" $ fileAtributes
? "Скрытый файл ", fileName
endCase
endFor
endif
Возможный результат:
Папка WINDOWSСистемный скрытый файл BOOTFONT.BIN
Системный скрытый файл NTLDR
Системный скрытый файл NTDETECT.COM
Системный скрытый файл BOOT.INI
Папка DOCUMENTS AND SETTINGS
Папка PROGRAM FILES
…
Функция ALINES(ArrayName, cExpression [, nFlags] [cParseChar [, cParseChar2 [, …]]]) копирует каждую строку cExpression в соответствующий элемент одномерного массива ArrayName. Возвращает число элементов в результирующем массиве.
По сравнению с функцией MLINES( ), позволяющей выполнить аналогичные действия, ALINES( ) работает быстрее, программы с ALINES( ) более компактны и, кроме того, на функционирование ALINES( ) не оказывает влияния установка команды SET MEMOWIDTH.
Параметры:
cExpression – символьное выражение или memo-поле, строки которого копируются в массив. Могут быть использованы 2-байтовые символьные строки.
Если cExpression – это пустая строка или NULL-значение, то результирующий массив будет состоять из одного элемента, содержащего пустую строку.
Если cExpression имеет тип Varbinary или Blob, то ALINES( ) создает массив с элементами типа Varbinary.
nFlags – принимает приведенные в табл. 6.12.
Таблица 6.12
Значения параметра nFlags
Бит |
nFlags (сумма) |
Описание |
0 |
1 |
По умолчанию. Удаляет ведущие и хвостовые пробелы в строке; для типов Varbinary и Blob удаляет ведущие и хвостовые нулевые байты |
1 |
2 |
Включает элемент в массив, даже если элемент пустой |
2 |
4 |
Не включает пустые элементы в массив |
3 |
8 |
Задает чувствительные к регистру символы конца строки |
4 |
16 |
Включает символы конца строки в массив |
Функция APROCINFO(ArrayName, cFileName [, nType]) формирует массив ArrayName, содержащий элементы встроенного языка VFP, имеющиеся в PRG-файле cFileName. Возвращает число строк результирующего массива. Параметр nType задает вид информации, записываемой в массив ArrayName. Действие параметра описано в табл. 7.
Таблица 7
Действие параметра nType
nType |
Что содержит массив |
Состав строки массива |
|
Номер |
Что содержит |
||
0 |
Описания всех элементов языка |
1 |
Имя элемента |
2 |
Номер строки в файле |
||
3 |
Вид элемента |
||
4 |
Отступ (используется с директивами #IF для описания их уровня вложенности) |
||
1 |
Описания определений классов |
1 |
Имя класса |
2 |
Номер строки в файле |
||
3 |
Родительский класс |
||
4 |
Является ли OLE-объектом |
||
2 |
Описания процедур классов |
1 |
Имя процедуры, имеющее в качестве префикса имя класса |
2 |
Номер строки в файле |
||
3 |
Описания директив компилятора |
1 |
Имя, определяемое директивой |
2 |
Номер строки в файле |
||
3 |
Вид директивы |
По умолчанию nType = 0.
Вид элемента встроенного языка VFP, может принимать следующие, заносимые в третий столбец массива значения:
Define, если элемент – это директива #DEFINE;
Directive в случае иной директивы компилятора;
Class, если элемент – это определения класса
Procedure, если элемент – это процедура, функция, событие или метод.
Функция полезна на этапе разработки программ и их последующего документирования.
Пример. Функция APROCINFO( ) применяется для анализа следующей программы, хранящейся в файле d:\ProcForProcInfo.prg.
&& Файл d:\ProcForProcInfo.prg
clear
&&
#define NTIMES 3
&&
oAB = CreateObject("APlusB")
&& Идентификатор объекта должен передаваться по ссылке
c = FindC(0, 3, @oAB)
? c
&& Освобождаем объект oAB
release oAB
&&
define class APlusB as Custom
A = 1
B = 2
function AandB
return This.A + This.B
endFunc
endDefine
&&
function FindC(a, b, oAB)
oAB.A = a
oAB.B = b
c = 0
for k = 1 to NTIMES
c = c + oAB.AandB( )
oAB.A = oAB.A + 1
oAB.B = oAB.B + 1
endFor
return c
endFunc
Для вывода результата использован следующий, помещенный в файл d:\goAProcInfo.prg код:
&& Файл d:\goAProcInfo.prg
&& Вызываем APROCINFO( ) с различными значениями параметра nType
for nType = 0 to 3
?
? 'nType = ', nType
&& Формируем массив arrayPRG
AProcInfo(arrayPRG, 'd:\ProcForProcInfo.prg', nType)
for iRow = 1 to Alen(arrayPRG, 1)
? && Переход на новую строку
&& Выводим элементы строки iRow массива на одной строке окна вывода
for iCol = 1 to Alen(arrayPRG, 2)
?? arrayPRG(iRow, iCol), ' '
next
next
next
Результат:
nType = 0 (элементы) |
|||
NTIMES |
3 |
Define |
0 |
APlusB AS Custom |
10 |
Class |
0 |
APlusB.AandB |
13 |
Procedure |
0 |
findC |
18 |
Procedure |
0 |
nType = 1 (класс) |
|||
APlusB |
10 |
Custom |
|
nType = 2 (процедура) |
|||
APlusB.AandB |
13 |
||
nType = 3 (директива) |
|||
NTIMES |
3 |
Define |
Функция ASCAN(ArrayName, eExpression [, nStartElement [, nElementsSearched [, nSearchColumn [, nFlags]]]]) ищет в массиве ArrayName элемент равный eExpression. В случае удачи возвращает номер первого найденного элемента (или номер строки массива); возвращает 0, если поиск не дал результатов. Если нужно независимо использовать параметр nSearchColumn, то для nStartElement и nElementsSearched задаются отрицательные значения. Если нужно независимо использовать параметр nFlags, то вдобавок значение nSearchColumn устанавливается меньшим нуля.
Как и в других функциях значения параметров не должны приводить к нарушению границ массива.
В случае символьных данных по умолчанию поиск чувствителен к регистру имеющихся в eExpression букв.
Параметры:
eExpression – значение для поиска. Возможен любой тип данных.
nStartElement – номер элемента, с которого начинается поиск. В случае двумерного массива номер элемента по его индексам можно получить, употребив AELEMENT( ). При отсутствии параметра поиск ведется с первого элемента.
nElementsSearched – число просматриваемых элементов. При отсутствии параметра поиск ведется вплоть до последнего элемента.
nSearchColumn – номер столбца, в котором ведется поиск. Полезен, в частности, при работе с массивом, созданным функцией AFIELDS( ). Если параметр меньше нуля или равен ему, то поиск ведется во всем массиве (с учетом ограничений, устанавливаемых nStartElement и nElementsSearched). Если положителен, то поиск ведется в столбце nSearchColumn начиная с элемента nStartElement; число участвующих в поиске элементов равно nElementsSearched. Так, в случае массива twoDArray формы 3×4 вызов Ascan(twoDArray, 9, 2, 2, 3) обеспечит поиск равных числу 9 элементов в третьем столбце среди второго и третьего элементов столбца. Вызов Ascan(twoDArray, 9, 2, 3, 3) недопустим, поскольку приводит к нарушению верхней границы третьего столбца.
nFlags – задает дополнительные условия поиска. Принимает значения от 1 до 15 включительно. При наличии параметра функция ASCAN( ) интерпретирует в соответствии с табл. 8 каждый бит параметра.
Таблица 8
Биты параметра nFlags
Бит |
Условия поиска, если значение бита равно 1 |
0 |
Поиск нечувствителен к регистру |
1 |
При поиске SET EXACT установлен в ON; действует, если 2-й бит имеет значение 1 |
2 |
Позволяет изменять (на время поиска) системную EXACT-настройку; если значение бита 0, то при поиске используется системная EXACT-настройка |
3 |
В случае двумерного массива функция ASCAN( ) возвращает номер первой строки, имеющей искомый элемент |
Полный перечень возможных условий поиска приведен в табл. 9.
Таблица 9
Условия поиска, задаваемые параметром nFlags
nFlags |
Биты |
Описание |
0 |
0000 |
Ищет по правилам, существовавшим в VFP версии 6 и в более ранних версиях |
1 |
0001 |
Нечувствителен к регистру |
2 |
0010 |
Ищет по правилам, существующим начиная с версии 7 VFP |
3 |
0011 |
Нечувствителен к регистру |
4 |
0100 |
Exact OFF |
5 |
0101 |
Нечувствителен к регистру, EXACT OFF |
6 |
0110 |
EXACT ON |
7 |
0111 |
Нечувствителен к регистру, EXACT ON |
8 |
1000 |
Возвращает номер строки |
9 |
1001 |
Нечувствителен к регистру, возвращает номер строки |
10 |
1010 |
Возвращает номер строки |
11 |
1011 |
Нечувствителен к регистру, возвращает номер строки |
12 |
1100 |
Возвращает номер строки, EXACT OFF |
13 |
1101 |
Нечувствителен к регистру, возвращает номер строки, EXACT OFF |
14 |
1110 |
Возвращает номер строки, EXACT ON |
15 |
1111 |
Нечувствителен к регистру, возвращает номер строки, EXACT ON |
Пример 1. В одном и том же массиве для найденного элемента сначала возвращается его номер, а затем номер строки.
n = 3
dimension twoDArray(n, n)
for iCol = 1 to n
for iRow = 1 to n
twoDArray(iCol, iRow) = iCol
next
next
&& Массив twoDArray
&& |
1 |
1 |
1 |
&& |
2 |
2 |
2 |
&& |
3 |
3 |
3 |
&& Функция вернет номер элемента
for iCol = 1 to n
?? Ascan(twoDArray, iCol) && Напечатает: 1 4 7
next
?
&& Функция вернет номер строки
for iCol = 1 to n
?? Ascan(twoDArray, iCol, –1, –1, –1, 8) && Напечатает: 1 2 3
next
Функция ASELOBJ(ArrayName, [ 1 | 2 | 3 ]) помещает сведения о текущем элементе управления или контейнере, определенном в проектировщике формы или класса, в массив ArrayName.
При вызове без второго параметра в массив ArrayName заносятся ссылки на выбранные элементы управления. Тип ссылки – Object. Число элементов массива равно числу выбранных элементов управления.
Возвращает 1 при успешном выполнении или 0 – в противном случае.
Параметр:
1 – формируется массив из одного элемента, содержащего ссылку на контейнер выбранного элемента управления.
2 – формируется массив из одного элемента, содержащий ссылку на объект DataEnvironment выбранной формы. Получив эту ссылку, можно, например, изменить свойства объекта.
3 – формирует массив из трех элементов, содержащий контекст текущего окна редактирования данных: ссылка на контейнер объекта, полное имя SCX- или VCX-файла и имя INCLUDE-файла, если таковой имеется.
Функция ASESSIONS(ArrayName) формирует одномерный массив ArrayName, содержащий номера сессий данных. Возвращает число сессий данных. Пример см. в разд. 2.5.12.
Функция ASORT(ArrayName [, nStartElement [, nNumberSorted [, nSortOrder [, nFlags]]]) сортирует элементы массива ArrayName в возрастающем или убывающем порядке. Все участвующие в сортировке элементы должны быть одного типа. Возвращает 1, если сортировка выполнена, или –1 – в противном случае.
Параметры:
nStartElement – задает элемент, с которого начинается сортировка. Если параметр опущен, то массив сортируется начиная с первого элемента. В случае одномерного массива он сортируется начиная с элемента под номером nStartElement. В случае двумерного массива nStartElement определяет строку, в которой начинается сортировка, и столбец, элементы которого сортируются. При сортировке состав каждой строки сохраняется.
Пример. Сортируется по возрастанию двумерный массив формы 4×3 начиная с 4-го элемента, то есть элемента с индексами (2, 1).