|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ЭЛЕМЕНТЫ ШАБЛОНОВЭлементы шаблонов предлагают формат масок для просмотра и/или редактирования переменных. Элементы шаблонов можно использовать как параметры для описания переменных типа STRING, ENTRY, или STRING OPTION в SCREEN-структурах; как параметры операторов STRING в REPORT-структурах; как параметры некоторых процедур и функций Клариона; или, как параметры описаний STRING, CSTRING и PSTRING. Есть семь типов элементов шаблонов: числовые и валюта, научная нотация, дата, время, образец, key-in template и строки. Шаблоны чисел и валюты @N[валюта][знак][заполнение]размер[группирование][места][валюта][знак][B]
Элементы шаблонов чисел и валюты форматируют числа для вывода на экран или в отчет. Если значение больше, чем можно вывести в текущем шаблоне, такое значение выводится в виде строки из звездочек. Пример:
Только хранение Шаблоны: Variablel STRING(@N_6v2) !Шесть байт хранятся БЕЗ десятич- !ного разделителя CODE Variablel="1234.56" !Храним в виде '123456' SHOW(1,1,Variablel,@N_7.2) !Выводим с десятичн. точкой: '1234.56' Шаблоны научной нотации@Em.n[B]
Шаблоны научной нотации форматируют очень большие или же очень маленькие числа. Вывод в виде десятичного числа в степени десяти. Пример:
@Dn[s][B]
Даты можно хранить в числовых переменных (обычно LONG), DATE-полях (для совместимости с Btrieve), или в STRINGах описанных в виде дат. Дата, хранящаяся в числовой переменной называется Стандартной Кларионовской датой. Ее значение представляет собой количество дней, прошедших с 28 декабря 1800 года. Шаблон даты преобразует это число в один из форматов даты. Для ввода данных нельзя использовать шаблоны @D3, @D4, @D7 и @D8 поскольку в них требуется вводить не только цифры, но и буквы. Пример:
@Tn[s][B]
Время можно хранить в числовой переменной (обычно LONG), в TIME- полях (для совместимости сBtrieve), или в STRINGах, описанных в формате времени. Время, хранящееся в числовой переменной называется стандартным кларионовским временем. Оно представляет из себя количество сотых долей секунды, прошедших с полуночи. Шаблон времени переводит это число в один из 6 форматов времени. Нельзя использовать для ввода шаблоны (@T3 и @T6), в которых требуется вводить не только цифры, но и буквы. Пример:
@p[<][#][x]P[B]
Шаблоны "по образцу" содержат необязательные целочисленные пози- ции и необязательные символы редактирования. Любой символ кроме < или # считается символом редактирования, который появится в форматированной строке-результате. Разделители @P и P чувствительны к регистру, на котором они введены. Это сделано для того, чтобы, если скажем, надо ввести символ "Р", то можно использовать разделители "р" и наоборот. Пример:
@K[@][#][<][x][\][?][^][_][Ѓ]K[B]
Key-in шаблоны могут содержать целочисленные позиции ( # < ), символьные позиции ( @ ^ _ ), места для любых символов ( ? ), и печатаемые символы. Любой символ, кроме символов форматирования, рассматривается как печатаемый, который попадает в форматированную строку-результат. Разделители @K иd K чувствительны к регистру по той же причине, что и @P и P в шаблонах "по образцу". Key-in Шаблоны специфичны для полей типа STRING, PSTRING, и CSTRING для возможности произвольного редактирования и проверки допустимости поля. Использование key-in шаблонов, содержащих любые алфавитные индикаторы ( @ ^ _ ) с полями для ввода чисел дает непредсказуемые результаты. Поскольку использование режима вставки для key-in шаблонов, может также привести к непредсказуемым результатам, то key-in шаблоны всегда принимают данные в режиме надпечатки, даже если есть атрибут INS. Пример:
@Slength
Строковый шаблон описывает НЕформатированную строку заданной длины. Пример: Name STRING(@S20) !20-символьное поле-строка АТРИБУТЫ ПЕРЕМЕННЫХPRE (префикс метки)
PRE(prefix)
Атрибут PRE предусматривает префикс метки для сложных структур данных. Он используется для того, чтобы различать переменные с одинаковыми именами в разных структурах. При обращении к переменной исполняемымы операторами, при присвоениях и передаче в списках параметров, префикс присоединяется к метке двоеточием (Pre:Метка). PRE можно использовать со следующими структурами данных:
Пример: MasterFile FILE,DRIVER('Clarion'),PRE(Mst) !Declare master
Record RECORD ! file layout
AcctNumber LONG
. .
Detail FILE,DRIVER('Clarion'),PRE(Dtl) !Declare detail
! file layout
Record RECORD
AcctNumber LONG
. .
GROUP,PRE(Mem) !Declare some memory variables
Message STRING(30)
Page LONG
Line LONG
Device STRING(30)
.
CODE
IF Dtl:AcctNumber <> Mst:AcctNumber !Is it a new account
Mem:Message - 'New Account' ! display message
DO MatchMaster ! get new record
.
См. также: Зарезервированные слова DIM (размерность массива)
DIM(измерение,....,измерение)
Атрибут DIM объявляет перемнную-массив. Такая переменная повторяется столько раз, сколько указано в параметрах ИЗМЕРЕНИЕ. Многомерные массивы можно рассматривать как вложенные одномерные. Каждое измерение массива имеет соответствующий индекс. Таким образом, обращаясь к переменной - элементу трехмерного массива, надо указать три индекса. Хотя на число измерений не накладывается ограничений, но размер массива не должен превышать 65,520б.С атрибутом DIM можно использовать следующие типы данных:
Индексы однозначно определяют конкретный элемент массива. Список индексов содержит индексы для каждого ИЗМЕРЕНИЯ массива. В списке, индексы отделяются друг от друга запятыми, а весь список заключается в квадратные скобки ([ ]). Индекс может быть числовой константой, выражением или функцией. Если надо обратиться ко всему массиву целиком, то надо использовать метку этого массива без списка индексов. Структура GROUP - особый случай. Каждый уровень вложенности добавляет индексы и GROUP и ее переменным. Данные, описанные в GROUP можно использовать точно так же, как и собственно GROUP. Пример: Screen GROUP !Текст на экране Row GROUP,DIM(25) !25 строк Pos GROUP,DIM(80) !Две тысячи знакомест Attr BYTE !Байт атрибута Char BYTE !Собственно символ . . . !Завершаем все три группы В предыдущей группе: Screen это 4,000байтная GROUP Row[1] это 160байтная GROUP Pos[1,1] это 2хбайтная GROUP Attr[1,1] это BYTE Char[1,1] это BYTE Month STRING(10),DIM(12) !Размерность для месяца - 12 CODE CLEAR(Month) !Весь массив заполнить пробелами Month[1] = 'January' !Заполнить массив названиями Month[2] = 'February' MonthE3] = 'March' См. также: MAXIMUM Массивы как параметры процедур и функций Массив можно передать в PROCEDURE или FUNCTION. Прототип, описанный в MAP-структуре должен описывать тип данных "массив" как параметр-переменную ("передается по адресу") с пустым списком индексов. Вызывающий оператор может передать массив в ROCEDURE или FUNCTION. Пример: PROGRAM MAP MainProc AddCount(*LONG[,],*LONG[,]) !Передаем 2 двумерных . !масива типа LONG CODE MainProc MainProc PROCEDURE TotalCount LONG,DIM(10,10) CurrentCnt LONG,DIM(10,10) CODE AddCount(TotalCount,CurrentCnt) !Вызывая процедуру, переда- !ем ей массивы AddCount PROCEDURE(Tot,Cur) !Процедуре нужны два массива CODE LOOP I# = 1 TO MAXIMUM(Tot,1) !Цикл по первому индексу LOOP J# = 1 TO MAXIMUM(Tot,2) !Цикл по второму индексу Tot[I#,J#l += Cur[I#,J#] ! увеличить TotalCount на . . ! CurrentCnt CLEAR(Cur) !Очистить массив CurrentCnt RETURN См. также: DIM, Прототипы процедур и функций, MAXIMUM EXTERNAL (переменная описана извне)EXTERNAL Атрибут EXTERNAL указывает на то, что переменная, которой он присвоен, описана во внешней библиотеке. Таким образом, переменная с атрибутом EXTERNAL определена и может использоваться кларионовским кодом, но под нее не будет выделена память. Память для такой переменной выделяется самой внешней библиотекой. Этот атрибут позволяет Clarion-программам иметь доступ к полям, описанным как PUBLIC во внешних библиотеках. EXTERNAL допустим только для переменных, описанных ВНЕ структур FILE, QUEUE или GROUP. Пример: PROGRAM
MAP
MODULE('External.Obj')
AddCount,PASCAL !External library with PASCAL
. . ! calling convention
TotalCount LONG,EXTERNAL !Variable declared in external library
NAME (указать внешнее имя)
Атрибут NAME задает "внешнее" имя. Он полностью независим от атрибута EXTERNAL - между ними не требуется никакой связи, хотя оба этих атрибута могут быть у одной и той же переменной. Атрибут NAME можно использовать в прототипах процедур и функций, применять к FILE, KEY, INDEX, MEMO, любому полю, описанному в FILE или QUEUE структурах, или к любому полю вне структуры. Атрибут NAME имеет различные свойства, в зависимости от того, где он использован. NAME(константа) можно задать в прототипах процедур или функций. Константа - это внешнее имя, используемое компоновщиком для идентификации процедуры или функции из внешней библиотеки. Атрибуты NAME(константа) или NAME(переменная) в описании FILE задает ДОСовскую спецификацию полного имени файла. Если константа или переменная не содержит диск и путь, то подразумеваются текущие диск и каталог. Если опущено расширение файла, то подразумевается расширение, стандартное для данного файлового драйвера. Некоторые файловые драйверы требуют, чтобы KEYи, INDEXы, или MEMO-поля были в отдельных файлах. Таким образом, NAME можно применить к описаниям KEY, INDEX или MEMO. Атрибут NAME без константы или переменной, ссылается на метку того описательного оператора, к которому он был применен (включая префикс, если таковой указан). NAME(константа) может применятся к любому полю, описанному в структуре RECORD. Это позволяет использовать имена полей, не нарушающих ограничений на имена, накладываемые отдельными файловыми драйверами. NAME(константа) можно применять к любому полю в структуре QUEUE. Так достигается возможность динамических сортировок во время исполнения. NAME(константа) можно также применять к любой переменной, описанной вне какой-либо структуры. Это дает возможность компоновщику по внешнему имени идентифицировать переменную, описанную во внешней библиотеке. Если переменная имеет еще атрибут EXTERNAL, то она описана, и память под нее выделяется самой внешней библиотекой. Без атрибута EXTERNAL, такая переменная описывается, и память под нее выделяется в кларионовской программе, и она является внешней по отношению ко внешней библиотеке. Пример:
PROGRAM
MAP
MODULE('External.Obj')
AddCount(LONG),LONG,C,NAME('_AddCount')
!C function named ' AddCount,
. .
Cust FILE,PRE(Cus),NAME(CustName) !Filename in CustName variable
CustKey KEY('Name'),NAME('c:\data\cust.idx')
!Declare key,cust.idx
Record RECORD
Name STRING(20),NAME !Default NAME to 'Cus:Name'
. !End file declaration
SortOue QUEUE,PRE(Que)
Fieldl STRING(10),NAME('FirstField') !QUEUE SORT NAME
Field2 LONG,NAME('SecondField') !QUEUE SORT NAME
.
CurrentCnt LONG,EXTERNAL,NAME('Cur') !Field declared public in
! external library as 'Cur'
TotalCnt LONG,NAME('Tot') !Field declared external
!in external library as 'Tot'
См. также: прототипы процедур и функций, FILE, KEY, INDEX, QUEUE, EXTERNAL OVER (разделяет место в памяти)OVER(переменная) переменная Метка переменной, которая уже занимает память, подлежащую разделу. Атрибут OVER позволяет ссылаться на один и тот же участок памяти двумя разными путями. Поле, описанное с атрибутом OVER, должно быть НЕ больше, чем переменная, поверх которой она накладывается (хотя, конечно, она может быть меньше). (SPA. Для тех кому это трудно понять сразу, как мне было в свое время, скажу что этот механизм аналогичен паскалевским записям с вариантами) Поле в структуре GROUP НЕ может быть описано поверх переменной, которая находится ВНЕ этой структуры GROUP. Также, нельзя описать поле поверх переменной, которая является частью списка параметров процедуры или функции. Пример: CustNote FILE,PRE(Csn) !Declare CustNote file Notes MEMO(2000) !The memo field Record RECORD CustID LONG . . CsnMemoRow STRING(IO),DIM(200),OVER(Csn:Notes) !Csn:Notes !можно рассматривать как одно !целое или блоками по 10 байт См. также: DIM ДИРЕКТИВЫ КОМПИЛЯТОРАEQUATE (назначить метку)
Директива EQUATE не занимает память во время исполнения. Она используется для присвоения метки другой метке или константе. Метка директивы EQUATE не может быть такой же, как ее параметр. Пример: Init EQUATE(SetUpProg) !Обзовем процедуру по другому
Off EQUATE(0) !Off означает нуль
On EQUATE(1) !On означает один
Pi EQUATE(3.1415927) !Значение числа ПИ
EnterMsg EQUATE('Press Ctrl-Enter to SAVE')
SocSecPic EQUATE(@P###-##-##IfltP)!Формат номера карточки
!социального страхован.
См. также: Зарезервированные слова SIZE (размер памяти в байтах)
SIZE заставляет компилятор сообщить количество памяти (в байтах) выделенной для хранения параметра. Пример: SavRec STRING(1),DIM(SIZE(Cus:Record)
!Строк столько же, каков размер записи
StringVar STRING(SIZE('Clarion Software, Inc.'))
!Строка должна быть достаточной для этой
!константы длины
LOOP I# = 1 TO SIZE(ParseString)
!Цикл по все символам строки
PicLen = SIZE(@P(###)###-####P) !Сохраняем размер шаблона
Назад | Содержание | Вперед |
|
CITForum © 1997–2025