Функции для массивов Visual FoxPro
« Назад Все рассматриваемые в разделе функции имеют параметр 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
|
&& Массив 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 ) "AUTHORS"
"BOOKS"
"BOOKSCONTENT"
"BOOKSAUTHORS"
"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
Содержимое строки массива, формируемого ADIR( )
Номер столбца |
Что содержит |
Тип данных |
1 |
Имя файла |
Character |
2 |
Размер файла |
Numeric |
3 |
Дату последнего изменения файла |
Date |
4 |
Время последнего изменения файла |
Numeric |
5 |
Атрибуты файла |
Character |
В строке с атрибутами файла могут находиться следующие символы:
-
A – архивный (чтение / запись);
-
H – скрытый;
-
R – только чтение;
-
S – системный;
- D – директория.
Параметры:
cFileSkeleton – маска, задающая критерии отбора файлов; может содержать символы * и ?. Если директория и диск в маске не указаны, то в ADIR( ) помещает в массив информацию о файлах, имеющихся в текущей директории и удовлетворяющих заданным критериям отбора. Тип маски – Character.
cAttribute – может содержать любую комбинацию символов D, H, S и V, задающую следующие условия отбора:
D – в массив отбираются удовлетворяющие маске имена поддиректорий;
H – в массив отбираются скрытые файлы;
S – в массив отбираются системные файлы;
V – в массиве будет только один элемент, содержащий имя тома, на котором расположена директория по умолчанию. Например, для диска с: на вкладке "Общие" диалога задания свойств диска может быть указано имя SYS.
В директории по умолчанию поддиректории, скрытые или системные файлы заносятся в массив, если для cFileSkeleton указана пустая строка, а для cAttribute соответствующая комбинация символов D, H и S.
nFlag – может принимать следующие значения:
-
0 – в массив заносятся полные имена файлов и поддиректорий, все буквы имен прописные;
-
1 – то же, что и в случае 1, но регистр букв сохраняется;
-
2 – имена заносятся в соответствии с правилами DOS (не более 8-и символов для имени и 3-х для расширения).
Пример 1. Выводятся имена имеющихся на диске с: поддиректорий, системных и скрытых файлов.
&& Устанавливаем директорию по умолчанию
set default to c:
Adir(fileArray, "", "SDH")
&& Печатаем состав массива fileArray
display memory like fileArray
Пример 2. Выводятся имена имеющихся на диске d: файлов с программами VFP.
Adir(fileArray, "d:\*.prg")
display memory like fileArray
Функция
ADLLS(ArrayName)
формирует двумерный массив ArrayName, содержащий имена функций, загруженных командой DECLARE – DLL. В каждой строке массива ее первый элемент содержит имя функции, второй – псевдоним функции, третий – имя библиотеки. Тип данных – Character. Функция возвращает число строк результирующего массива.
Функция
ADOCKSTATE(ArrayName [, nType | nExtended])
заносит в массив ArrayName вариант прикрепления всех прикрепляемых IDE-окон и панелей инструментов, как системных, так и пользовательских (IDE – integrated development environment). Функция возвращает число строк в результирующем массиве.
Содержимое каждой строки массива описано в табл. 6.4.
Таблица 6.4
Содержимое строки массива, формируемого ADOCKSTATE( )
Номер |
Что содержит |
Тип |
1 |
Имя IDE-окна или панели инструментов. В случае пользовательской панели инструментов содержит значение ее свойства Caption |
Character |
2 |
Вариант прикрепления (1 – прикрепленное, 0 – нет) |
Numeric |
3 |
Позиция прикрепления; возможны следующие значения: –1 – контейнер не прикреплен; 0 – верхнее прикрепление; 1 – левое, 2 – правое; 3 – нижнее; 4 – вложенное. Позиция указывается относительно окна, имя которого хранит первый элемент строки |
" |
4 |
Само окно или имя окна, к которому прикреплено рассматриваемое окно в случае смежного или вложенного прикрепления. Для панелей инструментов и окон, прикрепленных к главному окну VFP, содержит имя главного окна, хранимое свойством Caption объекта _VFP. Если панель инструментов появляется между главным окном VFP и прикрепленным к нему окном, то элемент содержит имя панели инструментов. При отсутствии прикрепления содержит пустую строку |
Character |
5 |
Ссылка на прикрепляемое окно или панель инструментов. Заполняется, только когда прикрепляется пользовательское окно или панель инструментов. В случае IDE-окна этот элемент содержит пустую строку |
Object |
6 |
Ссылка на пользовательское или главное окно VFP окно, к которому выполняется прикрепление. В последнем случае элемент месива содержит ссылку на системную переменную _SCREEN. В случае IDE-окна элемент содержит пустую строку |
Object |
Параметры:
nType – задает вид возвращаемого результата:
-
0 – возвращаются данные для всех окон (по умолчанию);
-
1 – возвращает данные только для IDE-окон;
-
2 – возвращает данные только для панелей инструментов;
- 3 – возвращает данные только определенных пользователем форм.
nExtended – задает число столбцов в массиве:
-
0 – формирует массив с 4-я столбцами для окон и панелей инструментов;
- 1 – формирует массив с 6-ю столбцами для форм;
При вложенном прикреплении VFP левое окно содержит сведения о прикреплении всего контейнера; порядок обхода окон – слева направо.
При смежном прикреплении верхнее левое окно содержит сведения о прикреплении всего контейнера; окна обходятся начиная с верхнего левого окна.
При наличии окон как со смежным, так и с вложенным прикреплениями, прежде обходятся окна со смежным прикреплением, затем с вложенным.
Пример. Выполняется вложенное прикрепление окон Command и View (View – старое название окна Data Session, до сих пор используемое в функциях WONTOP( ) и ADOCKSTATE( ) и командах HIDE WINDOW и ACTIVATE WINDOW).
clear all
&& Активизируем окна Command и View
activate window Command
set view on
&& Отменяем возможное прикрепление активизированных окон
dock window Command position –1
dock window View position –1
&& Создаем вложенное прикрепления окон Command и View,
&& располагая окно Command слева (рис. 6.1)
dock window Command position 4 window View
ADockState(arrayDockState, 1)
&& Состав массива arrayDockState приведен в табл. 6.5
Рис. 6.1. Вложенное прикрепление окон Command и View
Таблица 6.5
Состав массива arrayDockState
Строка |
Номер столбца |
|||
1 |
2 |
3 |
4 |
|
1 |
Command |
1 |
–1 |
– |
2 |
View |
1 |
4 |
Command |
Функция
AELEMENT(ArrayName, nRowSubscript [, nColumnSubscript])
возвращает номер элемента массива ArrayName по значениям индексов элемента. Если значения индексов превышают протяженности по соответствующим измерениям, то возникнет ошибка исполнения. Номер элемента может быть использован для обращения к двумерному массиву по номеру (то есть как к одномерному), а не по индексам. Индексы элемента по его номеру определяются функцией ASUBSCRIPT( ).
Параметры:
nRowSubscript – в случае двумерного массива номер строки, в которой расположен элемент; в случае одномерного массива – номер элемента, то есть результат функции.
nColumnSubscript – номер столбца, в котором расположен элемент.
Пример:
dimension twoDArray(3, 4)
? Aelement(twoDArray, 2, 3) && Напечатает: 7
? Asubscript(twoDArray, 7, 1) && Напечатает: 2
? Asubscript(twoDArray, 7, 2) && Напечатает: 3
Функция
AERROR(ArrayName)
создает массив ArrayName, содержащий сведения о последней ошибке VFP, OLE или ODBC. Массив имеет 7 столбцов. Функция возвращает число строк в созданном массиве. Это число зависит от вида возникшей ошибки.
При возникновении ошибки VFP, OLE или ODBC в столбцах 1 – 7 каждой строки массива находятся приведенные в табл. 6.6. данные.
Таблица 6.6
Значения элементов массива ArrayName, созданного AERROR( )
Элемент |
Что содержит |
Ошибка VFP |
|
1 |
Номер ошибки, такой же, что и возвращаемый функцией ERROR( ) |
2 |
Текст сообщения об ошибке, такой же, что и возвращаемый функцией MESSAGE( ) |
3 |
NULL или параметр ошибки, такой же, что и возвращаемый функцией SYS(2018) |
4 |
NULL или номер рабочей области, в которой ошибка произошла |
5 |
NULL или, если триггер отказал (ошибка 1539), одно из следующих значений: |
6, 7 |
NULL |
Ошибка OLE (номера ошибок в VFP 1427 или 1429) |
|
1 |
Номер ошибки (число 1427 или 1429) |
2 |
Текст VFP-сообщения об ошибке |
3 |
Текст OLE-сообщения об ошибке |
4 |
Имя приложения, например Microsoft Excel |
5 |
NULL или имя Help-файла приложения, содержащего сведения об ошибке |
6 |
NULL или ID (тип – Character) соответствующей темы в Help-файле |
7 |
Номер исключения OLE; тип – Numeric |
Ошибка ODBC (номер ошибки в VFP 1526) |
|
1 |
Номер ошибки (число 1526) |
2 |
Текст VFP-сообщения об ошибке |
3 |
Текст ODBC-сообщения об ошибке |
4 |
Текущее ODBC SQL-состояние; тип – Character |
5 |
Номер ошибки ODBC-источника данных |
6 |
Номер идентификатора соединения ODBC |
7 |
NULL |
Функция
AEVENTS(ArrayName [, 0 | 1 | oEventObject])
формирует массив ArrayName, содержащий описание события и связанного с ним метода. Возвращает число связываний событий (связывание события объекта – это задание метода некоторого класса в качестве обработчика события).
Параметры:
0 – функция AEVENTS( ) возвращает одномерный массив из 3-х элементов, содержащий приведенные в табл. 6.7 значения.
Таблица 6.7
Элементы массива ArrayName, когда второй параметр равен 0
Элемент |
Что содержит |
Тип |
1 |
Объект-источник события |
Object |
2 |
Событие |
Character |
3 |
Тип события или как событие вызвано: |
Integer |
Если событие является свойством, значение третьего элемента равно 1 или 2. Причем оно равно 2, если значение свойства устанавливается.
1 – функция AEVENTS( ) возвращает двумерный массив с 4-я столбцами, содержащий информацию о сообщении Windows. Массив содержит одну строку для каждого связывания. Элементы строки массива описаны в табл. 6.8.
Таблица 6.8
Элементы массива ArrayName, когда второй параметр равен 1
Элемент |
Что содержит |
Тип |
1 |
hWnd |
Integer |
2 |
Сообщение Windows |
Integer |
3 |
Ссылка или идентификатор |
Ссылка на объект |
4 |
Имя связанного метода |
Character |
oEventObject – ссылка на объект, содержащий метод, установленный в качестве обработчика события (привязанный к событию). При задании параметра AEVENTS( ) возвращает двумерный массив с 5-ю столбцами, содержащими приведенный в табл. 6.9 сведения.
Таблица 6.9
Содержимое строки массива ArrayName, когда задан параметр oEventObject
Номер |
Что содержит |
Тип |
1 |
.T., если второй элемент – это источник события; |
Logical |
2 |
Источник события, если oEventObject – это идентификатор события, или идентификатор события, если oEventObject – это источник события |
Ссылка на объект |
3 |
Событие |
Character |
4 |
Метод, связанный с событием |
" |
5 |
Флаг функции BINDEVENT( ) |
Integer |
Массив ArrayName не изменяется (или не создается), если
-
не существует указанного события;
-
второй параметр равен 0, а AEVENTS( ) вызывается не в момент возникновения события или oEventObject не имеет связанных событий.
Пример. Создается класс OneButtonForm, содержащий один объект – кнопку. Обработчик события Click этой кнопки закрывает, выполняя метод Release, форму. С событием Click кнопки CommandClose формы связывается метод SayWord объекта oHandler типа Inf. При возникновении события Click форма закрывается, однако прежде выполняется метод SayWord: вызывается функция MESSAGEBOX( ), сообщающая "Форма <имя формы> будет закрыта!".
&& Идентификаторы объектов объявляем как PUBLIC
public oForm, oHandler
&& Создаем объект класса OneButtonForm и определяем его свойства:
&& размеры, автоматическое центрирование и видимость
oForm = CreateObject("OneButtonForm")
with oForm
.Width = 300
.Height = 100
.AutoCenter = .T.
.Visible = .T.
&& Определяем свойства кнопки формы: заголовок, размеры и координаты
&& Кнопка в форме центрируется как по горизонтали, так и по вертикали
with .CommandClose
.Caption = "Закрыть"
.Width = 84
.Height = 27
.Left = (oForm.Width – .Width) / 2
.Top = (oForm.Height – .Height) / 2
endWith
endWith
&& Создаем объект типа Inf
oHandler = CreateObject("Inf")
&& Связываем событие Click объекта oForm.CommandClose
&& с процедурой SayWord объекта oHandler
BindEvent(oForm.CommandClose, "Click", oHandler, "SayWord")
&& Формируем массив arrayEvent, содержащий информацию о связанном событии
Aevents(arrayEvent, oHandler)
&& Создаем класс OneButtonForm – форму с одной кнопкой
define class OneButtonForm as Form
add object CommandClose as CommandButton
&&
&& Обработчик события Click кнопки формы
procedure CommandClose.Click
ThisForm.Release
endProc
endDefine
&& Создаем класс Inf, процедура SayWord которого будет выполняться
&& при нажатии на кнопку "Закрыть" формы OneButtonForm
define class Inf as Custom
procedure SayWord
MessageBox("Форма " + _Screen.ActiveForm.Name + " будет закрыта!")
endProc
endDefine
После запуска программы и нажатия на кнопку "Закрыть" на экране появятся 2 окна (рис. 6.2).
Рис. 6.2. Вызвана процедура SayWord
Массив arrayEvent, сформированный AEVENTS( ), содержит следующие данные:
.T. (Object) CLICK SAYWORD 0
Функция
AFIELDS(ArrayName [, nWorkArea | cTableAlias])
размещает в массиве ArrayName информацию о структуре таблицы и возвращает число полей в таблице. Результирующий массив содержит 18 столбцов. Число строк массива равно числу полей таблицы.
Параметры:
nWorkArea – номер рабочей области исследуемой таблицы.
cTableAlias – псевдоним исследуемой таблицы.
Если второй параметр опущен, то в массиве будет размещена информация о таблице в текущей рабочей области. Если в ней таблица не открыта, появится соответствующий диалог открытия файлов.
Содержимое каждой строки массива описано в табл. 6.10; значения в столбцах 10 – 16 появляются только в первой строке массива.
Таблица 6.10
Содержимое строки массива, формируемого AFIELDS( )
Номер столбца |
Что содержит |
Тип данных |
1 |
Имя поля |
Character |
2 |
Символ, характеризующий тип поля (C – Character, D – Date, L – Logical, M – Memo, N – Numeric, F – Float, I – Integer, B – Double, Y – Currency, T – DateTime, G – General, Q – Varbinary, V – Varchar and Varchar (Binary), W – Blob) |
" |
3 |
Длина поля |
Numeric |
4 |
Число десятичных знаков |
" |
5 |
Разрешение для NULL-значения |
Logical |
6 |
Запрет на изменение кодовой страницы |
" |
7 |
Выражение проверки поля |
Character |
8 |
Текст проверки поля |
" |
9 |
Значение поля по умолчанию |
" |
10 |
Выражение проверки таблицы |
" |
11 |
Текст проверки таблицы |
" |
12 |
Длинное имя таблицы |
" |
13 |
Выражение триггера вставки |
" |
14 |
Выражение триггера обновления |
" |
15 |
Выражение триггера удаления |
" |
16 |
Комментарий таблицы |
" |
17 |
Следующее значение автоматически увеличиваемого поля |
Numeric |
18 |
Шаг для автоматического увеличения значения поля |
" |
Замечание. Аналогичная информация содержится в полях таблицы, получаемой командой COPY STRUCTURE EXTENDED. Используя эти данные новая таблица создается командой CREATE FROM.
Функция
AFONT(ArrayName [, cFontName [, nFontSize | nFontCharSet [, nFlags]]])
помещает информацию о доступных шрифтах в массив ArrayName. Возвращает .T., если массив благополучно сформирован, или .F. – в противном случае. Формируемый массив является одномерным. Если задан только параметр ArrayName, то массив заполнится именами доступных шрифтов.
Параметры:
cFontName – имя шрифта, информация о котором помещается в массив. Если шрифт недоступен, то AFONT( ) вернет .F. Если шрифт может принимать дискретные размеры (8, 10, …), то массив будет заполнен возможными значениями размеров шрифта, число элементом массива будет равно числу возможных размеров шрифта. Если шрифт поддерживает дробные размеры, то массив будет состоять из 1-го элемента, равного –1. Тип параметра – Character.
nFontSize – задает размер шрифта cFontName (nFlags отсутствует или равен нулю). Если указанный параметром nFontSize размер шрифта возможен, то массив будет иметь 1 равный .T. элемент иAFONT( ) вернет .T. Если же невозможен, то массив сформирован не будет и AFONT( ) вернет .F. Если параметр отсутствует или равен –1, то массив в случае дискретного шрифта cFontName заполнится возможными значениями его размеров, в случае недискретного в массиве будет 1 равный –1 элемент. Тип параметра – Numeric.
nFontCharSet – задает набор символов шрифта cFontName (nFlags отличен от нуля). Если указанный параметром nFontCharSet набор символов возможен, то массив будет иметь 1 равный .T. элемент иAFONT( ) вернет .T. Если же невозможен, то массив сформирован не будет и AFONT( ) вернет .F. Тип параметра – Numeric.
nFlags – если отсутствует или равен 0, то третий параметр интерпретируется как nFontSize, и – как nFontCharSet – в противном случае. Если nFlags отличен от нуля и nFontCharSet равен –1, то массив заполняется возможными наборами шрифтов.
Замечание. Для выбора шрифта или просмотра списка возможных шрифтов используется функция GETFONT( ).
Пример. Выводятся имена всех дискретных шрифтов. Для первого дискретного шрифта выводятся допустимые размеры и номера доступных наборов символов.
&& Помещаем имена доступных шрифтов в массив fontNamesArray
if Afont(fontNamesArray) then
firstDFont = .T.
for fontNumber = 1 to Alen(fontNamesArray)
&& Имя шрифта
fontName = fontNamesArray(fontNumber)
&& Помещаем информацию о возможных размерах шрифта в массив fontSizeArray
Afont(fontSizeArray, fontName)
f fontSizeArray(1) != –1 then
&& Печатаем имя дискретного шрифта
? fontName
if firstDFont then
firstDFont = .F.
&& Для первого дискретного шрифта массива fontNamesArray
&& печатаем возможные размеры
display memory like fontSizeArray
&& Затем печатаем номера возможных наборов символов
Afont(fontSetArray, fontName, –1, 1)
display memory like fontSetArray
endif
endif
endFor
endif
Возможный результат:
Courier
FONTSIZEARRAY |
|
|
|
Priv |
A |
test |
|
( 1) |
N |
10 |
( 10.00000000) |
( 2) |
N |
12 |
( 12.00000000) |
( 3) |
N |
15 |
( 15.00000000) |
FONTSETARRAY |
|
|
|
Priv |
A |
test |
|
( 1) |
N |
204 |
( 204.00000000) |
Fixedsys
FoxFont
FoxPro Window Font
MS Sans Serif
MS Serif
Small Fonts
System
Terminal
В представленном результате Priv является сокращением Private.
Функция
AGETCLASS(ArrayName [, cLibraryName [, cClassName [, cTitleText
[, cFileNameCaption [, cButtonCaption]]]]])
отображает библиотеки классов и диалоге "Открыть" и создает одномерный массив ArrayName из двух элементов. Первый элемент массива содержит имя выбранной библиотеки классов, второй – имя выбранного класса. Возвращает .T., если класс выбран, или .F. – в противном случае.
Параметры:
cLibraryName – имя библиотеки классов, выбираемой в диалоге при его открытии. Параметр cLibraryName может быть именем визуальной (VCX) или программной (PRG) библиотеки классов или именем библиотеки базовых классоы. Если указано неверное имя или если cLibraryName – это пустая строка или NULL-значение, то возникнет ошибка исполнения.
cClassName - имя класса, выбираемого в списке классов при открытии диалога. Если класса с заданным именем нет, то в списке будет выбран первый класс. Если cLibraryName – это NULL-значение, то возникнет ошибка исполнения.
cTitleText – заголовок диалога "Открыть".
cFileNameCaption – заголовок поля ввода имени файла.
cButtonCaption – заголовок кнопки OK.
Пример. Открывается диалог выбора класса из библиотеки классов. Если выбран класс _arraylib из библиотеки классов _utility.vcx, то из двумерного массива формы 3´4 методом DelAitem класса _arraylib удаляется 2-я строка. Метод использует функцию ADEL( ), но в отличие от нее изменяет после удаления соответствующим образом форму массива.
&& Открываем диалог выбора класса
ClassLibraryName = 'c:\Program Files\Microsoft Visual FoxPro 9\Ffc\_utility.vcx'
AGetClass(
aClassLib, ClassLibraryName, ;
"_arraylib", 'Выбор класса', 'Имя файла класса:', 'Выбрать')
&& Проверяем, выбран ли класс _arraylib
if AClassLib(2) = '_arraylib'
declare someArray(3, 4)
&& Инициализация массива
for k = 1 to 12
someArray(k) = k
endFor
&& Открываем библиотеку классов,
&& используя выражение с именем (aClassLib(1))
set classlib to (aClassLib(1)) alias utility
&& Создаем объект типа _arrayLib
oHandler = CreateObject('utility._arrayLib')
&& Удаляем 2-ю строку массива; массив передаем по ссылке
oHandler.DelAitem(@someArray, 2)
display memory like someArray
endif
Код метода DelAitem можно просмотреть, открыв соответствующую библиотеку:
modify class (AClassLib(2)) of (AClassLib(1))
Функция
AGETFILEVERSION(ArrayName, cFileName)
создает одномерный массив ArrayName, помещая в него информацию о файле cFileName. Тип параметра cFileName – Character. Функция возвращает размер сформированного массива ArrayName. Если файл cFileName не существует или не имеет версию Windows-ресурсов, функция вернет 0; массив ArrayName не будет создан или останется неизмененным.
Функция AGETFILEVERSION( ) используется для получения информации о файлах, содержащих версию Windows-ресурсов, таких, как EXE, DLL и FLL или файлов автоматизации, созданных в VFP.
Файл автоматизации будет иметь версию Windows-ресурсов, если в диалоге Project – Build – Version указан хотя бы 1 пункт.
Элементы массива ArrayName содержат следующие данные:
1 – комментарий;
2 – имя компании;
3 – описание файла;
4 – версия файла;
5 – внутреннее имя;
6 – права;
7 – торговая марка;
8 – оригинальное имя файла;
9 – частное построение;
10 – имя продукта;
11 – версия продукта; формат этой величины зависит от версии VFP; детали см. в описании функции VERSION( );
12 – специальное построение;
13 – OLE-саморегистрация, если файл поддерживает саморегистрацию, или пустая строка – в противном случае;
14 – язык;
15 – код трансляции.
Пример:
fileName = "c:\Program Files\Microsoft Visual Studio\DF98\BIN\DF.EXE"
if AGetFileVersion(aFiles, fileName) > 0 then
for k = 1 to Alen(aFiles)
? k, " ", aFiles(k)
next
endif
Результат:
1
2 Compaq Computer Corporation
3 Compaq Visual Fortran Compiler Driver
4 6.6 - 1877 (Update A)
5 Compaq Visual Fortran 6.6-1877
6 Copyright 2001 Compaq Computer Corp.
7
8 df.exe
9
10 Compaq Visual Fortran
11 6.6 (Update A)
12
13
14 Английский (США)
15 040904b0
Замечание. В сокращенном варианте имя AGETFILEVERSION должно иметь не менее 5-и символов.
Функция
AINS(ArrayName, nElementNumber [, 2])
вставляет в массив ArrayName элемент, если массив одномерный, или строку или столбец, если массив двумерный.
Добавление элемента (строки, столбца) не изменяет формы массива. При вставке элементы сдвигаются по направлению к концу массива последний элемент (строка, столбец) из массива выпадают. Новый элемент или элементы новой строки (столбца) имеют значения .F.
Возвращает 1, если действие выполнено, или 0 – в противном случае.
Параметр:
nElementNumber – задает положение вставляемого элемента (строки, столбца). В случае одномерного массива новый элемент вставляется перед элементом nElementNumber. В случае двумерного массива новая строка (столбец) вставляется перед строкой (столбцом) с номером nElementNumber. При таком способе вставки номер нового элемента (строки, столбца) равен nElementNumber.
2 – обеспечивает в случае двумерного массива вставку столбца. При отсутствии параметра вставляется строка.
Пример. В массив oneDArray вставляется элемент, а в массив twoDArray – строка, а затем столбец. Значения новых элементов выводятся на экран.
dimension oneDArray(7), twoDArray(3, 4)
if set("COMPATIBLE") = "ON" then
set compatible off
endif
store .T. to oneDArray, twoDArray
nElementNumber = 2
&& Вставка второго элемента в одномерный массив oneDArray
Ains(oneDArray, nElementNumber)
? oneDArray(nElementNumber) && Напечатает: .F.
&& Переходим в окне вывода на новую строку
?
&& Вставка второй строки в двумерный массив twoDArray
aIns(twoDArray, nElementNumber)
&& Выводим значения элементов во вставленной строке
for iCol = 1 to 4
?? twoDArray(2, iCol) && Напечатает: .F. .F. .F. .F.
endFor
?
&& Вставка второго столбца в двумерный массив twoDArray
Ains(twoDArray, nElementNumber, 2)
&& Выводим значения элементов во вставленном столбце
for iRow = 1 to 3
?? twoDArray(iRow, 2) && Напечатает: .F. .F. .F.
endFor
Функция
AINSTANCE(ArrayName, cClassName)
размещает в массиве ArrayName информацию об экземплярах класса cClassName, созданных функциями CREATEOBJECT( ) или NEWOBJECT( ). Возвращает число элементов в сформированном массиве.
В качестве имени класса может быть указано имя как базового класса, так и созданного пользователем. Имена базовых классов VFP см. в табл. 13.2.
Пример.
public oFormA, oFormB
oFormA = CreateObject("OneButtonForm")
oFormB = CreateObject("OneButtonForm")
oFormA.Show
&& Формируем массив arrayIns
Ainstance(arrayIns, "OneButtonForm")
wait arrayIns(1) + ', ' + arrayIns(2) window
&& Создаем класс OneButtonForm – форму с одной кнопкой
define class OneButtonForm as Form
…
endDefine
Сообщение WAIT WINDOW: |
|
Функция
ALANGUAGE(ArrayName, nType)
формирует массив ArrayName, содержащий имена всех доступных в VFP команд, функция, базовых классов или DBC-событий. Содержание и форма результирующего массива определяются параметром nType. Варианты возвращаемых результатов приведены в табл. 6.11.
Таблица 6.11
Значения параметра nType и варианты возвращаемых результатов
nType |
Вид |
Число измерений |
Содержание элемента (строки) |
1 |
Команды |
1 |
Имя команды, например WAIT |
2 |
Функции |
2 |
Первый элемент содержит имя функции, второй – строку вида [M] nParamR [- nParamT], |
3 |
Базовые классы |
1 |
Имя базового класса, например ComboBox |
4 |
DBC-события |
1 |
Имя DBC-события, не содержащее префикса DBC_ |
Замечание. Информация об объектах формируется функцией AMEMBERS( ).
Пример. Печатаются имена всех функций 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 |
GETINTERFAC |
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 |
Включает символы конца строки в массив |
Замечание. В предшествующих версиях употреблялся параметр lTrim, соответствующий, если задан и равен .T., в версии 9.0 nFlags = 1.
[cParseChar [, cParseChar2 [, …]]] – задают одну или более символьных строк, используемых в качестве символов конца строки в cExpression, копируемой в элемент массива ArrayName. Максимальное число допустимых строк в cParseChar – 23. Максимальная длина каждой из них – 11 символов.
По умолчанию конец строки задается символом CHR(10) или символом новой строки – CHR(13), или комбинацией этих символов – CHR(10) + CHR(13) или CHR(13) + CHR(10). Если параметр cParseChar задан, то символы CHR(10) и CHR(13) в копируемой строке cExpression игнорируются, если только они не указаны в cParseChar как завершающие.
Если для работы ALINES( ) не хватит свободной памяти, то возникнет ошибка исполнения.
Пример 1. В memo-поле MemoField первой записи таблицы Test.dbf находятся две строки:
Это memo-поле
и его вторая строка
Следующая программа формирует массивы arrayOfLines и arrayOfWords, содержащие соответственно строки-слова этого memo-поля.
if not Used('Test') then
use d:\HomeLibrary\Test in 0
else
select Test
go top
endif
Alines(arrayOfLines, Test.MemoField)
for each elem in arrayOfLines
? elem
next
&& Используем в качестве завершающих строку символов
&& CHR(10) – символ конца строки и символ пробела CHR(32)
Alines(arrayOfWords, Test.MemoField, 1, Chr(10), Chr(32))
for each word in arrayOfWords
? word
next
Результат:
Массив arrayOfLines
(1) Это memo-поле
(2) и его вторая строка
Массив arrayOfWords
(1) Это
(2) memo-поле
(3) и
(4) его
(5) вторая
(6) строка
Пример 2. Исходная строка разбивается на подстроки, помещаемые в массив arrayOfLines. Для выделения подстрок выбраны символы 'A', 'D' и 'G', каждый из которых рассматривается ALINES( ) как символ, завершающий строку в исходном выражении.
Alines(arrayOfLines, 'aAbcDefGhiDjk', .F., 'D', 'A', 'G')
Результат (в исходном выражении обнаружено 5 строк):
(1) a
(2) bc
(3) ef
(4) hi
(5) jk
Пример 3. Создается функция ShortName, формирующая по фамилии имени и отчеству (параметр fullName) строку, состоящую из фамилии и инициалов. Например, если fullName – это "Николаев Сергей Иванович", то результатом функции будет строка "Николаев С. И.".
? ShortName("Николаев Сергей Иванович")
function ShortName(fullName)
if Empty(fullName) then
return ""
endif
&& Формируем массив из имеющихcя в строке fullName слов
&& Элементами массива могут быть пробелы, если между словами не один,
&& а несколько пробелов
Alines(aWords, Alltrim(fullName), 1, ' ')
sAu = aWords(1) && Фамилию берем полностью
for k = 2 to Alen(aWords)
nextWordFirstLetter = Left(aWords(k), 1)
&& Пропускаем возможные пробелы
sAu = sAu + Iif(Empty(nextWordFirstLetter), "", " " + Left(aWords(k), 1) + ".")
next
&& Возвращаем фамилию с инициалами
return sAu
endFunc
Функция
AMEMBERS(ArrayName, oObjectName | cClassName
[, nArrayContentsID] [, cFlags])
записывает для заданного объекта или класса имена свойств, событий, методов и добавленных объектов в массив ArrayName. Возвращает число строк (если сформирован двумерный массив) или число элементов результирующего массива.
Параметры:
oObjectName | cClassName – имя объекта | класса, данные о котором заносятся в массив ArrayName.
nArrayContentsID – принимает значения 0 | 1 | 2 | 3, оказывающие следующее влияние:
-
0 – формируется одномерный массив с именами свойств объекта или класса. Тот же результат получается, если параметр nArrayContentsID опущен;
-
1 – формируется двумерный массив с двумя столбцам. Первый элемент строки содержит имя свойства, метода или добавленного объекта, второй – вид значения первого элемента: Property, Event, Method или Object.
-
2 – формируется одномерный массив, содержащий имена определенных в VFP объектов, добавленных в объект oObjectName, например, имена дочерних объектов (элементов управления) в форме.
- 3 – формируется двумерный массив из 4-х столбцов, содержащих приведенные в табл. 6.13 значения.
Таблица 6.13
Состав строки массива ArrayName, когда nArrayContentsID = 3
Номер столбца |
Что содержит |
1 |
Имя свойства, события или метода |
2 |
Вид значения первого элемента строки, например: Event, Method, Property, PropertyPut, PropertyGet, PropertyPutRef |
3 |
Если первый элемент – это событие или метод, то содержит имена параметров процедуры, или пустую строку – в противном случае |
4 |
Строка помощи |
Если nArrayContentsID = 3, то oObjectName может быть как объектом VFP, так и COM-объектом, например:
oExcel = CreateObject("Excel.Application")
Amembers(gaPropArray, oExcel, 3)
Замечание. Значение 3 для nArrayContentsID не может употребляться в APP- или EXE-приложениях.
cFlags – задает условия фильтрации данных. Не оказывает влияния, когда oObjectName – это идентификатор COM-объекта. Параметр задается как строка из следующих символов:
-
P – защищенные свойства, методы и события;
-
H – скрытые свойства, методы и события;
-
G – глобальные свойства, методы и события;
-
N – встроенные (предопределенные) свойства, методы и события;
-
U – определенные пользователем (внешние) свойства, методы и события;
-
C – измененные свойства, методы и события (кроме измененных свойств-массивов);
-
I – наследуемые свойства, методы и события;
-
B – собственные свойства (добавленные методом AddProperty), методы и события;
- R – свойства, с установленным флагом "Только для чтения".
Возможны следующие, не содержащие взаимно исключающих величин группировки значений параметра: [P | H | G], [N | U], [C] и [I | B] [R].
По умолчанию присутствующие в строке cFlags величины объединяются логической операцией "ИЛИ". После указания в строке символа "+" будет использоваться операция "И". Если в строку cFlags поместить дополнительно символ "#", то в массив ArrayName будет добавлен столбец, содержащий расшифровку cFlags для указанного в первом столбце значения.
Пример. Создаются 2 класса – родительский и дочерний. Функция AMEMBERS( ) используется для получения информации об объекте-экземпляре дочернего класса с выделением данных о собственных и наследуемых свойствах и методах.
&& Создаем объект типа VectorFunction
vFunc = CreateObject("VectorFunction")
&& Формируем массив arrayOfMembers с описанием объекта vFunc типа VectorFunction
nCount = Amembers(arrayOfMembers, vFunc, 3, "#IB")
for iRow = 1 to nCount
?
for iCol = 1 to Alen(arrayOfMembers, 2)
?? arrayOfMembers(iRow, iCol), " "
endFor
endFor
&&
&& Создаем родительский класс
define class VectorInit as Custom
arraySize = 1
&& Метод класса VectorInit
procedure InitArray(vect)
&& …
endProc
endDefine
&&
&& Создаем дочерний класс. VectorInit – имя класса-родителя
define class VectorFunction as VectorInit
function DotProduct(a, b)
&& …
endFunc
endDefine
Фрагмент результата (оформлен в виде табл. 6.14):
Таблица 6.14
Информация об объекте vFunc
Имя / Вид |
Параметры |
Строка помощи |
cFlags |
ADDOBJECT Method |
cName, cClass |
Adds an object to a container object at run time |
GRNI |
ADDPROPERTY Method |
cPropertyName, eNewValue |
Adds a new property to an object |
GRNI |
ARRAYSIZE Property |
|
|
GUI |
BASECLASS Property |
|
Specifies the name of the Visual FoxPro base class on which the referenced object is based |
GRNI |
CLASS Property |
|
Returns the name of the class that an object is based on |
GRNI |
… |
|
|
|
Функция
AMOUSEOBJ(ArrayName [, 1])
формирует массив ArrayName, содержащий данные о позиции мыши и объекте, на котором мышь позиционирована. Возвращает либо число 4 (число элементов в сформированном массиве), либо 0, если массив не сформирован. Последнее происходит, когда мышь позиционирована на не обрабатываемой AMOUSEOBJ( ) области.
Содержимое каждого элемента массива описано в табл. 6.15.
Таблица 6.15
Состав массива ArrayName
Номер столбца |
Что содержит в момент исполнения AMOUSEOBJ( ) |
Тип |
1 |
Ссылку на объект, на котором находится мышь |
Object |
2 |
Ссылку на контейнер объекта |
" |
3 |
x-координату мыши относительно контейнера объекта |
Numeric |
4 |
y-координату мыши относительно контейнера объекта |
" |
Первый и второй элементы могут содержать одинаковое значение, если мышь позиционирована на родовом контейнере, например на страничном блоке.
Необязательный параметр 1, если задан, обеспечивает передачу в массив информации относительно текущей формы (THISFORM). При этом второй элемент массива всегда содержит идентификатор текущей формы, третий и четвертый – координаты относительно текущей формы.
Функция AMOUSEOBJ( ) может быть также употреблена для определения положения мыши во время проектирования. Состав массива зависит от вида проектируемых объектов (табл. 6.16).
Таблица 6.16
Состав массива ArrayName для разных объектов проектирования
Проектируемые |
Номер |
Что содержит |
Форма и класс |
1 |
Ссылку на элемент управления |
2 |
Ссылку на объект формы |
|
3 и 4 |
Соответственно x- и y-координаты мыши относительно формы |
|
Диспетчер проекта |
1 и 2 |
Ссылку на объект проекта |
3 и 4 |
0 |
|
Главное окно VFP |
1 и 2 |
Ссылку на объект главного окна |
3 и 4 |
Соответственно x- и y-координату мыши относительно главного окна |
Замечание. Начало координат объекта располагается в его верхнем левом углу. Положительное направление оси x – вправо, оси y – вниз.
Пример. Создается форма с одной кнопкой, имеющей имя CommandMouse. При нажатии на кнопку первоначально функция AMOUSEOBJ( ) формирует массив arrayMouse, а затем вызываются обработчик SayXY события Click кнопки и метод SayObjects формы, выводящие соответственно координаты мыши и имена объектов – кнопки и формы. Для вызова процедур используются занесенные в массив arrayMouse идентификаторы этих объектов.
public oForm
oForm = CreateObject("OneButtonForm")
oForm.Show
&&
&& Создаем класс OneButtonForm – форму с одной кнопкой
define class OneButtonForm as Form
Width = 200
Height = 72
add object CommandMouse as CommandButton
CommandMouse.Caption = "Проба"
CommandMouse.Width = 84
CommandMouse.Height = 27
&& Помещаем кнопку в центре формы
CommandMouse.Left = (This.Width - This.CommandMouse.Width) / 2
CommandMouse.Top = (This.Height - This.CommandMouse.Height) / 2
&&
&& Обработчик события Click кнопки формы
procedure CommandMouse.Click
Amouseobj(arrayMouse)
if Amouseobj(arrayMouse) = 4 then
arrayMouse(1).SayXY(arrayMouse(3), arrayMouse(4))
arrayMouse(2).SayObjects(arrayMouse(1), arrayMouse(2))
endif
endProc
&&
&& Метод SayXY( ) кнопки формы
procedure CommandMouse.SayXY(x, y)
wait 'x = ' + Transform(x) + '; y = ' + Transform(y) window
endProc
&&
&& Метод SayObjects формы
procedure SayObjects(objButton, objForm)
wait objButton.Name + '; ' + objForm.Name window
endProc
endDefine
Результат приведен на рис. 6.3.
Рис. 6.3. Сообщения методов: а – метода SayXY; б – метода SayObjects
Функция
ANETRESOURCES(ArrayName, cNetworkName, nResourceType)
записывает имена сетевых разделяемых ресурсов или принтеров в массив ArrayName. Возвращает число ресурсов.
Параметры:
cNetworkName – имя сети или домена, информация о разделяемых ресурсах которого собирается. Формат имени сети следующий: "\\NetworkName". Подсоединение к указанной сети необязательно.
nResourceType – тип ресурса, информация о котором возвращается. Принимает следующие значения:
-
0 – возвращаются имена всех ресурсов;
-
1 – возвращаются имена разделяемых ресурсов;
- 2 – возвращаются имена принтеров.
Детали см. в описании Win32 API-функций WNetOpenEnum и WNetEnumResource.
Функция
APRINTERS(ArrayName [, nValue])
помещает сведения об установленных принтерах в двумерный массив ArrayName. Возвращает число установленных принтеров.
Параметр:
nValue – принимает приведенные в табл. 6.17 значения.
Таблица 6.17
Значения параметра nValue
nValue |
Описание |
0 или опущен |
Возвращает массив из 2-х столбцов. Первый столбец массива содержит имя принтера, второй – имя порта, к которому принтер подсоединен |
1 |
Возвращает массив из 5-и столбцов, соответственно содержащих: |
Пример. Выводятся имена установленных принтеров; если таковых нет, то появляется соответствующее предупреждение.
if Aprinters(arrayOfInstalledPrinters) > 0
&& Есть по крайней мере один установленный принтер
for iRow = 1 to Alen(arrayOfInstalledPrinters, 1
?
?? arrayOfInstalledPrinters(iRow, 1), arrayOfInstalledPrinters(iRow, 2)
next
else
MessageBox('Нет установленных принтеров!')
return
endif
Возможный результат:
HP LaserJet 6L LPT1:
Функция
APROCINFO(ArrayName, cFileName [, nType])
формирует массив ArrayName, содержащий элементы встроенного языка VFP, имеющиеся в PRG-файле cFileName. Возвращает число строк результирующего массива. Параметр nType задает вид информации, записываемой в массив ArrayName. Действие параметра описано в табл. 6.18.
Таблица 6.18
Действие параметра 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)
недопустим, поскольку приводит к нарушению верхней границы третьего столбца.
Замечание. В VFP версии 6 параметры nStartElement и nElementsSearched при заданном параметре nSearchColumn своего действия не изменяли, то есть применялись не к заданному столбцу, а ко всему двумерному массиву.
nFlags – задает дополнительные условия поиска. Принимает значения от 1 до 15 включительно. При наличии параметра функция ASCAN( ) интерпретирует в соответствии с табл. 6.19 каждый бит параметра.
Таблица 6.19
Биты параметра nFlags
Бит |
Условия поиска, если значение бита равно 1 |
0 |
Поиск нечувствителен к регистру |
1 |
При поиске SET EXACT установлен в ON; действует, если 2-й бит имеет значение 1 |
2 |
Позволяет изменять (на время поиска) системную EXACT-настройку; если значение бита 0, то при поиске используется системная EXACT-настройка |
3 |
В случае двумерного массива функция ASCAN( ) возвращает номер первой строки, имеющей искомый элемент |
Биты нумеруются справа налево.
Для установки бита в 1 можно употребить функцию BITSET( ). Например, чтобы задать такие условия поиска, как "нечувствителен к регистру" и EXACT ON, выполняются следующие операторы:
nFlags = 0 && Биты: 0000
nFlags = BitSet(nFlags, 0) && Биты: 0001
nFlags = BitSet(nFlags, 1) && Биты: 0011
nFlags = BitSet(nFlags, 2) && Биты: 0111
Тот же эффект будет получен, если задать
nFlags = 7 && Биты: 0111
Полный перечень возможных условий поиска приведен в табл. 6.20.
Таблица 6.20
Условия поиска, задаваемые параметром 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 |
Замечание. Установки nFlags не изменяют системной EXACT-настройки.
Пример 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
Пример 2. Если во второй строке массива twoDArray формы 3´4 есть не менее 2-х элементов равных 'ab' или 'Ab', или 'aB', или 'AB', то распечатать 2-ю строку массива, в противном случае распечатать его 2-й столбец. Поиск выполнить при установке EXACT в OFF, не меняя системную EXACT-настройку.
dimension twoDArray(3, 4)
&& SET COMPATIBLE должен быть установлен в OFF
store 'bc' to twoDArray
&& Поиск должен дать положительный результат
twoDArray(2, 2) = 'aBc'
twoDArray(2, 4) = 'Abc'
nFlags = 0 && Биты: 0000
&& Нечувствительность к регистру
nFlags = BitSet(nFlags, 0) && Биты: 0001
&& EXACT OFF, поскольку 1-й бит равен 0
nFlags = BitSet(nFlags, 2) && Биты: 0101
&& Начало поиска
nStartElement = Aelement(twoDArray, 2, 1)
&& Число участвующих в поиске элементов
nElementsSearched = Alen(twoDArray, 2)
&& Полагаем, что нужного числа элементов нет
lSearcherd = .F.
&& Ищем во всех столбцах, поэтому nSearchColumn = –1
&& Номер первого найденного элемента
nSearcherd = Ascan(twoDArray, 'ab', nStartElement, nElementsSearched, –1, nFlags)
if nSearcherd > 0 then
&& Теперь следует выполнить поиск начиная с элемента под номером nSearcherd + 1
&& Новое число просматриваемых элементов
nElementsSearched = nElementsSearched – (nSearcherd – nStartElement + 1)
if nElementsSearched > 0 then
if Ascan(twoDArray, 'ab', nSearcherd + 1, nElementsSearched, –1, nFlags) > 0 then
&& Нужное число элементов найдено
lSearcherd = .T.
endif
endif
endif
if lSearcherd then
&& Печатаем элементы второй строки массива
PrintRow(2)
else
&& Поиск неудачен; печатаем элементы второго столбца массива
PrintColumn(2)
endif
procedure PrintRow(iRowNumber)
for iCol = 1 to Alen(twoDArray, 2)
&& Вывод элементов на одной строке; элементы разделяются пробелом
?? twoDArray(iRowNumber, iCol), " "
endFor
endProc
procedure PrintColumn(iColNumber)
for iRow = 1 to Alen(twoDArray, 1)
?? twoDArray(iRow, iColNumber), " "
endFor
endProc
Функция
ASELOBJ(ArrayName, [ 1 | 2 | 3 ])
помещает сведения о текущем элементе управления или контейнере, определенном в проектировщике формы или класса, в массив ArrayName.
При вызове без второго параметра в массив ArrayName заносятся ссылки на выбранные элементы управления. Тип ссылки – Object. Число элементов массива равно числу выбранных элементов управления.
Возвращает 1 при успешном выполнении или 0 – в противном случае.
Параметр:
1 – формируется массив из одного элемента, содержащего ссылку на контейнер выбранного элемента управления.
2 – формируется массив из одного элемента, содержащий ссылку на объект DataEnvironment выбранной формы. Получив эту ссылку, можно, например, изменить свойства объекта.
3 – формирует массив из трех элементов, содержащий контекст текущего окна редактирования данных: ссылка на контейнер объекта, полное имя SCX- или VCX-файла и имя INCLUDE-файла, если таковой имеется.
Замечание. INCLUDE-файл добавляется в форму в результате выполнения Form – Include file – выбрать файл.
Пример 1. Редактируется форма ArrayShow (см. рис. 6.4). В ней выбран элемент управления "Поле списка" ListArray. В командном окне или PRG-файле выполняются следующие операторы:
&& Получаем последовательно ссылки на элементы управления, форму,
&& ее среду (окружение) данных. В последнем вызове получаем
&& ссылку на форму и полные имена файлов формы и INCLUDE-файла
Aselobj(arrayOfSelObj)
? arrayOfSelObj(1).Name && Напечатает: ListArray
&&
Aselobj(arrayOfSelObj, 1)
? arrayOfSelObj(1).Name && Напечатает: ArrayShow
&&
Aselobj(arrayOfSelObj, 2)
? arrayOfSelObj(1).Name && Напечатает: Dataenvironment
&&
Aselobj(arrayOfSelObj, 3)
? arrayOfSelObj(1).Name
? arrayOfSelObj(2)
? arrayOfSelObj(3)
Возможный результат для ASELOBJ(arrayOfSelObj, 3):
ArrayShow
d:\HomeLibrary\Forms\ArrayShow.scx
c:\Program Files\Microsoft Visual FoxPro 9\FoxPro.h
Пример 2. Редактируется форма ArrayShow (см. рис. 6.4). В ней выбраны все кнопки.
&& Получаем и печатаем имена выбранных элементов управления
Aselobj(arrayOfSelObj)
?
for k = 1 to Alen(arrayOfSelObj)
?? arrayOfSelObj(k).Name, " "
next
Результат:
CommandClear CommandFill CommandSave CommandSort CommandClose
Пример 3. Редактируется форма ArrayShow (см. рис. 6.4). В ней выбраны все кнопки. Изменяются имена выбранных кнопок формы: к ним добавляется имя формы.
if Aselobj(arrayOForm, 1) > 0 then
if Aselobj(arrayOfSelObj) > 0 then
for k = 1 to Alen(arrayOfSelObj)
arrayOfSelObj(k).Name = arrayOfSelObj(k).Name + arrayOForm(1).Name
next
&& Заново формируем массив и печатаем результат
Aselobj(arrayOfSelObj)
?
for k = 1 to Alen(arrayOfSelObj)
?? arrayOfSelObj(k).Name, " "
next
endif
endif
Результат:
CommandClearArrayShow CommandFillArrayShow …
Функция
ASESSIONS(ArrayName)
формирует одномерный массив ArrayName, содержащий номера сессий данных. Возвращает число сессий данных. Пример см. в разд. 2.5.12.
Функция
ASORT(ArrayName [, nStartElement [, nNumberSorted [, nSortOrder [, nFlags]]])
сортирует элементы массива ArrayName в возрастающем или убывающем порядке. Все участвующие в сортировке элементы должны быть одного типа. Возвращает 1, если сортировка выполнена, или –1 – в противном случае.
Параметры:
nStartElement – задает элемент, с которого начинается сортировка. Если параметр опущен, то массив сортируется начиная с первого элемента. В случае одномерного массива он сортируется начиная с элемента под номером nStartElement. В случае двумерного массива nStartElement определяет строку, в которой начинается сортировка, и столбец, элементы которого сортируются. При сортировке состав каждой строки сохраняется.
Пример. Сортируется по возрастанию двумерный массив формы 4´3 начиная с 4-го элемента, то есть элемента с индексами (2, 1).
Пусть после создания и заполнения
dimension someArray(4, 3)
for k = 1 to 12
someArray(k) = (12 – k) * (-1)**k
endFor
получается следующий массив:
-11 |
10 |
-9 |
8 |
-7 |
6 |
-5 |
4 |
-3 |
2 |
-1 |
0 |
Поскольку элемент, с которого начинается сортировка, расположен во втором ряду, то первый ряд в сортировке участвовать не будет. Сортируются элементы первого столбца, элементы прочих столбцов перемещаются вслед за элементами сортируемого столбца. Поэтому сортировка
Asort(someArray, 4)
даст следующий результат:
11 |
10 |
-9 |
-5 |
4 |
-3 |
2 |
-1 |
0 |
8 |
-7 |
6 |
nNumberSorted – число сортируемых элементов в одномерном массиве и число сортируемых столбцов в двумерном. Если nNumberSorted опущен или равен –1, то в случае одномерного массива в сортировке участвуют все элементы начиная с nStartElement, в случае двумерного массива в сортировке участвуют все столбцы начиная со столбца, в котором присутствует элемент с номером nStartElement.
nSortOrder – задает порядок сортировки. Если nSortOrder опущен или отрицателен, или равен нулю, то элементы массива сортируются по возрастанию своих значений. Если nSortOrder > 0, то элементы располагаются в убывающем порядке.
nFlags – задает чувствительную, если равен нулю, или нечувствительную, если равен единице, к регистру сортировку. Однако поскольку ASORT( ) использует последовательность сортировки, заданную SET COLLATE, то параметр nFlags имеет действие, если SET COLLATE задана последовательность, чувствительная к регистру, например "MACHINE". Тогда задание nFlags = 1 обеспечит нечувствительную к регистру сортировку. Если же SET COLLATE установлена нечувствительная к регистру последовательность, например, "GENERAL", то задание nFlags = 0 не будет иметь эффекта.
Замечание. При задании параметра nFlags стоящие перед ним параметры nStartElement, nNumberSorted и nSortOrder опускаются путем задания их значений равными –1.
Пример. Выполняется убывающая сортировка одномерного массива с различными значениями параметра nFlags. Командой SET COLLATE установлена чувствительная к регистру сортировка.
Пусть после создания и заполнения
dimension oneDArray(10)
aCode = Asc('A')
for k = aCode to aCode + 9
oneDArray(k – aCode + 1) = Iif(k % 2 = 1, Chr(k), Lower(Chr(k)))
endFor
получается следующий массив:
A b C d E f G h I j
if set("COLLATE") != "MACHINE" then
set collate "MACHINE"
endif
&& Чувствительная к регистру убывающая сортировка (nFlags = 0)
Asort(oneDArray, –1, –1, 1, 0) && Результат: j h f d b I G E C A
&& Нечувствительная к регистру убывающая сортировка (nFlags = 1)
Asort(oneDArray, –1, –1, 1, 1) && Результат: j I h G f E d C b A
Функция
ASQLHANDLES(ArrayName [, nStatementHandle])
записывает в массив ArrayName идентификаторы активных соединений. Возвращает число используемых идентификаторов соединения. Полученные идентификаторы могут быть употреблены в SQL-функциях, например SQLEXEC( ) или SQLDISCONNECT( ).
Параметр:
nStatementHandle – заносит в массив идентификаторы соединений, использующих то же разделяемое соединение, что соединение с идентификатором nStatementHandle.
Функция
ASTACKINFO(ArrayName)
создает массив ArrayName и заносит в него данные о текущем состоянии стека вызовов. Число строк результирующего массива равно числу уровней стека вызова. Возвращает число уровней стека вызовов.
Каждая строка результирующего массива содержит 6 элементов, несущих представленную в табл. 6.21 информацию.
Таблица 6.21
Элементы строки массива, формируемого ASTACKINFO( )
Номер столбца |
Что содержит |
1 |
Уровень стека вызовов |
2 |
Имя файла текущей программы |
3 |
Имя программного компонента или объекта |
4 |
Имя файла программного компонента или объекта; возвращается также функцией SYS(16) |
5 |
Номер строки в файле программного компонента или объекта, содержащей вызов |
6 |
Строка кода, содержащая вызов процедуры следующего уровня или ASTACKINFO( ) для последнего уровня |
Функция объединяет возможности функций SYS(16) и Program( ), дополнительно предоставляя информацию о номере строки каждого вызова.
Пример. Вызов ASTACKINFO( ) выполняется в процедуре PROC2( ) третьего уровня в десятой строке программы, хранящейся в файле d:\HomeLibrary\Test.prg.
clear
clear memory
do Proc1
procedure Proc1
do Proc2
endProc
procedure proc2
Astackinfo(arrayName)
display memory like arrayName to file d:\a.txt
endProc
Печать команды DISPLAY MEMORY LIKE arrayName:
ARRAYNAME Priv A proc2
(1, 1) N 1 ( 1.00000000)
(1, 2) C "d:\HomeLibrary\Test.fxp"
(1, 3) C "test"
(1, 4) C "d:\HomeLibrary\Test.prg"
(1, 5) N 3 ( 3.00000000)
(1, 6) C "DO Proc1"
(2, 1) N 2 ( 2.00000000)
(2, 2) C "d:\HomeLibrary\Test.fxp"
(2, 3) C "Proc1"
(2, 4) C "d:\Homelibrary\Test.prg"
(2, 5) N 6 ( 6.00000000)
(2, 6) C "DO Proc2"
(3, 1) N 3 ( 3.00000000)
(3, 2) C "d:\HomeLibrary\Test.fxp"
(3, 3) C "Proc2"
(3, 4) C "d:\HomeLibrary\Test.prg"
(3, 5) N 10 ( 10.00000000)
(3, 6) C "ASTACKINFO(arrayName)"
Функция
ASUBSCRIPT(ArrayName, nElementNumber, nSubscript)
возвращает номер строки или столбца элемента массива ArrayName по номеру элемента.
Параметры:
nElementNumber – номер элемента.
nSubscript – если равен 1, то в случае двумерного массива возвращается номер строки элемента, в а случае одномерного – номер элемента, Если равен 2, то функция вернет номер столбца, в котором расположен элемент.
Функция
ATAGINFO(ArrayName [, cCDXName [, nWorkArea | cTableAlias]])
формирует двумерный массив ArrayName, содержащий сведения об именах, количестве и типах индексов и индексных выражений. Возвращает число строк в результирующем массиве.
Параметры:
cCDXName – имя составного индекса, информацию о котором надо получить. Если в качестве параметра передана пустая строка (""), то функция ATAGINFO( ) вернет для выбранной (текущей) таблицы число индексов в открытом CDX-файле плюс число всех открытых IDX-файлов.
nWorkArea | cTableAlias – необязательный параметр, задающий номер рабочей области или псевдоним таблицы, для которой ATAGINFO( ) собирает информацию. Если параметр опущен, то берется таблица, открытая в текущей рабочей области.
Каждая строка массива содержит приведенные в табл. 6.22 данные. Тип данных всех элементов массива – Character.
Таблица 6.22
Состав строки массива, формируемого ATAGINFO( )
Номер столбца |
Что содержит |
1 |
Имя индекса или IDX-файла |
2 |
Тип индекса (первичный, кандидатный, уникальный или регулярный) |
3 |
Индексное выражение |
4 |
Фильтр |
5 |
Вид сортировки (возрастающая или убывающая) |
6 |
Последовательность сравнения при выполнении сортировки |
Пример. Функция ATAGINFO( ) употребляется для таблицы Books.dbf базы HomeLibrary.dbc. (Описание таблиц и их индексов базы данных см. в разд. 2.2.)
close DataBases
open DataBase d:\HomeLibrary\HomeLibrary.dbc
use Books in 0 && Открываем Books.dbf
&& Получаем и печатаем массив arrayTag
if Ataginfo(arrayTag) > 0 then
for iRow = 1 to Alen(arrayTag, 1)
?
for iCol = 1 to Alen(arrayTag, 2)
?? arrayTag(iRow, iCol), " "
next
next
endif
&&
&& Пример для функции AUSED( )
&& Получаем и печатаем массив arrayUsedTables
Aused(arrayUsedTables)
for iRow = 1 to Alen(arrayUsedTables, 1)
?
?? arrayUsedTables(iRow, 1), arrayUsedTables(iRow, 2)
next
Массив arrayTag:
BOOKID |
PRIMARY |
BOOKID |
ASCENDING |
MACHINE |
BOOK |
REGULAR |
LEFT(BOOK, 20) |
ASCENDING |
MACHINE |
Массива arrayUsedTables:
Books |
1 |
Функция
AUSED(ArrayName [, nDataSessionNumber [, cTableName]])
заносит для выбранной сессии данных в двумерный массив ArrayName псевдонимы открытых таблиц и соответствующие номера рабочих областей. Возвращает число строк в сформированном массиве.
Параметры:
nDataSessionNumber –задает номер сессии данных. Если опущен, то берется текущая сессия данных.
Замечание. Изменение текущей сессии данных выполняется командой
SET DATASESSION TO [nDataSessionNumber]
cTableName – массив будет содержать псевдонимы таблицы, имеющей имя cTableName. Если nDataSessionNumber установлен в NULL, то берется текущая сессия данных. Параметр cTableName может быть задан в одном из следующих форматов:
-
DatabaseName!TableName или DatabaseName!ViewName;
-
Path\DatabaseName!TableName или Path\DatabaseName!ViewName;
-
имя таблицы или вида текущей базы данных;
- имя таблицы или полное имя dbf-файла.
Пример 1. См. в примере для функции ATAGINFO( ).
Пример 2. Обновляются буферизованные таблицы, открытые в текущей сессии данных.
for nTable = 1 to Aused(arrayUsedTables)
cTableAlias = arrayUsedTables(nTable, 1)
&& Проверяем, используется ли буферизация данных в таблице
if CursorGetProp('Buffering', cTableAlias) > 1 then
TableUpdate(0, .T., arrayUsedTables(1, cTableAlias))
endif
endFor
Замечание. Буферизация таблицы задается функцией CURSORSETPROP( ). При этом SET MULTILOCKS должен быть установлен в ON.
Функция
AVCXCLASSES(ArrayName, cLibraryName)
записывает информацию о классах библиотеки классов cLibraryName в двумерный массив ArrayName. Каждому классу массива отвечает его строка. В строке массива 11 столбцов, содержание которых раскрывается в табл. 6.23.
Таблица 6.23
Состав строки массива, формируемого AVCXCLASSES( )
Номер |
Что содержит |
VCX-поле |
1 |
Имя класса |
OBJNAME |
2 |
Базовый класс класса |
BASECLASS |
3 |
Родительский класс класса |
CLASS |
4 |
Относительный путь и имя файла библиотеки родительского класса |
CLASSLOC |
5 |
Относительный путь и имя файла иконки класса |
RESERVED4 |
6 |
Относительный путь и имя файла иконки класса в диспетчере проектов или браузере классов |
RESERVED5 |
7 |
Единица измерения изображения (пиксель или фоксель (знакоместо)) |
RESERVED6 |
8 |
Описание класса |
RESERVED7 |
9 |
Относительный путь INCLUDE-файла класса |
RESERVED8 |
10 |
Информация для класса, занесенная пользователем |
USER |
11 |
.T., если класс является OLEPUBLIC, или .F. – в противном случае |
RESERVED2 |
cLibraryName – имя файла библиотеки класса; может содержать путь к библиотеке. Если имя файла указано неверно, то возникнет ошибка исполнения.
Функция AVCXCLASSES( ) возвращает число строк в массиве, равное числу классов в библиотеке классов.
Пример. Выбирается, используя GETFILE( ), библиотека классов. Выбранное значение передается функции AVCXCLASSES( ). Сформированный ею массив arrayOfClasses выводится на печать.
vcxFile = GetFile("VCX", "Имя файла:", "Выбрать", 0, "Выбор VCX-файла")
if not Empty(vcxFile) then
&& Выделяем расширение выбранного файла
fileExt = JustExt(vcxFile)
&& Проверяем, имеет ли выбранный файл расширение VCX
if Upper(fileExt) = 'VCX' then
&& Печатаем имя файла
? vcxFile
&& Формируем массив arrayOfClasses и печатаем число классов
? "Всего классов в библиотеке:", AVCXClasses(arrayOfClasses, vcxFile)
? "Печатаем информацию о первом классе библиотеки"
for iCol = 1 to Alen(arrayOfClasses, 2)
? iCol, arrayOfClasses(1, iCol)
endFor
endif
endif
Возможный результат (выбран класс _DIALOGS.VCX):
C:\PROGRAM FILES\MICROSOFT VISUAL FOXPRO 9\FFC\_DIALOGS.VCX
Всего классов в библиотеке: 7
Печатаем информацию о первом классе библиотеки
1 _splash
2 form
3 _form
4 _base.vcx
5
6
7 Pixels
8
9
10
11 .F.