Основні синтаксичні конструкції мови програмування  Visual FoxPro

 

Поняття про мову програмування Visual FoxPro.

 

            Для зручності і швидкості виконання операцій, що часто повторюються, а також для створення автоматизованих робочих місць (АРМ) СУБД  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

Повертає код останньої натисненої клавіші

           

  На головну сторінку