Клиппер 5. Справочник
Возвращает позицию последнего столбца текстовой
WFLASTCOL()
Возвращает позицию последнего столбца текстовой области окна.
------------------------------------------------------------------------------
Синтаксис
WFLASTCOL([
Параметры
значении .T. возврат абсолютного значения разности между WLASTCOL() и
WFLASTCOL(), а при значении .F. или по умолчанию возврат позиции
последнего столбца текстовой области окна.
Возвращаемое значение
nValue - номер последнего столбца текстовой области окна, или величина
разности позиций границы окна и последнего столбца текстовой области.
Описание
Функция может использоваться для сохранения информации из окна
в файле. Имеется четыре функции, возвращающие координаты текстовой
области окна. Возвращаемое ими значение может быть сохранено и
использовано в программе позже.
Для получения без дополнительных вычислений величины разности
между позициями соответствующей границы окна и последнего столбца
текстовой области можно вызвать данную функцию со значением .T.
параметра
функции WFORMAT() для восстановления прежнего размера текстовой
области окна.
Примечания
. Для физического экрана (окна с дескриптором 0) данная функция
возвращает значение, соответствующее вызову WBOARD().
Примеры
. Каждая функция из семейства WFxxx() оперирует с активным
окном. Заметим, что вызов WBOX() соответствует вызову
WFORMAT(1, 1, 1, 1):
CLEAR
WOPEN(10, 10, 20, 70)
WBOX()
? WFROW(), WFROW(.T.) // 11, 1
? WFCOL(), WFCOL(.T.) // 11, 1
? WFLASTROW(), WFLASTROW(.T.) // 19, 1
необязательный логический параметр, задающий при
.T. использование сигналов DTR/DSR, а при значении .F. использование
сигналов RTS/CTS для реализации автоматической аппаратной приостановки
передачи. По умолчанию состояние режима не изменяется.
Возвращаемое значение
lOldHandshake - логическое значение .T. при предыдущем состоянии
режима во включенном состоянии, или .F. при выключенном.
Описание
Функция включает или выключает режим автоматической аппаратной
приостановки передачи. Программная или аппаратная приостановка
передачи используется во избежание потери символов при переполнении
буфера приема, имеющего ограниченные размеры.
При автоматической аппаратной приостановке передачи обычно используют
сигналы RTS (Request To Send - запрос передачи) и CTS (Clear To Send -
готовность к передаче). Если функцией включена автоматическая
аппаратная приостановка передачи, то CTS деактивизируется при
заполнении буфера приема на 75%. При уменьшении заполненности буфера
до 50% или менее, CTS снова активизируется.
Многими принтерами для предотвращения переполнения буфера вместо
выходного сигнала RTS используется DTR, а вместо входного сигнала CTS
используется DSR. Для поддержки такого режима функцию следует вызывать
со значением .T. параметра
Примечания
. Автоматическая аппаратная приостановка передачи поддерживается
только в режиме фоновой передачи данных, активизируемом вызовом
функции COM_OPEN() с заданием размера буфера передачи.
. Функция управляет переключением режима как для ввода, так и для
вывода.
. При использовании аппаратной приостановки передачи сигнал RTS не
должен изменяться функциями COM_RTS() или COM_MCR().
Примеры
. Включение режима аппаратной приостановки передачи для порта 2:
в бодах. Возможны значения 300,
COM_OPEN(2, 1000, 1000) // Открытие COM2 с буфером фоновой
// передачи
COM_HARD(2, .T.) // Включение аппаратной приостановки
// передачи по RTS/CTS для порта 2
See Also: COM_READ()
COM_SEND()
COM_SOFT()
COM_INIT()
Инициализирует последовательный порт.
------------------------------------------------------------------------------
Синтаксис
COM_INIT(
[
Параметры
передачи данных в бодах. Возможны значения 300, 600, 1200, 2400, 4800,
9600 и 19200. По умолчанию 300.
символов, приведенных в следующей таблице, способ контроля при
передаче данных. По умолчанию "N".
--------------------------------------------------------------------
Символ Способ контроля
--------------------------------------------------------------------
E По четности (Even)
O По нечетности (Odd)
M По установленному биту (Mark)
S По сброшенному биту (Mark)
N Контроль не используется (None)
--------------------------------------------------------------------
битов в символе данных (7 или 8). По умолчанию 8.
стоповых битов (1 или 2). По умолчанию 1.
Возвращаемое значение
lInitialized - логическое значение .T. при успешной инициализации с
После открытия последовательного порта должна
заданными параметрами, а иначе .F..Описание
После открытия последовательного порта должна быть произведена его
инициализация, для чего вызывается данная функция с указанием скорости
передачи данных (в бодах), длины символа данных (в битах), способа
контроля и количества стоповых битов.
В настоящее время в системах низкоскоростной компьютерной связи
используется конфигурация "300 - 9600 бод, 8, N, 1", что означает:
данные длиной 8 битов, без контроля четности и 1 стоповый бит.
Важно, что все эти параметры могут быть изменены в процессе работы.
Производимая функцией инициализация не оказывает воздействия ни на
буфер данных, ни на регистр состояния модема (сигнал DTR и т.д.).
Примечания
. Для инициализации порт должен быть предварительно открыт функцией
COM_OPEN().
Примеры
. Открытие и инициализация порта:
nBuff_size := 4000 // Буфер на 4000 символов
lComOk := COM_OPEN(1, nBuff_size) // Открытие порта
If lComOk
* Порт открыт, теперь он будет инициализирован следующими
* значениями: 1200 бод, контроля четности нет, длина данных
* 8 битов, 1 бит останова.
lInitOk := COM_INIT(1, 1200, "N", 8, 1)
IF .NOT. lInitOk
? "Порт не может быть инициализирован!"
ENDIF
ENDIF
. Вариант вызова без трех последних параметров. Их значения будут
установлены по умолчанию:
lInitOk := COM_INIT(1, 1200) // Инициализация значениями
// 1200, N, 8, 1
See Also: COM_CLOSE()
COM_OPEN()
COM_KEY()
Устанавливает коды для отслеживания состояния порта.
------------------------------------------------------------------------------
Синтаксис
COM_KEY(
команде SET KEY TO, или
[Параметры
клавиши, помещаемый в буфер клавиатуры в случае прерывания.
Параметр задается в виде числового значения INKEY-кода, используемого
в Clipper- команде SET KEY TO, или в формате символьной строки.
По умолчанию отслеживание прерываний для порта отключается.
клавиши, помещаемый в буфер клавиатуры при заполнении буфера приема на
75% или более.
Параметр задается в виде числового значения INKEY-кода, используемого
в Clipper-команде SET KEY TO, или в формате символьной строки.
По умолчанию отслеживание переполнения буфера приема для порта
отключается.
Возвращаемое значение
lActive - логическое значение .T. при включении функцией хотя бы
одного отслеживания, а иначе .F..
Описание
Функция позволяет организовать наблюдение за портом при нахождении
программы в режиме ожидания, например, по команде READ. Таким образом,
различные события могут быть отмечены помещением в буфер клавиатуры
кода клавиши, выбранной программистом. Помещение производится при
следующих событиях:
. Поступление данных в порт.
. Обнаружение ошибки передачи данных или сброса на линии передачи
(BREAK), отмечаемых в регистре состояния линии (LSR).
. Изменение состояния одного из сигналов регистра состояния модема
(MSR).
. Заполнение буфера приема на 75%.
Код клавиши, заданный параметром
отслеживать процедурой, заданной Clipper-командой SET KEY TO,
изменение состояния регистров MSR и LSR, обнаружение ошибок и
получение отдельных данных.
Без сохранения информация будет потеряна,
Вся информация сохраняется во внутреннейобласти памяти и может быть получена с помощью функции COM_EVENT().
Без сохранения информация будет потеряна, т.к. регистры и флаги,
отмечающие прерывание, при чтении автоматически сбрасываются.
Код клавиши, заданный параметром
отслеживать процедурой, заданной Clipper-командой SET KEY TO,
заполнение буфера приема на 75% или более. При этом в буфер клавиатуры
не будет помещаться код, заданный параметром
при получении символов в буфер приема. Отслеживание изменений
состояний MSR и LSR при этом продолжается.
Примечания
. MSR (Modem Status Register) - регистр состояния модема. LSR (Line
Status Register) - регистр состояния линии.
. Состояния различных интерфейсных регистров объединяются во
внутренней памяти при "обслуживании" события новым вызовом данной
функции. Это означает, что произошедшие в это время изменения не будут
потеряны.
. Функция должна повторно вызываться после каждого выполненного
прерывания, при этом производится сброс информации, накопленной во
внутренней памяти.
. Отслеживание заполнения буфера на 75% производится независимо от
вызова функций COM_SOFT() или COM_HARD().
Примеры
. Процедура COMERRORS() вызывается при помещении в буфер клавиатуры
символа CHR(227), если портом 2 будет обнаружена ошибка или изменится
состояние сигнала модема. При заполнении буфера приема на 75% или
более, в буфер клавиатуры помещается CHR(228) и вызывается процедура
BUFFERFULL():
#include NT2COM.CH // Определения символьных
// констант для интерфейса.
COM_OPEN(2, 1000) // Открытие порта 2
COM_INIT(2, 1200, "N", 8, 1) // Инициализация порта 2
SET KEY 227 TO ComErrors
Возвращает значение для регистра состояния
SET KEY 228 TO BufferFullCOM_KEY(2, 227, 228) // Отслеживание порта 2
cName := SPACE(20) // Выполнение GET..READ
@ 10, 10 GET cName // может сопровождаться вызовом
READ // процедур обслуживания
// прерываний по инициативе порта.
COM_KEY(2) // Отключение отслеживания
RETURN
PROCEDURE COMMERRORS (A, B, C)
nMSR_Status := COM_EVENT(2, 2) // Чтение собранных MSR-данных
nLSR_Status := COM_EVENT(2, 2) // Чтение собранных LSR-данных
* Повторная активизация прерываний, сброс внутренних
* значений COM_EVENT().
COM_KEY(2, 227, 228)
IF ISBIT(nMSR_Status, MSR_RI) // Установлен бит вызова?
? "Обнаружен входящий вызов!"
ELSE
IF ISBIR(nLSR_Status, LSR_Break) // Проверка BREAK
?"Обнаружен BREAK!"
ENDIF
ENDIF
RETURN
PROCEDURE BUFFERFULL(A, B, C)
* Должен быть прочитан буфер приема!
COM_KEY(2, 227, 228) // Повторная активизация
cData := COM_READ(2) // Чтение всех данных
SELECT MESSDAT
REPLACE ComDat WITH cData // Сохранение данных
SKIP
SELECT INPUT
RETURN
See Also: COM_COUNT()
COM_EVENT()
COM_MSR()
LASTKLINE()
LASTKPROC()
COM_LSR()
Возвращает значение для регистра состояния линии (LSR).
------------------------------------------------------------------------------
Синтаксис
COM_LSR(
Параметры
Возвращаемое значение
nLSR - число, содержащее комбинацию битов регистра состояния линии
(LSR), назначение которых приведено в таблице:
программной реакции на особые ситуации,
Таблица 3-3. Кодирование битов регистра LSR
--------------------------------------------------------------------
Бит Число Симв. константа Назначение
--------------------------------------------------------------------
0 LSR_ERROR Ошибочный параметр
0 1 LSR_DATA_READY Готовность данных
1 2 LSR_OVERRUN_ERR Ошибка переполнения
2 4 LSR_PARITY_ERR Ошибка четности
3 8 LSR_FRAMING_ERR Ошибка кадра
4 16 LSR_BREAK Распознан BREAK
5 32 LSR_TRANS_HOLD_EMPTY Передающий регистр пуст
6 64 LSR_TRANS_EMPTY Сдвиговый регистр пуст
--------------------------------------------------------------------
Описание
Функция позволяет получить информацию о состоянии сигналов регистра
состояния линии LSR (Line Status Register), что необходимо для выбора
программной реакции на особые ситуации, возникающие в процессе
приема/передачи данных.
Примечания
. Функция не может устанавливать биты LSR.
. Некоторые биты LSR сбрасываются при чтении.
Примеры
. Анализ битов LSR порта 2:
nStatus := COM_LSR(2) // Чтение LSR порта 2
IF ISBIT(nStatus, 5) // Бит 5 установлен
? "Распознан BREAK - Прерывание!"
ENDIF
See Also: COM_MCR()
COM_MSR()
COM_MCR()
Устанавливает биты регистра управления модемом (MCR).
------------------------------------------------------------------------------
Синтаксис
COM_MCR(
Параметры
битов в виде числа в диапазоне от 0 до 255.
содержащее комбинацию битов регистра управления
По умолчанию состояние MCRне изменяется.
Возвращаемое значение
nMCR - число, содержащее комбинацию битов регистра управления модемом
(MCR), назначение которых приведено в таблице:
Таблица 3-4. Кодирование битов регистра MCR
--------------------------------------------------------------------
Бит Число Симв. константа Назначение
--------------------------------------------------------------------
0 MCR_ERROR Ошибочный параметр
1 1 MCR_DTR Готовность терминала (DTR)
2 2 MCR_RTS Запрос передачи (RTS)
3 4 MCR_OUT_1 OUT 1 (дополнительный сигнал)
4 8 MCR_OUT_2 OUT 2 (дополнительный сигнал)
5 16 MCR_LOOP LOOP (дополнительный сигнал)
--------------------------------------------------------------------
Описание
Функция позволяет установить состояние битов регистра управления
модемом MCR (Modem Control Register) и сохранить предыдущее состояние.
Примечания
. Управляющие биты OUT1, OUT2 и LOOP могут быть установлены только
данной функцией.
. Для управления сигналами DTR и RTS в состав CT II входят
специальные функции.
Примеры
. Установка битов MCR порта 1:
nStatus := COM_MCR(1) // Чтение MCR порта 1
IF NUMAND(nStatus, 3) = 3
? "DTR и RTS активны!"
ENDIF
See Also: COM_DTR()
COM_RTS()
COM_MSR()
Возвращает значение для регистра состояния модема (MSR).
------------------------------------------------------------------------------
Синтаксис
COM_MSR(
Параметры
Возвращаемое значение
nMSR - число, содержащее комбинацию битов регистра состояния модема
Не все биты регистра состояния
(MSR), назначение которых приведено в таблице:Таблица 3-5. Кодирование битов регистра MSR
--------------------------------------------------------------------
Бит Число Симв. константа Назначение
--------------------------------------------------------------------
0 MSR_ERROR Ошибочный параметр
0 1 MSR_DELTA_CTS Изменение готовности передачи (DCTS)
1 2 MSR_DELTA_DSR Изменение готовности внешнего устройства
(DDSR)
2 4 MSR_TERI Изменение сигнала входящего вызова (TERI)
3 8 MSR_DELTA_DCD Изменение сигнала обнаружения несущей
(DDCD)
4 16 MSR_CTS Готовность к передаче (CTS)
5 32 MSR_DSR Готовность внешнего устройства (DSR)
6 64 MSR_RI Индикатор входящего вызова (RI)
7 128 MSR_DCD Обнаружение несущей (DCD)
--------------------------------------------------------------------
Описание
Не все биты регистра состояния модема MSR (Modem Status Register)
могут быть опрошены специальными функциями. Если, например, нужна информация об изменении сигнала (DELTA-<сигнал>), то следует использовать данную функцию и проверять состояние соответствующих битов.
Примечания
. Все биты данного регистра, указывающие на изменения
соответствующих сигналов, сбрасываются при чтении.
Примеры
. Анализ MSR порта1:
nStatus := COM_MSR(1)
IF ISBIT(nStatus, 5) // CTS (бит 5) активен?
...
ENDIF
See Also: COM_CTS()
COM_DCD()
COM_DSR()
COM_RING()
COM_NUM()
Возвращает наибольший из номеров доступных последовательных портов.
------------------------------------------------------------------------------
Синтаксис
COM_NUM() --> nMaxCom
Возвращаемое значение
Функция возвращает наибольший из номеров
nMaxCom - номер последовательного порта с максимальным номером в
диапазоне от 1 до 4.
Описание
Функция возвращает наибольший из номеров доступных последовательных
портов, а не количество доступных портов. Возвращенное значение 3 не
означает, что доступны 3 порта - порт 2, например, может быть исключен
из числа доступных. Для определения возможности использования
последовательного порта следует проверять результаты, возвращаемые
функциями COM_OPEN() или COM_INIT().
До вызова данной функции для сканирования портов используются адреса,
описанные во Введении к данной главе. Однако эти базовые адреса могут
быть изменены функцией COM_SETIO().
Внимание!
Функция распознает наличие установленных портов по базовым адресам.
Если, например, компьютер имеет встроенный ArcNet-адаптер, то это
может привести к конфликту адресов ввода/вывода. Обращение прикладной
программы по адресу 02EAh как к последовательному порту, который по
управлению отличается от ArcNet-адаптера, может нарушить существующие
сетевые связи. В таких случаях может помочь вызов функции COM_SETIO()
с заданием 0 в качестве адреса ввода/вывода:
COM_SETIO(
После выполнения этого вызова во внутренней таблице будут уничтожены
соответствующие стандартные адреса и конфликтующие аппаратные средства
будут защищены от доступа со стороны CT II-функций. Однако это
возможно лишь при условии, что функция COM_NUM() еще не вызывалась,
поскольку иначе порт будет уже помечен как используемый ("in use").
Примеры
. Определение числа портов по стандартным адресам:
? COM_NUM() // Например, 4
. Задание нестандартных адресов:
COM_SETIO(3, "110") // Порт 3, 110h
COM_SETIO(4, "120") // Порт 4, 120h
? COM_NUM() // 4
Возвращает позицию последней строки текстовой
? WFLASTCOL(), WFLASTCOL(.T.) // 69, 1INKEY(0)
WCLOSE()
RETURN
See Also: WBOX()
WFCOL()
WFLASTROW()
WFORMAT()
WFROW()
WLASTCOL()
WFLASTROW()
Возвращает позицию последней строки текстовой области окна.
------------------------------------------------------------------------------
Синтаксис
WFLASTROW([
Параметры
значении .T. возврат абсолютного значения разности между WLASTROW()
и WFLASTROW(), а при значении .F. или по умолчанию возврат позиции
последней строки текстовой области окна.
Возвращаемое значение
nValue - номер последней строки текстовой области окна, или величина
разности позиций границы окна и последней строки текстовой области.
Описание
Функция может использоваться для сохранения информации из окна в
файле. Имеется четыре функции, возвращающие координаты текстовой
области окна. Возвращаемое ими значение может быть сохранено и
использовано в программе позже.
Для получения без дополнительных вычислений величины разности между
позициями соответствующей границы окна и последней строки текстовой
области можно вызвать данную функцию со значением .T. параметра
WFORMAT() для восстановления прежнего размера текстовой области окна.
Примечания
. Для физического экрана (окна с дескриптором 0) данная функция
возвращает значение, соответствующее вызову WBOARD().
Примеры
. Каждая функция из семейства WFxxx() оперирует с активным
окном. Заметим, что вызов WBOX() соответствует вызову
WFORMAT(1, 1, 1, 1):
CLEAR
WOPEN(10, 10, 20, 70)
WBOX()
? WFROW(), WFROW(.T.) // 11, 1
к одноименной функции из Clipper
See Also: COM_OPEN()
COM_SETIO()
COM_OPEN()
Открывает порт и инициализирует буфера.
------------------------------------------------------------------------------
Синтаксис
COM_OPEN(
[
ВНИМАНИЕ! По отношению к одноименной функции из Clipper Tools One
расширены возможности и введен дополнительный параметр.
Параметры
буфера передачи в байтах длиной до 65536. По умолчанию буфер передачи не используется.
значении .T. инициирование прерываний только при приеме данных, а при значении .F. или по умолчанию прерывания инициируются, кроме этого, и при сбоях во время передачи данных.
Возвращаемое значение
lStatus - логическое значение .T. при успешном открытии порта и
инсталляции для него буферов заданного размера, а иначе .F..
Описание
Функция позволяет открыть один из портов последовательного интерфейса
(COM1 - COM4). Термины COM1, COM2 и т.д. вошли в обиход. Однако это и имена устройств DOS. Здесь речь идет о портах с определенными адресами ввода/вывода. Например, CT II использует 3F8h как базовый адрес для COM1.
Работа с портами осуществляется непосредственно, в обход DOS или BIOS.
Для адресации ввода/вывода используются не данные из BIOS, а либо исходные значения, приведенные в таблице установочных величин во Введении к данной главе, либо значения, заданные функцией COM_SETIO(). Проверка доступности порта по этим адресам осуществляется при его открытии.
Для каждого последовательного порта может
Прием данных
Для каждого последовательного порта может быть зарезервирован буфер
размером до 64 Кбайтов, в который записываются все поступающие
символы, даже если Clipper-программа занята другим процессом.
Количество находящихся в буфере символов может быть проверено и
прочитано по частям.
Передача данных
Можно также, хотя это и не обязательно, зарезервировать буфер
передачи. В таком случае передача данных, запущенная функцией
COM_SEND(), управляется прерываниями, т.е. выполняется в фоновом
режиме. Для управления и контроля за буфером передачи применяется
несколько функций.
Прерывания при ошибках передачи
Если параметр
инициировать прерывания при приеме данных и в фоновом режиме при
передаче данных. События, связанные с MSR или LSR, учитываться не
будут, что повлияет на отслеживание сигналов состояния и, особенно,
ошибок при передаче.
Эта возможность добавлена в связи с тем, что некоторые адаптеры
последовательных интерфейсов инициируют прерывания из-за "шума" во
входных линиях, которые, как правило, не шунтированы нагрузочным
сопротивлением. Выключение отслеживания переполнения буфера приема
может нарушить выполнение программы и привести к значительным потерям
информации.
Примечания
. MSR (Modem Status Register) - регистр состояния модема. LSR (Line
Status Register) - регистр состояния линии.
DTR (Data Terminal Ready) - готовность терминала или, другими словами,
готовность передатчика внешнего устройства к передаче данных.
. Внимание! CT II-функции COM_OPEN() и COM_INIT() не влияют на
управляющие сигналы в отличие от аналогичных функций других языков,
например BASIC. Для управления модемом через последовательный порт с
использованием Clipper необходимо устанавливать DTR и другие сигналы,
Размер буфера может быть от
применяя соответствующие CT II-функции.. Размер буфера может быть от 100 байтов до 64 Кбайтов. Слишком
большое или слишком маленькое значение корректируются до минимально
или максимально допустимого.
. Для сохранения совместимости с Clipper Tools I функция может
вызываться с параметрами
параметра
параметров) может быть также опущена.
Примеры
. Открытие порта 1:
IF COM_NUM() > 0 // Буфер 4000 байтов
nBuffSize := 4000
ComOk := COM_OPEN(1, nBuffSize) // Открытие порта 1
IF .NOT. ComOk
? "Порт не может быть открыт!"
ENDIF
ENDIF
. Открытие порта 3 с указанием длины буферов приема и передачи:
? COM_OPEN(3, 1000, 1000) // .T. в случае успеха
. Инициирование прерываний только для принимаемых данных с
игнорированием сбоев во время передачи. Используется только буфер
приема на 1000 символов:
? COM_OPEN(3, 1000, .T.) // .T. в случае успеха
See Also: COM_COUNT()
COM_INIT()
COM_READ()
COM_SEND()
COM_SETIO()
COM_READ()
Считывает символы из буфера приема.
------------------------------------------------------------------------------
Синтаксис
COM_READ(
[
Параметры
считываемых из буфера символов. По умолчанию считываются все символы.
значении .T. сохранение символов до заполнения буфера, а при значении
или по умолчанию их удаление
.F. или по умолчанию их удаление после чтения.Возвращаемое значение
cCharString - символьная строка, содержащая требуемое количество
байтов, считанных из буфера приема заданного порта.
Описание
Все символы, принимаемые последовательным портом, записываются в
соответствующий буфер по прерываниям. Задавая количество считываемых
символов, можно считать из буфера один, несколько или все символы.
Примечания
. Между вызовами COM_COUNT() и COM_READ() могут быть приняты
дополнительные символы.
Примеры
. Ожидание приема по крайней мере десяти символов:
DO WHILE COM_COUNT(1) < 10 // Ожидание поступления в
// буфер 10 символов
*...
ENDDO
cInput := COM_READ(1, 10) // Чтение 10 символов
? cInput // Вывод считанных символов
See Also: COM_COUNT()
COM_REMOTE()
Инсталлирует символ дистанционного прекращения передачи.
------------------------------------------------------------------------------
Синтаксис
COM_REMOTE(
Параметры
строки или в виде числового ASCII-кода символ, прием которого
передающей стороной должен инициировать прекращение передачи. По
умолчанию символ прекращения передачи не используется.
Возвращаемое значение
lActive - логическое значение .T. при открытом и доступном порте, а
иначе .F..
Описание
При передаче длинных текстов приемник должен иметь возможность
прекратить сеанс передачи, что может быть реализовано очисткой буфера
передачи.
Для этого должен быть определен
Для этого должен быть определен символ прекращения передачи.При приеме этого символа передающей станцией, ее буфер, используемый
для фоновой передачи, очищается (как при выполнении COM_SFLUSH()) и
передающая Clipper-программа прекращает текущий сеанс передачи.
Прекращение передачи по инициативе принимающей станции может быть
определено вызовом функции COM_SMODE().
Примеры
. Задание CTRL-X как символа прекращения передачи для порта 2:
COM_REMOTE(2, 24)
COM_SEND(2, cLongText)
IF ISBIT(COM_SMODE(2), 4)
? "Передача прекращена принимающей станцией!"
ENDIF
. Отмена символа прекращения передачи:
COM_REMOTE(2)
See Also: COM_SFLUSH()
COM_SKEY()
COM_SMODE()
COM_RING()
Возвращает признак наличия входящего вызова (RING).
------------------------------------------------------------------------------
Синтаксис
COM_RING(
Параметры
Возвращаемое значение
lActiveRing - логическое значение, соответствующее состоянию
RING-сигнала и бита 7 регистра MSR:
--------------------------------------------------------------------
Значение Состояние RING Значение бита 7 MSR
--------------------------------------------------------------------
.T. Активно 1
.F. Пассивно 0
--------------------------------------------------------------------
MSR (Modem Status Register) - регистр состояния модема.
Описание
Функция возвращает состояние сигнала RING, активизируемого модемом при
обнаружении входящего вызова. Однако наличие этого сигнала не
означает, что связь установлена без каких-либо нарушений.
Примечания
. Для получения информации о сигнале TERI (Trailing Edge RING -
изменение сигнала входящего вызова) следует
изменение сигнала входящего вызова) следует использовать функциюCOM_MSR().
Примеры
Обнаружение входящего вызова:
DO WHILE .NOT. COM_RING(1) // Ожидание вызова
*...
ENDDO
? "Обнаружен входящий вызов..."
See Also: COM_MSR()
COM_RTS()
Устанавливает сигнал запроса на передачу (RTS).
------------------------------------------------------------------------------
Синтаксис
COM_RTS(
Параметры
значении .T. активизацию, а при .F. деактивизацию RTS-сигнала.
По умолчанию состояние выходного RTS-сигнала не изменяется.
Возвращаемое значение
lOldRTSStatus - логическое значение, соответствующее состоянию
RTS-сигнала и бита 2 регистра MSR:
--------------------------------------------------------------------
Значение Состояние RTS Значение бита 2 MSR
--------------------------------------------------------------------
.T. Активно 1
.F. Пассивно 0
--------------------------------------------------------------------
MSR (Modem Status Register) - регистр состояния модема.
Описание
RTS (Request To Send) - запрос на передачу или, другими словами,
запрос приемника внешнего устройства на передачу ему данных.
Функция позволяет изменить состояние выходного RTS-сигнала и сохранить
в переменной его предыдущее состояние.
Примечания
. При выполнении функции COM_OPEN() не осуществляется автоматическая
активизация RTS-сигнала, в то время как выполнение COM_CLOSE()
сопровождается его автоматической деактивизацией.
Реализация одного из вариантов аппаратного
Примеры
. Реализация одного из вариантов аппаратного подтверждения связи:
COM_RTS(2, .T.) // Запрос на передачу через порт 2
DO WHILE .NOT. COM_CTS(2)
*...
ENDDO
COM_SEND(2, "The quick brown fox jumps over the lazy dog")
See Also: COM_CLOSE()
COM_MCR()
COM_OPEN()
COM_SCOUNT()
Возвращает количество остающихся в буфере фоновой передачи символов.
------------------------------------------------------------------------------
Синтаксис
COM_SCOUNT(
Параметры
Возвращаемое значение
nLength - число символов в буфере передачи, ожидающих передачи, или
(-1) при задании неоткрытого порта.
Описание
Функция возвращает количество символов в заданном буфере, передача из
которого осуществляется в фоновом режиме.
Примеры
. Определение количества символов в буфере передачи:
nChar := COM_SCOUNT(1) // Число символов для порта 1
See Also: COM_OPEN()
COM_SEND()
COM_SFLUSH()
COM_SEND()
Осуществляет непосредственную или запускает фоновую передачу данных.
------------------------------------------------------------------------------
Синтаксис
COM_SEND(
ВНИМАНИЕ! Расширение предыдущей версии. Дополнительных параметров нет.
Параметры
последовательность передаваемых символов, а в виде числового
ASCII-кода одиночный передаваемый символ.
Возвращаемое значение
nLength - при успешной передаче данных 0, а иначе число символов,
которые не были переданы или
которые не были переданы или не могли быть помещены в буфер передачи.Описание
Функция позволяет передать один или несколько символов через заданный
порт в режиме как непосредственной, так и фоновой передачи (т.е. по
прерываниям). Режим фоновой передачи включается заданием размера
буфера передачи при вызове функции COM_OPEN().
Непосредственная передача
При непосредственной передаче данных выполнение программы может быть
продолжено, только когда все символы переданы через порт. В этом
режиме CT II не поддерживает программную приостановку передачи. А при
включенном режиме автоматической аппаратной приостановки передачи
может возникать особая ситуация.
Передающая станция приостанавливает передачу при обнаружении
деактивизации принимающей станцией CTS-сигнала, указывающей на не
готовность к передаче или, другими словами, на неготовность принимать
данные. При этом для предотвращения зависания Clipper-программы,
описываемая функция завершается и возвращает количество еще не
переданных символов.
Определить, был ли CTS-сигнал деактивизирован удаленной (принимающей)
станцией, можно вызовом функции COM_CTS().
Фоновая передача
В фоновом режиме поддерживается автоматическое выполнение как
программной, так и аппаратной приостановок передачи. При этом для
управления буфером передачи можно использовать специально введенные
функции. Например, COM_SMODE() позволяет определить, производится ли в
данный момент ожидание приема XON-символа для сброса приостановки
передачи. Поскольку такое ожидание может оказаться напрасным, можно
использовать функцию COM_FLUSH() для программной очистки буфера
передачи и завершения текущего сеанса передачи.
Примечания
. Программная приостановка поддерживается только при фоновом режиме
передачи. Поэтому в режиме непосредственной передачи рекомендуется
оперировать небольшими пакетами, регулярно анализируя
оперировать небольшими пакетами, регулярно анализируя значение,возвращаемое функцией COM_SOFT_R().
. Режим программной приостановки передачи включается функцией
COM_SOFT(), а аппаратной - COM_HARD().
Примеры
. Непосредственная передача через порт 1 (открытие без задания
буфера передачи):
COM_OPEN(1, 1000) // Только буфер приема
COM_HARD(.T.) // Аппаратная приостановка
ACCEPT "Пожалуйста, введите имя" TO cText
nRest := COM_SEND(1, cText) // Первая попытка передачи
DO WHILE nRest > 0
cText := RIGHT(cText, nRest) // Еще не переданные данные
nRest := COM_SEND(1, cText)
ENDDO
. Фоновая передача через порт 1:
COM_OPEN(1, 1000, 1000) // Буфер передачи 1000 байтов
cText := "Попытка" // Передаваемая информация
nRest := COM_SEND(1, cText) // Первая попытка передачи
DO WHILE nRest > 0
cText := RIGHT(cText, nRest) // Еще не переданные данные
nRest := COM_SEND(1, cText)
ENDDO
See Also: COM_HARD()
COM_INIT()
COM_OPEN()
COM_SOFT()
COM_SOFT_R()
COM_SETIO()
Изменяет базовый адрес ввода/вывода для последовательного порта.
------------------------------------------------------------------------------
Синтаксис
COM_SETIO(
Параметры
ввода/вывода в форме десятичного числа или строки, содержащей число в
шестнадцатеричной системе счисления. По умолчанию используются
соответствующие портам значения, приведенные во введении к данной
главе.
Возвращаемое значение
Функция позволяет адаптировать средства CT
lChanged - логическое значение .T. при успешной установке новогобазового адреса ввода/вывода, а иначе .F..
Описание
Функция позволяет адаптировать средства CT II к самым различным
интерфейсным адаптерам, базовые адреса ввода/вывода которых не
соответствуют исходным значениям, приведенным во Введении к данной
главе. Особенно это касается портов COM3 и COM4.
Примечания
. Функция проверяет, действительно ли порт доступен при выбранном
адресе ввода/вывода, и возвращает, соответственно, .T. или .F..
Примеры
. Задание базового адреса ввода/вывода для порта 2 десятичным числом:
COM_SETIO(2, 505) // .T., адрес = 1F8h
. Задание базового адреса ввода/вывода для порта 4 шестнадцатеричным
числом:
COM_SETIO(4, "1F8") // .T.
. Недопустимый адрес ввода/вывода (значение превышает 1023):
COM_SETIO(4, "10F8") // .F.
See Also: COM_GETIO()
COM_GETIRQ()
COM_SETIRQ()
COM_SETIRQ()
Изменяет номер линии запроса прерывания (IRQ) последовательного порта.
------------------------------------------------------------------------------
Синтаксис
COM_SETIRQ(
Параметры
десятичного числа в диапазоне от 2 до 15 или в виде символьной строки,
содержащей число в шестнадцатеричной системе счисления.
Возвращаемое значение
lChanged - логическое значение .T. при успешной установке заданного
номера IRQ, а иначе .F..
Описание
Используя линию запроса прерывания (IRQ), интерфейсный адаптер
уведомляет контроллер прерывания о приеме символа. Контроллер передает
задающие отступы текстовой области активного
? WFCOL(), WFCOL(.T.) // 11, 1? WFLASTROW(), WFLASTROW(.T.) // 19, 1
? WFLASTCOL(), WFLASTCOL(.T.) // 69, 1
INKEY(0)
WCLOSE()
RETURN
See Also: WBOX()
WFCOL()
WFLASTCOL()
WFORMAT()
WFROW()
WLASTROW()
WFORMAT()
Задает координаты текстовой области окна.
------------------------------------------------------------------------------
Синтаксис
WFORMAT([
Параметры
задающие отступы текстовой области активного окна от первой строки,
первого столбца, последней строки и последнего столбца соответственно.
По умолчанию ранее установленные границы отменяются.
Возвращаемое значение
nWindow - номер дескриптора активного окна.
Описание
Функция выделяет область вывода текстовой информации из всей
действительной площади окна. Она позволяет определить поле между
текстом и обрамлением окна, куда нельзя осуществлять вывод.
Поле между границами предыдущей и новой текстовой областью
определяется четырьмя параметрами.
Примечания
. Величина суммы значений параметров
значений параметров
превышать его ширину по внутренним границам. При любом размере
окна его текстовую область можно уменьшить до размера одного
символа.
. Отрицательные значения параметров увеличивают текстовую
область, а положительные уменьшают. Вызов данной функции с
отрицательными значениями параметров, превышающими по абсолютной
величине размеры физического экрана, расширяет текстовую область до
эту информацию процессору, вызывающему сервисную
эту информацию процессору, вызывающему сервисную программу черезсоответствующий вектор прерывания.
Системы XT имеют 8 доступных линий прерывания, а АТ - более 16. Как
правило, некоторые из них заняты другими внешними устройствами.
Распределение новых IRQ требует серьезной технической подготовки.
Определить номер IRQ, который доступен и еще не используется, можно с
помощью технической документации на компьютер с учетом конфигурации
установленных внешних устройств.
Обычно IRQ 0 и 1 назначены для внутреннего использования (таймеры),
2 и 9 - для сетевых адаптеров, 5 и 7 - для принтера, а 6 и 14 - для
гибких и жестких дисков. К сожалению, для последовательных портов нет
установленных стандартов, особенно для COM3 и COM4.
Внимание!
Как видно из приведенной во Введении к данной главе таблицы
установочных значений, CT II поддерживает совместно используемые
прерывания, т.е. использование одной и той же линии запроса прерывания
для нескольких портов. Однако стандартные аппаратные средства
последовательного интерфейса обычно не поддерживают совместно
используемые прерывания. Для этой цели производителями аппаратуры
выпускаются специальные многопортовые адаптеры, но работа с ними не
гарантируется.
Примечания
. Базовые установки, которые использует CT II для COM1 - COM4,
описаны во Введении.
. Функция не проверяет, действительно ли порт использует выбранную
линию IRQ.
Примеры
. Установка портов 3 и 4 на IRQ с номером 5 осуществляется за 2
вызова:
? COM_SETIRQ(3, 5) // .T.
? COM_SETIRQ(4, 5) // .T.
. Установка порта 4 на IRQ с номером 10, заданное в символьной форме
шестнадцатеричной цифрой A:
? COM_SETIRQ(4, "A") // .T.
. Задание недопустимого значения номера IRQ:
? COM_SETIRQ(2, 0) // .F. (зарезервировано для таймера)
Очищает буфер передачи при работе
? COM_SETIRQ(3, "10") // .F. (десятичное 16)See Also: COM_GETIO()
COM_GETIRQ()
COM_SETIO()
COM_SFLUSH()
Очищает буфер передачи при работе в фоновом режиме.
------------------------------------------------------------------------------
Синтаксис
COM_SFLUSH(
Параметры
Возвращаемое значение
lDeleted - логическое значение .T. при успешной очистке буфера
передачи, а иначе .F..
Описание
Функция позволяет прерывать сеанс передачи путем установки в 0
счетчика ожидающих передачи символов. Это используется при нарушениях
в процессе управления данными в режиме автоматической программной
приостановки передачи, например, в случае превышения на передающей
станции таймаута ожидания XON-символа (сброса приостановки передачи).
Примечания
. Функция оказывает действие только на открытый порт.
. Выполнение функции не зависит от наличия символов в буфере
передачи.
Примеры
. Очистка буфера передачи для прерывания сеанса при задержке
получения XON-символа более 30 с:
nStart := SECONDS() // Момент начала передачи
COM_SEND(2, cSendText)
IF ISBIT(COM_SMODE(2), 2) // Ожидание XON
IF SECONDS() - nStart > 30 // Задержка >30с?
COM_SFLUSH(2) // Очистка буфера передачи
ENDIF
ENDIF
See Also: COM_SCOUNT()
COM_SMODE()
COM_SKEY()
Инсталлирует коды для отслеживания фоновой передачи.
------------------------------------------------------------------------------
Синтаксис
COM_SKEY([
[
команде SET KEY TO, или
Параметры
клавиши, помещаемый в буфер клавиатуры в начале процесса программной
или аппаратной приостановки передачи.
Параметр задается в формате числового значения INKEY-кода,
используемого в Clipper- команде SET KEY TO, или в формате символьной
строки. По умолчанию отслеживание процесса приостановки передачи
отключается.
клавиши, помещаемый в буфер клавиатуры при полном освобождении буфера
передачи.
Параметр задается в формате числового значения INKEY-кода,
используемого в Clipper-команде SET KEY TO, или в формате символьной
строки. По умолчанию отслеживание очистки буфера передачи отключается.
Возвращаемое значение
lActive - логическое значение .T. при успешной инсталляции кода для
отслеживания, а иначе .F..
Описание
Функция обеспечивает отслеживание в процессе фоновой передачи
аппаратной и программной приостановки, а также дистанционной очистки
буфера передачи. Код символа, заданный параметром
программной или аппаратной приостановки передачи.
В зависимости от того, какой режим приостановки был установлен -
аппаратный (вызовом COM_HARD()) или программный (вызовом COM_SOFT()) -
это событие фиксируется средствами обслуживания последовательного
интерфейса по деактивизации входного CTS-сигнала или по приему
передающей станцией XOFF-символа.
Код символа, заданный параметром
буфер клавиатуры, когда буфер передачи становится пустым. Это обычно
связано либо с окончанием передачи данных в фоновом режиме, либо с
приемом передающей станцией символа прекращения
приемом передающей станцией символа прекращения передачи,инсталлируемого функцией COM_REMOTE().
Описываемая функция позволяет реагировать на происшедшее событие
обычным способом обработки прерываний по нажатию клавиш, а не
опрашивать состояние буфера передачи постоянно. Событие,
инициировавшее прерывание, можно идентифицировать с помощью функции
COM_SMODE().
Примечания
. Внимание! Функцию необходимо вызывать заново после обработки
каждого прерывания.
Примеры
. Отслеживание начала программной и аппаратной приостановки передачи
для порта 2:
SET KEY 225 TO HANDSHAKE
? COM_SKEY(2, 225) // .T. в случае успеха
COM_SOFT(2, .T.) // Включение режима программной
// приостановки передачи
COM_HARD(2, .T.) // Включение режима аппаратной
// приостановки передачи
COM_SEND(2, LongText) // Передача длинного текста
. Обрабатывающая прерывания процедура всегда получает параметры:
PROCEDURE HANDSHAKE (A, B, C)
* Здесь должна помещаться программа обработки прерывания
COM_SKEY(2, 225) // Должно быть восстановлено
// отслеживание
RETURN
. Отслеживание опустошения буфера передачи порта 2:
COM_SKEY(2, , 225) // Помещается код 225
See Also: COM_SOFT()
LASTKLINE()
LASTKPROC()
LASTKFUNC()
COM_SMODE()
Возвращает код текущего состояния передачи в фоновом режиме.
------------------------------------------------------------------------------
Синтаксис
COM_SMODE(
Параметры
Возвращаемое значение
nSendMode - числовой код, содержащий комбинацию битов, значение
Функция позволяет уточнить текущее состояние
которых приведено в таблице:Таблица 3-6. Кодирование состояния передачи в фоновом режиме
--------------------------------------------------------------------
Бит Число Симв. константа Значение
--------------------------------------------------------------------
0 SMODE_NONE Фоновая передача не активизирована
1 1 SMODE_EMPTY Буфер передачи пуст
2 2 SMODE_SOFT Ожидание сброса программной приостановки
передачи (XON)
3 4 SMODE_HARD Ожидание сброса аппаратной приостановки
передачи (CTS)
4 8 SMODE_RFLUSH Буфер передачи очищен дистанционно
--------------------------------------------------------------------
Описание
Функция позволяет уточнить текущее состояние процесса фоновой
передачи, в том числе, определить факт автоматической программной
приостановки передачи по получении XOFF-символа (до получения XON), а
также факт прекращения передачи по получении символа дистанционной
очистки буфера передачи.
Примечания
. Функция возвращает 0, если при вызове функции COM_OPEN() не был
включен фоновый режим (не задан размер буфера передачи).
Примеры
. Проверка освобождения буфера передачи порта 2:
IF ISBIT(COM_SMODE(2), 1)
? "Буфер передачи порта 2 пуст!"
ENDIF
. Ожидание получения XON-символа в течение 20 с:
WAITPERIOD(2000)
DO WHILE ISBIT(COM_SMODE(2), 2) .AND. WAITPERIOD()
*...
ENDDO
. Очистка буфера передачи при неполучении символа XON:
IF ISBIT(COM_SMODE(2), 2)
COM_SFLUSH(2) // Очистка буфера передачи
ENDIF
See Also: COM_HARD()
COM_REMOTE()
COM_SFLUSH()
COM_SOFT()
COM_SOFT()
Переключает режим автоматической программной приостановки передачи.
автоматической программной приостановки передачи. По
------------------------------------------------------------------------------Синтаксис
COM_SOFT(
[
Параметры
значении .T. включение, а при значении .F. выключение режима
автоматической программной приостановки передачи. По умолчанию текущий
режим не изменяется.
По умолчанию CHR(19) (комбинация клавиш
XOFF-символ. По умолчанию CHR(17) (комбинация клавиш
).
Возвращаемое значение
lOldHandshake - логическое значение .T. при предыдущем состоянии
режима во включенном состоянии, или .F. при выключенном.
Описание
Функция включает или выключает режим автоматической программной
приостановки передачи. Программная или аппаратная приостановка
передачи используется во избежание потери символов при переполнении
буфера приема, имеющего ограниченные размеры.
В режиме автоматической программной приостановки передачи при
заполнении буфера приема на 75% принимающая станция посылает
передающей стороне XOFF-символ.
После освобождения буфера на 50% или более, принимающая станция для
сброса приостановки передачи передает XON-символ. В прикладных
протоколах могут быть заданы любые символы вместо используемых по
умолчаниюи соответственно.
Примечания
. Автоматическая программная приостановка передачи поддерживается
только в режиме фоновой передачи данных, активизируемом вызовом
При передаче двоичных данных без
функции COM_OPEN() с заданием размера буфера передачи.
. При передаче двоичных данных без использования специальных
протоколов режим автоматической программной приостановки передачи
должен быть выключен.
Примеры
. Активизация режима программной приостановки передачи:
COM_OPEN(1, 1000, 1000) // Открытие порта с активизацией
// фоновой передачи
COM_SOFT(1, .T.) // Активизация автоматической
// программной приостановки передачи
See Also: COM_HARD()
COM_SOFT_R()
COM_SOFT_S()
COM_SOFT_R()
Возвращает состояние флага ожидания по получении XOFF-символа.
------------------------------------------------------------------------------
Синтаксис
COM_SOFT_R(, [ ]) --> lOldXOFF
Параметры
- номер последовательного порта в диапазоне от 1 до 4.
- необязательный логический параметр, задающий при значении
.T. установку, а при значении .F. или по умолчанию сброс флага
ожидания по получении XOFF-символа.
Возвращаемое значение
lOldXOFF - логическое значение .T. по получении портом XOFF-символа,
не сброшенного XON-символом, а иначе .F..
Описание
Функция возвращает состояние внутреннего флага, устанавливаемого CT II
по получении XOFF-символа в режиме программной приостановки передачи.
Получение XON-символа вызывает сброс этого флага. Поскольку возможны
случаи, когда XON не посылается удаленной станцией, то флаг может быть
сброшен заданием значения .F. параметра.
Примечания
. При использовании описываемой функции для организации наблюдения
за поступлением XOFF-символов рекомендуется передавать информацию
небольшими пакетами.
Примеры
. Программная реализация неавтоматической приостановки передачи
при заполнении буфера приема на
данных путем отслеживания XOFF-символа:
* Открытие порта с активизацией режима непосредственной передачи
COM_OPEN(1, 1000)
* Передача данных до приема XOFF-символа
nPos := 1
DO WHILE .NOT. COM_SOFT_R(1) .AND. nPos <= LEN(cString)
COM_SEND(1, SUBSTR(cString, nPos, 1))
nPos := nPos + 1
ENDDO
See Also: COM_SEND()
COM_SOFT()
COM_SOFT_S()
Возвращает флаг автоматической посылки XOFF-символа.
------------------------------------------------------------------------------
Синтаксис
COM_SOFT_S() --> lXOFF
Параметры
- номер последовательного порта в диапазоне от 1 до 4.
Возвращаемое значение
lXOFF - логическое значение .T. при заполнении буфера приема на 75%
или более, а иначе .F..
Описание
Функция возвращает состояние флага, устанавливаемого при посылке
XOFF-символа в процессе автоматической программной приостановки
передачи. Посылка XON-символа при освобождении буфера до 50% вызывает
сброс этого флага.
Примечания
. Выбор оптимального размера буфера приема зависит от скорости
передачи и рассчитывается, исходя из необходимости обеспечивать прием
символов, передаваемых удаленной стороной до ее реакции на
приостановку передачи.
Другими словами, 25% объема буфера должны вместить то количество
символов, которое может быть передано за время равное сумме удвоенного
времени распространения и времени реакции программы.
Примеры
. Освобождение буфера приема по флагу автоматической передачи XOFF:
IF = COM_SOFT_S(1)
? "Пора освободить буфер!"
...
ENDIF
See Also: COM_READ()
COM_SOFT()
XMOBLOCK()
Формирует блок данных для передачи по протоколу XMODEM.
------------------------------------------------------------------------------
символьная строка, которая должна содержать
Синтаксис
XMOBLOCK(, [ ],
[], [ ]) --> cXModemBlock
Параметры
- символьная строка, которая должна содержать в зависимости
от значения параметра128 или 1024 символов. При превышении
длины лишние символы отбрасываются, а при меньшей длине недостающие
дополняются CHR(0).
- необязательный числовой параметр, задающий номер
формируемого блока. По умолчанию 0.
- необязательный логический параметр, задающий при значении .T.
формирование 16-битового CRC-кода, а при значении .F. или по умолчанию
формирование простой 8-битовой контрольной суммы.
- необязательный числовой параметр, задающий тип формируемого
блока. Значению 1 соответствует блок размером 128 байтов,
начинающийся с символа CHR(1), а значению 2 - блок размером 1 Кбайт,
начинающийся с символа CHR(2). По умолчанию 1 (блок 128 байтов).
Возвращаемое значение
cXModemBlock - символьная строка, содержащая блок, готовый для
передачи в соответствии с протоколом XMODEM.
Описание
Функция генерирует в соответствии с протоколом XMODEM блок данных,
который может быть передан функцией COM_SEND() без дополнительной
обработки. Автоматически учитывается, что после блока с номером 255 по
протоколу XMODEM ожидается блок с номером 0 (<номер блока> % 256). Это
позволяет обойтись без проверки переполнения номера блока, который
передается одним байтом.
Блок данных по протоколу XMODEM может быть представлен в одном из
четырех допустимых форматов:
. Формат блока данных длиной 128 байтов с простой 8-битовой
контрольной суммой:
CHR(1) + <номер блока> + <дополнение номера блока> +;
<128 байтов данных> + <1 байт контрольной суммы>
Формат блока данных длиной 128
. Формат блока данных длиной 128 байтов с контролем по CRC-коду:
CHR(1) + <номер блока> + <дополнение номера блока> +;
<128 байтов данных> + <2 байта CRC-кода>
. Формат блока данных длиной 1024 байта с простой 8-битовой
контрольной суммой:
CHR(2) + <номер блока> + <дополнение номера блока> +;
<1024 байта данных> + <1 байт контрольной суммы>
. Формат блока данных длиной 1024 байта с контролем по CRC-коду:
CHR(2) + <номер блока> + <дополнение номера блока> +;
<1024 байта данных> + <2 байтa CRC-кода>
Примечания
. Простая 8-битовая контрольная сумма вычисляется по алгоритму:
NUMLOW(ASCIISUM(<данные>))
. В состав программных примеров, поставляемых с CT II, входит
Clipper-программа, реализующая протокол XMODEM.
. CRC-кодом называется контрольная порция информации (обычно
добавляемая к основной), формируемая по правилам умножения полиномов и
позволяющая выявлять, а в некоторых случаях и исправлять ошибки,
возникющие при передаче двоичной информации.
. МККТТ - Международный консультативный комитет по телефонии и
телеграфии - международная организация, вырабатывающая рекомендации по
стандартизации технических и программных средств передачи информации.
Примеры
. Передача по упрощенному протоколу XMODEM (подразумевается
предварительная инициализация порта):
nBlockNum := 0 // Первый блок
lChkMode := .T. // Использование CRC
nBlkSize := 128 // Размер блока
nPointer := 0 // Начальное смещение в файле
* Чтение первой порции данных
cData := FILESTR("TEST.TXT", nBlkSize, nPointer)
DO WHILE LEN(cData) > 0
Функция не оказывает воздействия на
размеров окна.
. Функция не оказывает воздействия на физический экран (окно с
дескриптором 0).
. Поместить текст на обрамление окна (см. функцию WBOX()) можно
командой @...SAY... с отрицательным значением номера строки вывода
Например, заголовок окна можно вывести командой:
@ -1, 5 SAY "Помощь при вводе"
Примеры
. Задание текстовой области окна, отстоящей как от верхней, так и
от нижней границы на одну строку, а также на два столбца как от
правой, так и от левой границы. В результате текстовая область станет
меньше на 2 строки и 4 столбца:
WSELECT(nWindow)
WFORMAT(1, 2, 1, 2)
. Отмена всех предварительно установленных границ для
обеспечения возможности записи в пределах всего окна:
WFORMAT()
See Also: WBOX()
WSELECT()
WFROW()
Возвращает позицию первой строки текстовой области окна.
------------------------------------------------------------------------------
Синтаксис
WFROW([]) --> nValue
Параметры
- необязательный логический параметр, задающий при
значении .T. возврат абсолютного значения разности между WROW() и
WFROW(), а при значении .F. или по умолчанию возврат позиции первой
строки текстовой области окна.
Возвращаемое значение
nValue - номер первой строки текстовой области окна, или величина
разности позиций границы окна и первой строки текстовой области.
Описание
Функция может использоваться для сохранения информации из окна в
файле. Имеется четыре функции, возвращающие координаты текстовой
области окна. Возвращаемое ими значение может быть сохранено и
использовано в программе позже.
Для получения без дополнительных вычислений величины разности между
позициями соответствующей границы окна и первой строки текстовой
Проверяет полученный блок на соответствие
* Передача блока
COM_SEND(1, XMOBLOCK(cData, nBlockNum, lChkMode))
nBlockNum := nBlockNum +1 // Следующий блок
nPointer := nPointer +nBlkSize // Смещение в файле
* Чтение следующей порции данных
cData := FILESTR("TEST.TXT", nBlkSize, nPointer)
ENDDO
See Also: COM_CRC()
XMOCHECK()
Проверяет полученный блок на соответствие протоколу XMODEM.
------------------------------------------------------------------------------
Синтаксис
XMOCHECK(, [ ]) --> nBlockNumber
Параметры
- символьная строка, содержащая проверяемый блок данных.
- необязательный логический параметр, задающий при значении .T.
проверку по 16-битовому CRC-коду, а при значении .F. или по умолчанию
проверку по простой 8-битовой контрольной сумме.
Возвращаемое значение
nBlockNumber - номер блока в диапазоне от 0 до 255 при соответствии
блока протоколу XMODEM, а иначе (-1).
Описание
Функция проверяет полученный блок на соответствие протоколу XMODEM.
Способ проверки задается параметром, а длина проверяемого блока
опознается по заголовку, имеющему значение CHR(1) для 128-байтового и
CHR(2) для 1024-байтового блока. Если ошибок не обнаружено, то
возвращается номер блока.
Примечания
. Выделение информации после проверки блока может быть осуществлено
вызовом SUBSTR(cBlock, 4, 128) для 128-байтового блока или
SUBSTR(cBlock, 4, 1024) для 1024-байтового блока.
. В состав программных примеров, поставляемых с CT II, входит
Clipper-программа, реализующая протокол XMODEM.
. CRC-кодом называется контрольная порция информации (обычно
добавляемая к основной), формируемая по правилам умножения полиномов и
Международный консультативный комитет по телефонии
позволяющая выявлять, а в некоторых случаях и исправлять ошибки,
возникающие при передаче двоичной информации.
. МККТТ - Международный консультативный комитет по телефонии и
телеграфии - международная организация, вырабатывающая рекомендации по
стандартизации технических и программных средств передачи информации.
Примеры
. Прием блока, проверка и выделение информации (на практике
необходимо проверять и факт получения следующего блока):
cBlock := COM_READ(1) // Если принято 132 символа,
nBlkNr := XMOCHECK(cBlock) // то проверка по простой
// контрольной сумме
IF nBlkNr >= 0 // Если нет ошибок, то
cData := SUBSTR(cBlock, 4, 128) // выделение информации
*...
ENDIF
See Also: XMOBLOCK()
ZEROINSERT()
Вставляет нулевые биты после идущих подряд пяти единичных.
------------------------------------------------------------------------------
Синтаксис
ZEROINSERT() --> cDataBlock
Параметры
- обрабатываемая символьная строка.
Возвращаемое значение
cDataBlock - символьная строка со вставленными нулевыми битами.
Описание
Функция включена в CT II для упрощения программирования протоколов
передачи данных, рекомендуемых МККТТ (CCITT).
По рекомендациям МККТТ для сетей с пакетной коммутацией каждый кадр
(блок данных) должен иметь начальный и конечный флаги, содержащие
комбинацию битов "01111110". Для того, чтобы битовая комбинация флага
не появлялась внутри данных, перед передачей после каждых подряд
идущих пяти единичных битов вставляется нулевой бит.
Использование таких флагов позволяет достаточно быстро восстанавливать
синхронизацию в случае ошибок передачи данных и широко применяется,
Максимально размер возвращаемой символьной строки
например, в сетях Х.25 и ISDN (Integrated Services Digital Network -
цифровая сеть с предоставлением комплексных услуг).
Примечания
. Максимально размер возвращаемой символьной строки может превышать
размер исходной на 20% и рассчитывается по формуле:
nMaxLen = LEN(cString) + CEILING(LEN(cString)/5)
. МККТТ - Международный консультативный комитет по телефонии и
телеграфии - международная организация, вырабатывающая рекомендации по
стандартизации технических и программных средств передачи информации.
Примеры
. Проверка достаточности доступной памяти для результирующей строки:
cChar := CHR(CTON("11111111", 2))
cString := REPLICATE(cChar, 6)
nMaxLen := LEN(cString) + CEILING(LEN(cString) / 5) // Здесь: 8
IF nMaxLen < MEMORY(1) * 1024 - 100
cString := ZEROINSERT(cString)
ENDIF
. Формирование кадра:
cFlag := CHR(CTON("01111110", 2)) // По рекомендации
// МККТТ
cData := "Это передаваемый текст"
CRC := COM_CRC(cData)
cBlock :=cData + SUBSTR(L2BIN(CRC), 1, 2) // Добавление CRC
// к информационной
// части кадра
cBlock := ZEROINSERT(cBlock)
cBlock := cFlag + cBlock + cFlag
See Also: COM_CRC()
ZEROREMOVE()
ZEROREMOVE()
Удаляет нулевые биты, вставленные ZEROINSERT().
------------------------------------------------------------------------------
Синтаксис
ZEROREMOVE() --> cString
Параметры
- символьная строка, содержащая обрабатываемый кадр.
Возвращаемое значение
cString - символьная строка в состоянии до выполнения функции
нулевой бит после идущих подряд
ZEROINSERT().
Описание
Функция выполняет обратное ZEROINSERT() действие, удаляя каждый
нулевой бит после идущих подряд пяти единичных (ранее вставленных в
соответствии с рекомендацией МККТТ (CCITT)). Удаление битов сокращает
блок максимум на 20%.
Примеры
. Формирование кадра и его прием:
cFlag := CHR(CTON("01111110", 2)) // По рекомендации
// МККТТ
cData := "Это передаваемый текст"
CRC := COM_CRC(cData)
cBlock :=cData + SUBSTR(L2BIN(CRC), 1, 2) // Добавление CRC
// к информационной
// части кадра
cBlock := ZEROINSERT(cBlock)
cBlock := cFlag + cBlock + cFlag
* Здесь должна располагаться часть программы, осуществляющая передачу
* кадра
cData := REMALL(cFlag, cBlock) // Удаление флагов
cData := ZEROREMOVE(cData)
* Далее необходимо проверить CRC и т.д.
See Also: ZEROINSERT()
Введение в обработку строк
------------------------------------------------------------------------------
ADDASCII() Добавляет число к ASCII-коду каждого символа строки
AFTERATNUM() Возвращает остаток строки после искомого вхождения подстроки
ASCIISUM() Возвращает сумму ASCII-кодов всех символов строки
ASCPOS() Возвращает ASCII-код символа, находящегося в заданной позиции
ATADJUST() Выравнивает искомую подстроку по заданной позиции
ATNUM() Возвращает позицию начала искомой подстроки в строке
ATREPL() Заменяет искомую подстроку в строке на заданную
ATTOKEN() Возвращает позицию элемента в строке
BEFORATNUM() Возвращает часть строки перед искомым вхождением подстроки
CENTER() Центрирует и расширяет строку
CHARADD() Суммирует ASCII-коды символов двух строк
Возвращает строку, содержащую символы четных
CHARAND() Логически умножает ASCII-коды символов двух строк
CHAREVEN() Возвращает строку, содержащую символы четных позиций
CHARLIST() Составляет список символов, входящих в исходную строку
CHARMIRR() Зеркально переворачивает строку
CHARMIX() Смешивает символы двух строк
CHARNOLIST() Составляет список символов, отсутствующих в исходной строке
CHARNOT() Инвертирует биты каждого символа строки
CHARODD() Возвращает строку, содержащую символы нечетных позиций
CHARONE() Удаляет из строки одинаковые смежные символы, оставляя один
CHARONLY() Возвращает строку символов, общих для двух заданных строк
CHAROR() Логически складывает ASCII-коды всех символов двух строк
CHARPACK() Возвращает упакованную строку
CHARRELA() Определяет одинаковую позицию вхождения для пар строк
CHARRELREP() Заменяет символы в одинаковых позициях вхождения в парах строк
CHARREM() Удаляет из строки указанные символы
CHARREPL() Заменяет в строке заданные символы
CHARSORT() Сортирует подстроки внутри строки
CHARSPREAD() Возвращает строку с расширенными промежутками между элементами
CHARSWAP() Попарно переставляет символы в строке
CHARUNPACK() Распаковывает упакованную строку
CHARXOR() Суммирует "по модулю два" ASCII-коды всех символов двух строк
CHECKSUM() Возвращает контрольную сумму задаваемой строки
COUNTLEFT() Возвращает количество одинаковых символов в начале строки
COUNTRIGHT() Возвращает количество одинаковых символов в конце строки
CRYPT() Возвращает закодированную или декодированную строку
CSETATMUPA() Переключает режим работы функций семейства ATxxxx()
CSETREF() Переключает режим возврата значения при передаче по ссылке
EXPAND() Расширяет строку за счет промежутков между символами
JUSTLEFT() Переносит символы из начала строки в конец
JUSTRIGHT() Переносит символы из конца строки в начало
LIKE() Сравнивает строки с учетом символов сопоставления
Возвращает размер самой длинной строки
LTOC() Преобразует логическое значение в символьное
MAXLINE() Возвращает размер самой длинной строки в тексте
NUMAT() Возвращает количество вхождений подстроки в строку
NUMLINE() Возвращает количество необходимых для вывода текста строк
NUMTOKEN() Возвращает количество элементов в строке
PADLEFT() Дополняет строку до заданной длины слева
PADRIGHT() Дополняет строку до заданной длины справа
POSALPHA() Возвращает номер позиции первого буквенного символа
POSCHAR() Заменяет символ в заданной позиции символьной строки
POSDEL() Удаляет группу символов, начиная с заданной позиции строки
POSDIFF() Возвращает позицию первого отличия двух строк
POSEQUAL() Возвращает позицию первого совпадения двух строк
POSINS() Вставляет символы в заданную позицию строки
POSLOWER() Возвращает позицию первой строчной/прописной буквы в строке
POSRANGE() Возвращает позицию символа в строке с ASCII-кодом диапазона
POSREPL() Заменяет с указанной позиции один или несколько символов
POSUPPER() Возвращает позицию первой прописной/строчной буквы в строке
RANGEREM() Удаляет из строки символы с ASCII-кодами заданного диапазона
RANGEREPL() Заменяет символы с ASCII-кодами заданного диапазона
REMALL() Удаляет заданные символы в начале и конце строки
REMLEFT() Удаляет заданные символы в начале строки
REMRIGHT() Удаляет заданные символы в конце строки
REPLALL() Заменяет заданные символы в начале и конце строки
REPLLEFT() Заменяет заданные символы в начале строки
REPLRIGHT() Заменяет заданные символы в конце строки
RESTTOKEN() Восстанавливает среду пошагового выделения элементов
SAVETOKEN() Сохраняет среду пошаговой детализации выделения элементов
SETATLIKE() Переключает режим сопоставления для функций семейства ATxxxx()
STRDIFF() Определяет степень различия двух строк
STRSWAP() Производит взаимный обмен символов двух строк
TABEXPAND() Преобразует символы табуляции в последовательности символов
Выделяет из строки заданный по
TABPACK() Преобразует заданные повторяющиеся символы в символы табуляции
TOKEN() Выделяет из строки заданный по номеру элемент
TOKENAT() Возвращает позицию последнего выделенного TOKENNEXT() элемента
TOKENEND() Возвращает признак окончания элементов, выделяемых TOKENNEXT()
TOKENINIT() Инициализирует строку для выделения элементов TOKENNEXT()
TOKENLOWER() Преобразует первые буквы задаваемых элементов в строчные
TOKENNEXT() Возвращает следующий элемент при пошаговом выделении
TOKENSEP() Возвращает разделители элемента, выделенного TOKEN()
TOKENUPPER() Преобразует первые буквы задаваемых элементов в прописные
VALPOS() Возвращает числовое значение цифрового символа
WORDONE() Удаляет из строки повторяющиеся пары символов
WORDONLY() Возвращает строку подстрок, общих для двух заданных строк
WORDREPL() Заменяет заданные пары символов
WORDSWAP() Меняет местами соседние двухбайтовые слова в строке
WORDTOCHAR() Заменяет заданные двухбайтовые слова на одиночные символы
Введение
------------------------------------------------------------------------------
В данной главе описываются мощные функции для обработки символьных
строк. Благодаря тому, что они написаны исключительно на Ассемблере,
скорость их работы весьма высока.
Передача параметров по ссылке
Многим функциям, описанным в этой главе, параметры можно передавать
по ссылке. Поясним это понятие.
Начиная с версии Summer'87 функциям пользователя параметры
(аргументы) можно передавать по ссылке. Это означает передачу
вызываемой функции ссылки на строку вместо создания копии строки.
При передаче параметров таким способом их изменение в вызываемой
функции приводит к изменению оригинала. Некоторые CT II-функции
допускают передачу им части параметров по ссылке. В описании таких
функций эти параметры помечаются комбинацией "[@]", а поведение самих
функций определяется способом передачи параметров
функций определяется способом передачи параметров при вызове.
Передача по ссылке имеет свои достоинства и недостатки. Недостатком
является зависимость функции от метода ее использования. А наиболее
важным достоинством - экономия памяти, позволяющая избежать ошибок
времени выполнения из-за нехватки памяти при обработке строк.
В обычной ситуации для изменения исходной строки (переданной по
значению) после выполнения функции измененную строку необходимо
присвоить первоисточнику:
VAR := "Привет"
VAR := FUNCTION(VAR)
При работе с большими строками это требует времени и памяти!
Вот пример использования метода передачи по ссылке:
VAR := "Привет"
FUNCTION(@VAR)
Для большинства CT II-функций передача по ссылке не дает никаких
дополнительных эффектов, и лишь для некоторых может влиять на
характер выполнения. При этом функция непосредственно изменяет
значения символьных переменных, переданных по ссылке, что экономит
память и ускоряет обработку, поскольку не осуществляется
дополнительное копирование.
Функциям, увеличивающим длину строки, нельзя передавать параметры
по ссылке. Ниже приводится список функций, которые могут изменять
длину строки:
ATREPL() CHARONE() POSDEL() WORDONE()
CHAREVEN() CHARONLY() POSINS() WORDONLY()
CHARODD() CHARREM() POSREPL() WORDTOCHAR()
CSETREF()
Эта функция позволяет оптимизировать скорость вычислений и
использование памяти функциями, допускающими передачу параметров по
ссылке. Более подробная информация о ее использовании приводится в
описаниях соответствующих функций.
CHR(26) - маркер конца файла
В строке, возвращаемой такими функциями, как CRYPT(), CHARPACK() и
многими другими, могут присутствовать символы CHR(26), что может
вызывать проблемы при сохранении информации
вызывать проблемы при сохранении информации в memo-полях или в файлах.
Этот символ используется как маркер конца файла и располагающаяся за
ним информация при чтении может стать недоступна.
Способом предотвращения такой потери информации является удаление
CHR(26) из символьной строки или замена его другими символами. Для
этого может быть предложено несколько решений, примеры которых
приведены ниже.
Короткие строки
В строке длиной менее 256 байтов не могут появляться все символы
ASCII-кода, поэтому, выявив присутствие CHR(26), можно определить
перечень неиспользуемых символов и один из них выделить для замены:
IF (CHR(26) $ cString) .AND. (LEN(cString) < 256)
cList := CHARNOLIST(cString) // Все отсутствующие символы
CHARREPL(CHR(26), @cString, cList)
ENDIF
Длинные строки
В более длинных строках могут появляться все 256 символов ASCII-кода,
поэтому, выявив присутствие CHR(26), можно используя функцию
ZEROINSERT(), преобразовать исходную строку таким образом, что в ней
после каждых пяти подряд идущих битов со значением 1 будет вставлен
бит со значением 0. Благодаря этому в новой строке не будет ни одного
байта со всеми единицами - CHR(255), которым можно заменить все
CHR(26):
cString := ZEROINSERT(cString)
CHARREPL(CHR(26), @cString, CHR(255))
После чтения следует произвести обратное преобразование:
CHARREPL(CHR(255), @cString, CHR(26))
cString := ZEROREMOVE(cString)
ADDASCII()
Добавляет число к ASCII-коду каждого символа строки.
------------------------------------------------------------------------------
Синтаксис
ADDASCII([@], , [ ]) --> cAddString
Параметры
[@]- символьный параметр, допускающий передачу по ссылке и
Применение этой функции облегчает использование
задающий обрабатываемую символьную строку.
- числовое значение, добавляемое к ASCII-коду символов.
- необязательный числовой параметр, задающий позицию
символа, к ASCII-коду которого добавляется. По умолчанию
позиция последнего символа.
Возвращаемое значение
cAddString - модифицированная символьная строка.
Описание
Применение этой функции облегчает использование макросов, т.к.
позволяет изменить строку, не прибегая к функциям типа LEFT(),
RIGHT(), ASC() или SUBSTR() (см. Примеры). Функция производит
преобразование символа по следующей формуле:
CHR((ASC(<Символ>) +) % 256)
Функция позволяет выполнять и вычитание, но для этого требуется
дополнительное преобразование. Параметрдолжен при этом,
учитывая предыдущую формулу, иметь значение:
= 256 - <значение, вычитаемое из ASCII-кода>
Примечания
. Еслинаходится вне строки , то строка остается
неизменной.
. Параметрможет быть передан по ссылке. При этом вызов
CSETREF(.T.), подавляющий возвращение функцией результата, позволяет
уменьшить потребности в рабочей памяти.
Примеры
. Добавление 1 к коду предпоследнего, а затем к коду последнего
символа в строке (CHR(ASC("2")+1) дает код символа "3" и т.д.):
? ADDASCII("macro21", 1, 6) // "macro31"
? ADDASCII("macro21", 1) // "macro22"
. Вычитание 32 для преобразования латинских строчных букв в
прописные по формуле CHR((ASC("m") + 256 - 32) % 256):
? ADDASCII("macro21", 224, 1) // "Macro21"
области можно вызвать данную функцию
области можно вызвать данную функцию со значением .T. параметра
. Полученное значение может быть позже передано функции
WFORMAT() для восстановления прежнего размера текстовой области окна.
Примечания
. Для физического экрана (окна с дескриптором 0) данная функция
возвращает значение, соответствующее вызову WBOARD().
Примеры
. Каждая функция из семейства WFxxx() оперирует с активным
окном. Заметим, что вызов WBOX() соответствует вызову
WFORMAT(1, 1, 1, 1):
CLEAR
WOPEN(10, 10, 20, 70)
WBOX()
? WFROW(), WFROW(.T.) // 11, 1
? WFCOL(), WFCOL(.T.) // 11, 1
? WFLASTROW(), WFLASTROW(.T.) // 19, 1
? WFLASTCOL(), WFLASTCOL(.T.) // 69, 1
INKEY(0)
WCLOSE()
RETURN
See Also: WBOX()
WFCOL()
WFLASTCOL()
WFORMAT()
WLASTROW()
WROW()
WLASTCOL()
Возвращает позицию последнего столбца активного окна.
------------------------------------------------------------------------------
Синтаксис
WLASTCOL([]) --> nColumn
Параметры
- необязательный логический параметр, задающий при
значении .T. возврат позиции последнего столбца активного окна,
получаемой после вызова функции WCENTER(), а при значении .F. или по
умолчанию возврат значения текущей позиции последнего столбца.
Возвращаемое значение
nColumn - номер последнего столбца активного окна в координатах
физического экрана.
Описание
Функция возвращает номер последнего столбца (правой границы) активного
окна. Возвращаемое значение может превышать номер последнего столбца
экрана, это означает, что правая граница окна находится вне области
видимости.
Кроме того, при значении .T.
Возвращает остаток строки после искомого
See Also: CSETREF()
AFTERATNUM()
Возвращает остаток строки после искомого вхождения подстроки.
------------------------------------------------------------------------------
Синтаксис
AFTERATNUM(, ,
[], [ ]) --> cAfterString
Параметры
- символьный параметр, задающий искомую подстроку.
- символьный параметр, задающий обрабатываемую строку.
- необязательный числовой параметр, задающий номер искомого
вхожденияв . По умолчанию осуществляется поиск
последнего вхождения.
- необязательный числовой параметр, задающий количество
символов с начала строки, исключаемых из поиска.
По умолчанию 0.
Возвращаемое значение
cAfterString - остаток строки, начиная с первого символа,
следующего после вхождения искомой подстроки с номером.
Если последний символ обрабатываемой строки является также последним
и в искомой подстроке, или искомое вхождение не найдено, то
возвращается пустая строка.
Описание
Функция находит требуемое по номеру вхождение подстроки
в строкеи возвращает ее остаток, начинающийся с первого
символа, следующего за искомым вхождением.
Для поиска требуемого по номеру вхождения подстроки функция
просматривает, начиная слева, обрабатываемую строку, осуществляя поиск
каждого вхождения. В зависимости от состояния режима прохода по
символам, переключаемого функцией CSETATMUPA(), дальнейший поиск
продолжается с символа, следующего либо за последним (режим включен),
либо за первым (режим выключен) символом последнего вхождения.
Примечания
. Применение функции SETATLIKE() позволяет организовать поиск по
Обратите внимание на влияние режима
образцу.
Примеры
. Поиск последнего вхождения:
CSETATMUPA(.T.)
? AFTERATNUM("aa", "aBaaBaaaX") // "X"
CSETATMUPA(.F.)
? AFTERATNUM("aa", "aBaaBaaaX) // "aX"
. Поиск третьего вхождения с пропуском четырех первых символов.
Обратите внимание на влияние режима прохода по символам на
результаты:
String := " AxxBBBBxxCCCCxxxDxxEExx"
CSETATMUPA(.T.)
? AFTERATNUM("xx", String, 3, 4) // "DxxEExx"
CSETATMUPA(.F.)
? AFTERATNUM("xx", String, 3, 4) // "EExx"
See Also: CSETATMUPA()
SETATLIKE()
ASCIISUM()
Возвращает сумму ASCII-кодов всех символов строки.
------------------------------------------------------------------------------
Синтаксис
ASCIISUM() --> nASCIISum
Параметры
- символьный параметр, задающий обрабатываемую строку.
Возвращаемое значение
nASCIISum - числовое значение суммы ASCII-кодов.
Описание
Функция позволяет формировать простые контрольные суммы для символьных
строк, что может применяться для выявления искажений при передаче
данных.
Примечания
. Функция не учитывает позиции символов, т.е. не может быть выявлен
факт перестановки символов. Для этого следует использовать функцию
CHECKSUM().
Примеры
. При перестановке символов результаты одинаковы:
? ASCIISUM("abc") // Результат: 294
? ASCIISUM("cba") // Результат: 294
. Для пустой строки сумма равна 0:
? ASCIISUM("") // Результат: 0
See Also: CHECKSUM()
ASCPOS()
Возвращает ASCII-код символа, находящегося в заданной позиции строки.
Выравнивает искомую подстроку по заданной
------------------------------------------------------------------------------
Синтаксис
ASCPOS(, [ ]) --> nASCIIValue
Параметры
- символьный параметр, задающий обрабатываемую строку.
- необязательный числовой параметр, задающий позицию
символа строки. По умолчанию позиция последнего символа.
Возвращаемое значение
nASCIIValue - числовой ASCII-код символа.
Описание
Функция позволяет определить ASCII-код желаемого символа в строке.
Примечания
. Возвращаемая величина может находиться в диапазоне от 0 до 255.
. Еслипустая строка или больше, чем число
символов в строке, то ASCPOS() возвращает 0.
Примеры
. Вместо:
? ASC(SUBSTR(String, 5, 1))
. можно указать:
? ASCPOS(String, 5)
See Also: VALPOS()
ATADJUST()
Выравнивает искомую подстроку по заданной позиции.
------------------------------------------------------------------------------
Синтаксис
ATADJUST(, , ,
[], [ ], [ ]) --> cAdjustString
Параметры
- символьный параметр, задающий искомую подстроку.
- символьный параметр, задающий строку, внутри которой
осуществляется выравнивание.
- числовое значение позиции для сдвига подстроки.
- необязательный числовой параметр, задающий номер
обрабатываемого вхождения. По умолчанию последнее
вхождение.
- необязательный числовой параметр, задающий количество
пропускаемых от начала строки символов.
виде отдельного символа. По умолчанию
По умолчанию 0.
- необязательный параметр, задающий символ-заполнитель,
используемый в случае "раздвигания" при выравнивании. Он может быть
задан либо в числовом виде ASCII-кода в диапазоне от 0 до 255, либо в
виде отдельного символа. По умолчанию используется пробел (32).
Возвращаемое значение
cAdjustString - измененная символьная строка.
Описание
Функция осуществляет поиск вхождения подстрокив исходную
строку. С найденной позиции остаток строкиперемещается на
позициюлибо удалением, либо вставкой символов
.
Дополнительно можно указать номер обрабатываемого вхождения
, а также исключить из поиска требуемое количество
символов в начале исходной строки.
Примечания
. Режим поиска управляется вызовом функции CSETATMUPA(). Для
организации поиска по образцу можно использовать функцию SETATLIKE().
Примеры
. Выравнивание комментариев по столбцу 60. Поиск осуществляется до
первого вхождения "//". Поскольку перед символами "//" должен
находиться пробел, то осуществляется поиск подстроки " //".
ATADJUST(" //", Line, 60, 1)
. Выравнивание расширения имени файла по позиции 10 и удаление
символа "." при распечатке списка файлов текущей директории:
aDir := DIRECTORY() // Например: WINDOW.DBF
// PLZ.DBF
// BACK.DBF
// HELP.DBF
FOR nI = 1 TO LEN(aDir) // LOG.DBF
CHARREM(".", ATADJUST(".", aDir[nI][1], 10))
NEXT ni // Результат: WINDOW DBF
Возвращает позицию начала искомой подстроки
// PLZ DBF
// BACK DBF
// HELP DBF
// LOG DBF
. Использование ATADJUST() в сочетании с CSETATMUPA(). Вопрос,
дважды или трижды "AA" входит в "AAA", решается в зависимости от
режима, установленного вызовом функции CSETATMUPA(), управляющей
режимом продолжения поиска CT II-функциями:
CSETATMUPA(.F.)
? ATADJUST("AA", "123AAABBB", 7, 2) // Подстрока
// не найдена
CSETATMUPA(.T.)
? ATADJUST("AA", "123AAABBB", 7, 2) // "123A AABBB"
See Also: CSETATMUPA()
SETATLIKE()
ATNUM()
Возвращает позицию начала искомой подстроки в строке.
------------------------------------------------------------------------------
Синтаксис
ATNUM(, ,
[], [ ]) --> nPosition
Параметры
- символьный параметр, задающий искомую подстроку.
- символьный параметр, задающий обрабатываемую строку.
- необязательный числовой параметр, задающий номер искомого
вхожденияв . По умолчанию осуществляется поиск
последнего вхождения.
- необязательный числовой параметр, задающий количество
символов с начала строки, исключаемых из поиска. По
умолчанию 0.
Возвращаемое значение
nPosition - номер позиции начала искомой подстроки в строке. Если
требуемое вхождение не найдено, то возвращается 0.
Описание
Функция возвращает начальную позицию искомого вхождения подстроки
Для поиска требуемого по номеру
в строке .
Для поиска требуемого по номеру вхождения подстроки функция
просматривает, начиная слева, обрабатываемую строку, осуществляя поиск
каждого вхождения. В зависимости от состояния режима прохода по
символам, переключаемого функцией CSETATMUPA(), дальнейший поиск
продолжается с символа, следующего либо за последним (режим включен),
либо за первым (режим выключен) символом последнего вхождения.
Примечания
. Применение функции SETATLIKE() позволяет организовать поиск по
образцу.
Примеры
. Поиск последнего вхождения:
? ATNUM("bc", "abcdeabc") // Результат: 7
. Поиск первого вхождения:
? ATNUM("bc", "abcdeabc", 1) // Результат: 2
. Поиск первого вхождения с пропуском первых трех символов:
? ATNUM("bc", "abcdeabc", 1, 3) // Результат: 7
. Влияние CSETATMUPA() на поиск последнего вхождения "aa" в
"aaa":
CSETATMUPA(.F.) // Выключение режима
? ATNUM("aa", "aaa") // Результат: 1
CSETATMUPA(.T.) // Включение режима
? ATNUM("aa", "aaa") // Результат: 2
See Also: CSETATMUPA()
SETATLIKE()
ATREPL()
Заменяет искомую подстроку в строке на заданную.
------------------------------------------------------------------------------
Синтаксис
ATREPL(, [@] ,
, [ ],
[] --> cReplString
Параметры
- символьный параметр, задающий искомую подстроку.
[@]- символьный параметр, допускающий передачу по ссылке и
необязательный числовой параметр, задающий номер
задающий обрабатываемую символьную строку.
- символьный параметр, задающий строку, заменяющую
найденную подстроку в исходной строке.
- необязательный числовой параметр, задающий номер или
количество вхожденийв . По умолчанию последнее
вхождение.
- необязательный логический параметр, задающий при значении
.T. замену только искомого вхождения подстроки, а при значении .F. и
по умолчанию замену всех подстрок до искомого вхождения включительно.
Возвращаемое значение
cReplString - символьная строка с замененными одним или несколькими
вхождениями подстрокна .
Описание
Функция позволяет заменить одну или несколько подстрок в.
Заменяющая подстрокаможет быть короче или длиннее, чем
.
Если длинаменьше или равна , то поиск
осуществляется с учетом режима, устанавливаемого функцией
CSETATMUPA(), в зависимости от которого замена даст различные
результаты.
Поиск всех вхождений подстрокиосуществляется с начала
строки, причем ищутся все случаи вхождения подстроки. Если
режим прохода по символам выключен (.F.), то поиск продолжается со
следующего за последним символа замененной подстроки, а иначе поиск
продолжается со второго символа замененной подстроки.
Примечания
. Применение функции SETATLIKE() позволяет организовать поиск по
образцу.
. Еслии имеют одинаковую длину, то
может передаваться по ссылке.
. Еслии идентичны, то функция возвращает
управление, не выполняя действий, т.к. при этом, если вызовом
CSETATMUPA(.T.) установлен режим прохода по символам, поиск и вставка
Замена на более длинную строку
будут продолжаться бесконечно.
Примеры
. Замена всех "123" на "ab"
? ATREPL("123", "123_123_123", "ab") // "ab_ab_ab"
. Замена на более длинную строку (режим прохода по символам
игнорируется):
? ATREPL("789", "789_789", "abcd") // "abcd_abcd"
. Замена всех "123" на "ab" в первых двух вхождениях подстроки:
? ATREPL("123", "123_123_123", "ab", 2) // "ab_ab_123"
. Замена только второго вхождения "123" на "ab"
? ATREPL("123", "123_123_123", "ab", 2, .T.) // "123_ab_123"
. Замена всех "aa" на "a" с учетом влияния CSETATMUPA():
CSETATMUPA(.F.)
? ATREPL("aa", "aaaa", "a") // "aa"
CSETATMUPA(.T.)
? ATREPL("aa", "aaaa", "a") // "a"
. Замена "abc" на "ab" при включенном и выключенном режиме прохода
по символам:
CSETATMUPA(.T.)
? ATREPL("abc", "123abcc456", "ab") // "123ab456"
CSETATMUPA(.F.)
? ATREPL("abc", "123abcc456", "ab") // "123abc456"
See Also: CSETATMUPA()
SETATLIKE()
ATTOKEN()
Возвращает позицию элемента в строке.
------------------------------------------------------------------------------
Синтаксис
ATTOKEN(, [ ], [ ]) --> nPosition
Параметры
- символьный параметр, задающий обрабатываемую строку.
используемых для выделения элементов. Значение
- необязательный символьный параметр, задающий список
разделителей, используемых для выделения элементов. Значение по
умолчанию приведено в подразделе Описание.
- необязательный числовой параметр, задающий номер
искомого элемента. По умолчанию последний элемент.
Возвращаемое значение
nPosition - номер начальной позиции искомого элемента в.
Описание
Функция позволяет определить начальную позицию элемента в,
что весьма полезно при работе с другими функциями обработки строк. По
умолчанию функция использует следующие разделители:
CHR(32), CHR(0), CHR(9), CHR(10), CHR(13),
CHR(26), CHR(32), CHR(138), CHR(141)
и символы:
,.;:!?/\<>()^#&%+-*
Список разделителей может быть заменен при вызове функции.
Некоторые примеры использования разделителей приведены в таблице.
Таблица 4-1. Рекомендуемые разделители
--------------------------------------------------------------------
Элемент текста
--------------------------------------------------------------------
Страницы CHR(12) (прогон страницы)
Предложения ".!?"
Имена файлов ":\."
Строки чисел ",."
Строки дат "/."
Строки времени ":."
--------------------------------------------------------------------
Примечания
. Используемые в качестве разделителей коды CHR(138) и CHR(141) в
альтернативной кодировке соответствуют буквам кириллицы "К" и "Н". В
связи с этим при использовании функции для разбора текстов на русском
языке необходимо заменять список разделителей.
Примеры
. Начальная позиция последнего элемента:
? ATTOKEN("Добрый день!") // 8
Возвращает часть строки перед искомым
. Начальная позиция третьего элемента:
? ATTOKEN("Какой замечательный день!", 3) // 21
. Начальная позиция несуществующего элемента:
? ATTOKEN("Какой замечательный день!", 6) // 0
See Also: NUMTOKEN()
TOKEN()
TOKENLOWER()
TOKENUPPER()
BEFORATNUM()
Возвращает часть строки перед искомым вхождением подстроки.
------------------------------------------------------------------------------
Синтаксис
BEFORATNUM(, ,