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

Функции для массивов 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
                   [, 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 )                "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

111.1.-Вложенное-прикрепление-окон-Command-и-View

Рис. 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), одно из следующих значений:
·              1 – ошибка при добавлении данных;
·              2 – ошибка при обновлении данных;
·              3 – ошибка при удалении данных

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

Тип события или как событие вызвано:
0 – системный;
1 – вызвано функцией RAISEEVENT( )
2 – вызов метода

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., если второй элемент – это источник события;
.F., если второй элемент – это идентификатор события

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).

111.2.-Вызвана-процедура-SayWord

Рис. 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

Вид
результата

Число измерений
массива ArrayName

Содержание элемента (строки)
массива ArrayName

1

Команды

1

Имя команды, например WAIT

2

Функции

2

Первый элемент содержит имя функции, второй – строку вида [M] nParamR [- nParamT],
где М – флаг сокращения имени; если буква М присутствует в строке, то имя функции сокращать нельзя;
nParamR – число обязательных параметров;
nParamT – общее число параметров.
Если nParamR = nParamT, то число 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.

111.3.-Сообщения-методов-а-метода-SayXY;-б-метода-SayObjects

Рис. 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.