Для
зручності і
швидкості
виконання
операцій, що
часто
повторюються,
а також для
створення
автоматизованих
робочих
місць (АРМ)
СУБД
FoxPro
має свою
мову
програмування.
В Visual
FoxPro мова
програмування
поділяється
на дві
частини.
Перша
перейшла по
спадковості
від
попередніх
версій і є
однією з
найпотужніших
підмножин
мови Xbase. Це
процедурна
мова. Друга
частина мови
є докорінно
новим
компонентом,
який з'явився лише в Visual
FoxPro і є об'єктно-орієнтованою.
Найскладнішим
в опануванні
мови буває
перший крок.
Тому
зверніть
увагу, що при
виконанні
будь-яких
дій в
інтерфейсі Visual FoxPro у вікні Command автоматично
записується
відповідна
команда.
Якщо кілька
послідовних
команд
перенести в
програмний
файл, то
одержимо
програму.
Якщо
ми бажаємо з
таблиці
PATLIST.DBF, що містить
список
пацієнт
ів,
прочитати
дані, що
відносяться
до
підрозділу “Діагностичний
центр”, то
потрібно
виконати
команди меню
File-Open і вибрати
файл PATLIST.DBF.
Потім з меню Database вибрати
команду Browse і знайти
запис, що
відноситься
до
відповідного
підрозділу.
Програмно
цей же
результат
можна
отримати,
набравши у
вікні Command такі
команди:
USE
PATLIST
BROWSE
LOCATE
FOR Department = “Діагностичний
центр”
Якщо
наведену послідовність
команд
записати у
файлы, отримаємо найпростішу
програму.
Засоби
роботи з
даними, поля,
змінні,
масиви, а
також деякі
параметри
команд і
функцій
вимагають
використання
імен. При їх
заданні
дотримуються
таких правил:
1.
Використовуйте
в імені лише
букви. Знак
підкреслення
або цифри.
2.
В якості
першого
символу
використовуйте
лише букву
або знак
підкреслення.
3.
Ім'я може включати до 254
символів.
4.
При
використанні
списку імен
розділяють
імена комами.
Щоб
не
заплутатися
у великій
кількості
імен, що
використовуються
в програмі,
програмісти
виробили
домовленості,
за допомогою
яких тут
можна
навести
якийсь
порядок.
Структура
імені має
такий вигляд:
Діапазон_Тип
даних_Ім'я
Для
вказування
діапазону
рекомендується
використовувати
такі символи:
l
внутрішня (local)
p
локальна (private)
r
регіональна (region)
g
глобальна (public)
t
параметр (parameter)
Для
задання типу
даних
рекомендується
використовувати
такі символи:
a
масив
c
символьні
дані
y
грошова
одиниця
d
дата
t
дані типу
дата і час
b
подвійної
точності
l
логічні
n
числові
o
ссилка на об'єкт
u
невідомого
типу
Програма
в FoxPro -
це текстовий
файл, що
містить
набір команд,
згідно із синтаксичними
правилами
мови.
Програма
може мати
підпрограми
(процедури), в
які
поміщаються
часто
повторювані
фрагменти
коду.
Підпрограми
можуть
розміщуватися
після
основного
тексту
програми або
в окремому
файлі і
починаються
з ключового слова:
PROCEDURE
ProcedureName
Процедура
виконується
до тих пір,
поки не буде
виконана
одна з таких
умов:
n
зустрінеться
слово PROCEDURE
ще раз;
n
буде
знайдена
команда RETURN
-
повернення у
викликаючу
програму;
n
буде
видана
команда CANCEL -
переривання
роботи
програми;
n
буде
видана
команда QUIT
- вихід із
СУБД
;
n
зустрінеться
нова команда
DO
для запуску
іншої
програми;
n
буде
досягнутий
кінець файлу.
В
FoxPro аналогічно
підпрограмі
трактується
поняття
функцій
споживача,
яка
починається
з ключового слова:
FUNCTION
FunctionName
На
відміну від
процедури,
функція може
повернути
необхідні
значення у
викликаючу
програму.
Є
чотири
способи
викликати
функцію:
n
присвоїти
змінній
значення, що
повертається;
n
включити виклик функції у
команду;
n
надрукувати
значення, що
повертається,
в активне
вікно: ?
TIME( )
n
викликати
функцію без запам'ятовування
значення, що
повертається:
=SYS(2002)
Кілька процедур або функцій
можуть бути розміщені в одному файлі. В
цьому випадку файл повинен бути відкритий
командою:
SET
PROCEDURE TO [FileName1 [,FileName2,...]] [ADDITIVE]
Тут опція ADDITIVE дозволяє відкрити
додаткові файли процедур, не закриваючи
відкриті раніше.
Якщо підпрограма або функція
викликається з параметрами, то в першому ж
рядку повинна бути записана команда:
PARAMETERS
ParameterList
Вона присвоює перечисленим у списку
локальним змінним або масивам значення, що
передаються із викликаючої програми.
Наступна команда:
LPARAMETERS
ParameterList
присвоює
перечисленим у списку внутрішнім змінним
або масивам значення, що передаються із
викликаючої програми.
Спосіб передачі параметрів
визначається установкою:
SET
UDFPARMS TO VALUE|REFERENCE
Тут
варіант TO VALUE встановлює передачу
параметрів за значенням. При цьому зміна
переданого значення у функції споживача
не вплине на величину змінної у програмі,
звідки була викликана функція. Варіант
TO REFERENCE встановлює передачу параметру
за ссилкою. В
цьому випадку довільна зміна значення
переданого параметру у
функції споживача викличе адекватну зміну
величини змінної в програмі, звідки була
викликана функція.
За припущенням змінні передаються у
функцію споживача за ссилкою, а в
процедуру - за ссилкою. Можна змінити
спосіб передачі конкретного параметру,
встановлеий в SET UDFPARMS. Для передачі
параметру за значенням необхідно взяти
змінну в круглі дужки, а за ссилкою -
вказати перед змінною знак “@”.
Для переривання виконання програми
служить оператор:
RETURN
[Expression| TO MASTER| TO ProgramName]
Він повертає керування у викликаючу програму: з опцією TO MASTER - на найвищий рівень викликаючої програми, а з опцією TO ProgramName - у вказану програму, і в ній виконується наступна команда після тої, що викликає.
Оператор:
RETRY
діє
подібно до команди RETURN, але при поверненні
керування до викликаючої програми
повторюється виконання останньої команди.
Головний програмний файл. тобто файл,
що запускає роботу всієї інформ
аційної системи, як правило,
складається з таких блоків:
-
блок установочних команд SET, що визначають
параметри конфігурації робочого
середовища;
-
означення глобальних змінних, масивів і їх
ініціалізація; означення і опис вікон;
-
відкриття баз даних, таблиць і потрібних
індекс
них
файлів;
-
опис і активізація роботи головного меню
для вибору
основних варіантів роботи системи і
передача керування відповідним
програмним файлам або підпрограмам;
-
закриття таблиць і баз даних.
За областю дії змінні поділяються на
три типи.
Локальні змінні
(private) існують лише під час роботи процедури
або програмного файлу, в якому вони були
означені. За припущенням всім змінним, що
означені в програмі, присвоєються статус
локальних. Явно означити статус локальної
змінної можна командою:
PRIVATE
MemVarList | PRIVATE ALL [LIKE Sceleton | EXCEPT Sceleton]
Перед використанням масивів їх
потрібно оголосити командою:
DIMENSION
ArrayName1(nRows1 [,nColumns1[) [,ArrayName2(nRows2 [,nColumns2])]...
Кожен масив може містити не більше 65000
елементів. Тобто гранична розмірність
двовимірного масиву буде
254х255, 1000х65 і т.д.
Глобальні змінні
(public) будуть зберігати свої значення у всіх
програмних файлах і процедурах, що ними
викликаються. Для оголошення змінних і
елементів масиву глобальними
використовується команда:
PUBLIC
MemVarList | [ARRAY] ArrayName1(nRows1 [,nColumns1]) [,ArrayName2(nRows2
[,nColumns2])]...
Внутрішні змінні
(local) діють лише в межах процедури або
функції, в яких були створені.
До них не можна звернутися з програми
або функції ні вищого, ні нижчого рівня.
Змінні оголошуються внутрішніми командою:
LOCAL
MemVarList | [ARRAY] ArrayName1(nRows1 [,nColumns1]) [,ArrayName2(nRows2
[,nColumns2])]...
Регіональні
змінні
або
масиви (regional) подібні до локальних і
оголошуються за допомогою команди:
REGIONAL
MemVarList
Перед командою розміщується директива:
#REGION
nRegionNumber
В параметрі nRegionNumber вказується номер
регіону (від 0 до 31), в якому діють змінні, що
перечислені у списку MemVarList. В регіоні з
іншим номером та ж змінна може мати інше
значення.
Відомо, що змінні можуть зберігати
свої значення лише до виключ
ення живлення, а змінні в програмі - лише
до завершення її роботи.
При потребі можна зберегти значення
поточних змінних або масивів у вказаному
файлі або полі приміток за допомогою
команди:
SAVE
TO FileName | MEMO MemoFieldName [ALL LIKE Sceleton | ALL EXCEPT Sceleton]
Відновити в пам”яті попередньо
збережені змінні або масиви можна за
допомогою команди:
RESTORE
FROM FileName | MEMO MemoFieldName [ADDITIVE]
Опція ADDITIVE дозволяє
добавити збережені змінні до вже
означених на даний момент в пам”яті,
інакше вони будуть витерті.
Для написання рядків коментарів
потрібно на початку рядка поставити знак:
*[Comments]
Для написання коментаря на одному
рядку з командою потрібно після команди
поставити:
&&[Comments]
При першому запуску програми і в
подальшому при її зміні FoxPro компілює
вихідний код програми у так званий
препроцесорний код або р-код, який
виконується набагато швидше, аніж
інтерпретована програма. Файли з р-кодом
отримують інше розширення.
Для задання інструкцій компілятору
служать препроцесорні директиви.
Наступна директива визначає ділянки
прогшрамного коду, які будуть або не
будуть компілюватися і тим самим
виконуватися при роботі програми:
#IF
nExpression1 | lExpression1
Commands
[#ELIF
nExpression2 | lExpression2
Commands
...
#ELIF
nExpressionN | lExpressionN
Commands]
[#ELSE
Commands]
#ENDIF
Для опису констант досить зручно
використовувати препроцесорну директиву:
#DEFINE
ConstantName Expression
Вона визначає ім”я константи і її
значення. Перервати присвоєння значення
константі можна за допомогою директиви:
#UNDEF
ConstantName
Означені за допомогою попередніх
директив константи (константи компіляції
) можна використовувати для включ
ення у відкомпільований код тих чи
інших фрагментів програми. Це можна
зробити за допомогою команди:
#IFDEF
| #IFNDEF ConstantName
Commands
[#ELSE
Commands]
#ENDIF
При компіляції
в програму
можна включ
ити набір директив, що знаходяться в
іншому файлі. Такий файл називається
файлом заголовку, оскільки визначає деякі
загальні умови компіляції
програми. Це
забезпечує директива:
#INCLUDE
FileName
Переважно для файлу заголовку
використовується розширення H.
Найпростіше розгалуження програми
залужно від заданої умови можна
забезпечити командою:
IF
lExpression
Commands
[ELSE
Commands]
ENDIF
Для вибору за умовою існує дуже
ефективна функція:
IIF(lExpression,
Expression1, Expression2)
Вона
повертає значення Expression1, якщо lExpression =.T.,
інакше повертає Expression2.
Більш складне розгалуження, коли є
кілька умов, залежно від яких потрібно
виконувати ту чи іншу групу команд,
організується структурою:
DO
CASE
CASE lExpression1
Commands
[CASE lExpression2
Commands]
...
[OTHERWISE
Commands]
ENDCASE
У випадку, коли потрібно багатократно
виконувати якийсь блок команд, поки
виконується задана умова, можна
використовувати команду:
DO
WHILE lExpression
Commands
[LOOP]
[EXIT]
ENDDO
Тут опція LOOP дозволяє відразу ж
повернути керування до рядка DO WHILE, а опція
EXIT - припинити виконання циклу.
Цикл можна організувати і стандартним
для більшості мов програмування способом:
FOR
MemVarName = nInitialValue TO nFinalValue
[STEP
nIncrement]
Commands
[LOOP]
[EXIT]
ENDFOR
| NEXT
Досить часто в програмі потрібно
передбачити ситуації, коли виконання
якигось дій залежить від вказівок
споживача, які він може дати, не
використовуючи меню
. В найпростішому випадку таке
керування може здійснюватися через
посередництво клавіатури. У програмі такі
ситуації можна обробити за допомогою
команд, що відслідковують натиснення
клавіш.
ON
KEY [Command] |
Встановлює
режим очікування до натиснення
довільної клавіші, після чого буде
виконана команда Command |
ON
KEY [LABEL KeyLabelName] [Command] |
Встановлює
режим очікування для певної клавіші |
PUSH
KEY [CLEAR] |
Запам”ятовує,
і потім при використанні опції CLEAR
перериває установки, зроблені
командою ON KEY LABEL |
POP
KEY [ALL] |
очищає
установки |
KEYBOARD
cKeyBoardValue [PLAIN] [CLEAR] |
Імітує
виконання будь-яких дій з клавіатурою
|
SET
ESCAPE ON | off |
Дозволяє
перервати виконання програми
натисненням на клавішу Esc |
ON
ESCAPE [Command] |
Конкретизує
дії, що виконуються програмою при
натисненні клавіші Esc |
CAPSLOCK([lExpression]) |
Повертає
логічне значення, що показує
співпадання режиму включ
ення
прописних букв з логічним значенням
lExpression |
NUMLOCK([lExpression]) |
Визначає
і (або) встановлює режим роботи
цифрової клавіатури |
INSMODE([lExpression]) |
Встановлює
режим вставки або перезапису символів
в тексті на основі lExpression |
INKEY([[nSeconds]
[, cHideCursor]]) |
Повертає
значення коду натисненої клавіші
клавіатури або миші. |
LASTKEY |
Повертає
код останньої натисненої клавіші |