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

Биты параметра 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

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