Поняття типів даних і масивів, FoxPro, Бази даних, статті

Типи даних.

Якщо Ви вже мали певний досвід у програмуванні, Вам не потрібно особливо
пояснювати що таке типи даних і з чим їх їдять. Якщо ж Ви поняття не маєте про
даних і про їх типах, уважно прочитайте цей розділ. Тут же ми розглянемо
основні особливості типів даних у VFP.

Перше, що відрізняє VFP від ​​інших мов програмування, це те, що в VFP
всі змінні динамічні з неявним оголошенням типу. Тобто, Ви завжди
можете створити змінну, якийсь час її використовувати і потім видалити. При
створення мінлива завжди має тип logical зі значенням false і тип її
фіксується (визначається) при першому привласненні змінної якого-небудь
значення. Тобто, при першому привласненні мінлива змінює свій тип на тип
привласнюються їй даних. Змінити свій тип змінна може тільки один раз, при
перший привласненні. Змінні можуть бути наступних типів:


Крім того, в деяких випадках, можуть створюватися змінні з будь-яким типом
даних, дозволеному в таблицях, тобто, наприклад, memo, general та ін (Див.
команди SCATTER і GATHER).

Крім визначення типу дуже важливим є і визначення області дії
змінної. У VFP найбільш часто використовуються змінні глобальні, приватні та
локальні. Крім того, є ще регіональні і деякі інші, але ми загостримо
увагу тільки на перших трьох типах області дії.

Оголошення типу області дії змінної проводиться нижче вказаними
командами. Увага! Оголошення типу області дії змінної завжди повинно
передувати її першому присвоюванню! За замовчуванням, змінні без оголошення
області дії стають приватними (приватними) про що більш детально буде
сказано трохи нижче.

Глобальні змінні оголошуються командою PUBLIC й існують у
протягом виконання всієї програми або всього програми. При налагодженні (в середовищі
VFP) глобальні змінні існують протягом всього сеансу роботи з VFP, поки
вони не будуть явно вилучені з пам'яті. Приклад оголошення глобальних змінних:

PUBLIC gcMyName, gdCurrentDate gcMyName = Іван Нікітін gdCurrentDate =
date()

Приватні змінні (приватні) існують протягом виконання поточного
програмного модуля і доступні у всіх спричинених ним модулях. Ці змінні
автоматично видаляються з пам'яті при закінченні виконання модуля, в якому вони
були оголошені і створені. Такий тип області дії отримують все неоголошені
явно змінні, крім масивів. За замовчуванням, масиви стають глобальними.
Явно оголосити цей тип області дії можна командою PRIVATE.

Локальні змінні існують і доступні тільки в тому модулі, в якому вони
оголошені. Ці змінні оголошуються командою LOCAL і видаляються з
пам'яті автоматично при завершенні виконання програмного модуля. Як ми вже
говорили, в VFP всі змінні динамічні.

Як ми переконалися, VFP дуже дбайливо працює з пам'яттю, створюючи змінні
приватними за замовчуванням і видаляючи їх з пам'яті при завершенні модуля, в якому вони
були створені. Іноді, правда, припадають самим видалити змінні. Це можна
зробити командою RELEASE. Як ми зазначали вище, змінні не можуть змінювати свій
тип. Але, використовуючи видалення змінної з пам'яті, можна створювати таку ж
змінну, але з іншим типом. Я не уявляю собі, для чого це потрібно
реально, але все ж ось приклад, як це зробити (Після символів & & –
примітки):

PUBLIC gMultiTypeVar & & Це глобальна змінна
gMultiTypeVar = 1.00 & & Її тип числовий

Release gMultiTypeVar
gMultiTypeVar = "Hello" & & Тепер це рядок
Release gMultiTypeVar
gMultiTypeVar = {01/01/2000} & & А зараз – дата


Угорська нотація


У Вашому додатку можуть бути сотні й тисячі змінних. Щоб уникнути
плутанини і довгих роздумів при налагодженні програми типу: "A [i, j] що за масив
і чого він тут взагалі робить? "була запропонована і успішно використовується струнка
система іменування змінних і інших об'єктів програми.

За батьківщині запропонував цю систему програміста вона названа Угорська
нотація. Система іменування дуже проста. Прілагаемо до VFP, ім'я змінної
починається з 2-х літерного префікса, 1-а літера якого область дії
змінної, 2-а літера її тип. Тобто:


Крім того, бажано всі об'єкти і класи також оголошувати згідно
угорської нотації, але про це пізніше. Саме ім'я змінної повинно бути
максимально інформативним. Наприклад, добре оголошені змінні:

ldCurrentDate
gaMyCustomers
gnAppVersion

Всіляко слід уникати імен змінних типу A [i, j], K1, L2 R0 і т.п. так
часто приводяться в старих підручниках з програмування. Єдиним
винятком, мабуть, є змінні циклів I і J. Це "вічні" імена для
створення циклів.

Поняття програмної одиниці (процедури) та їх типи



На відміну від старих версій FoxPro, VFP має поняття форми певного
опису вікна (форми), яке може самостійно здійсняться. У старих версіях
FoxPro існувало поняття Екрану (screen). Це не одне і те ж, що й форма.

Екран у FoxPro просто спосіб візуального побудови вікна, який в
Надалі в будь-якому випадку переводився у виконувану програму, яка будує це вікно
(Файл SPR). Форма ж за своєю суттю є описом класу вікна, який при
виконанні породжує об'єкт, готовий до роботи (див. ООП).

Таким чином, на відміну від екранів FoxPro форма може бути самостійно
виконана без генерації програмного модуля. Більш детально ми розглянемо форми
пізніше, а поки перейдемо до іншої групи програмних одиниць.

Будь програмна одиниця це набір операторів VFP, виконання яких
приводить до бажаного результату. Залежно від призначення і способу
побудови програмні одиниці поділяються на такі групи:


Чіткого відмінності на рівні операторів між усіма цими групами немає. Просто
вони по різному будуються (наприклад, запити і меню стоятся автоматично), і
відповідно мають різне призначення. Тут ми поки не наводимо докладний
опис кожної групи, лише позначимо загальну ідеологію цієї побудови і типи
файлів, в яких зберігаються ці програмні одиниці. Будь програмна одиниця
зберігається у файлі. Стандартним розширенням для такого файлу є розширення
PRG. При виконанні або при побудові проекту цей файл компілюється в p-код і
потім виконується. Компіляція проходить дуже швидко і зазвичай користувач VFP
навіть не помічає час, витрачений VFP на компіляцію при виконанні.
Відповідно, при виконанні побудованого проекту компіляція вже не потрібна, так
як проект будується на основі вже скомпільованих модулів.

Набори готових "цеглинок" процедур можна об'єднувати в файли (про це див
нижче), що дає нам процедурні файли. Крім того, є великий клас програмних
елементів, іменований User defined function (UDF), але про це нижче.

Збережені процедури це такі ж набори процедур, що зберігаються в базі даних. Про
це див розділ "Поняття бази даних". Програми запитів і програми меню
будуються автоматично і відповідно мають розширення QPR і MPR. Як правило,
Вам не потрібно їх змінювати або правити. Більш докладно про це ми розглянемо в
розділах застосування RQBE і Побудова меню.

Оператори


Оператори це елементарні командні одиниці Вашої програми. При роботі з
VFP, Вам доступно вікно Command, що дозволяє виконувати ці команди поодинці, у
принципі, послідовне виконання операторів і є робота Вашого
програми. Звичайно ж, на практиці справа йде трохи складніше, тому що ми
маємо справу з системою, керованої подіями, але в першому наближенні, можна
представити справу саме так: "Ваша програма представляє набір деяких,
команд, виконання яких і є робота Вашого застосування ".

Оператори (команди) VFP можуть бути як простими, так і дуже складними і
довгими, так само як і команда, яка виконується оператором, може бути простою, а
може бути і досить складною і ємною. Звичайно ж, тут ми не ставимо перед собою
мета докладно пояснити всі команди VFP, для цього у нас просто немає ні
часу, ні сил, ні об'єму, і, врешті-решт, для цього існує Help
(Довідкова інформація), але кілька простих оператором ми розглянемо.

Отже, оператором в VFP вважається один рядок програми. Порожні рядки
ігноруються. Якщо оператор не вміщується на одному рядку, або програмісту
здається більш наочним розмістити один оператор на декількох рядках, то це
можна зробити, поставивши в кінці рядка, який потрібно продовжити символ
"Крапка з комою", наприклад, тут наведений один оператор:

SELECT ;
Name, Address ;
FROM Customers ;
INTO TABLE Forieners ;
WHERE not Country = Росія

Організація процедур і функцій


Процедури і програми по суті своїй одне і теж. Зазвичай процедура починається
ключовим словом PROCEDURE, що показує компілятору що це і є процедура.
Закінчується процедура словом RETURN, що завершує виконання процедури і
повертає керування в спричинюється програму. Зазвичай ім'я процедури і ім'я файлу,
в якому вона зберігається, збігаються. Однак, можна з одному файлі розмістити
кілька процедур, що дасть нам процедурний файл. Особливої ​​різниці, як зберігати
процедури разом або нарізно, в окремих файлах, немає.

При побудові проекту вони все одно будуть об'єднані в файл програми,
тому ми рекомендуємо оформляти різні процедури різними файлами, так легше з
ними працювати. Процедура може бути викликана з будь-якого місця програми або іншої
процедури, виконатися і повернутися в зухвалу програму.

Сама верхня процедура зазвичай називається головною (стартової) програмою і,
власне, і є основною одиницею Вашого застосування (хоча це і
необов'язково, як ми покажемо нижче). При виклики процедури може статися так,
що якась процедура (або функція) викликає саму себе. Це називається
рекурсією. З рекурсією у VFP слід звертатися вкрай обережно. VFP
підтримує до 128 рекурсивних викликів, не більше, тому ми настійно
рекомендуємо не користуватися рекурсивними викликами.

Процедура може приймати при її виклику параметри від зухвалої програми.
Параметри можуть оголошуватися як приватні змінні (ключове слово PARAMETERS)
або як локальні змінні (ключове слово LPARAMETERS). Як саме оголошувати
параметри справа Вашого смаку. Число переданих параметрів може бути менше,
ніж число оголошених параметрів. У цьому випадку "зайві" параметри процедури
ініціалізувалися в значення false (. F.). Приклад оформлення процедури:

Procedure MyProc
parameter nScope
? "Число pi =" + str (nScope)
return

Відповідно виклик цієї процедури виглядає так:

Do MyProc with 3.14

Програма, дійшовши до оператора Do MyProc, зробить пошук файлу myproc.prg
(Або скомпільованій myproc.fxp) і зробить виклик цієї процедури. При
виклик змінної-параметру nScope буде передано значення 3.14, і почне
виконуватися процедура, поки не буде досягнутий кінець файлу myproc.prg або не
буде зустрінутий оператор RETURN. При цьому управління буде передано на наступний
оператор після Do MyProc.

Набори процедур можна зберігати в одному файлі, що дає нам процедурний файл. В
цьому випадку виклик виглядає так:

Do MyProc with 3.14 in MyProcFile,

де MyProcFile ім'я процедурного файлу.


Тобто, можна сказати і так, якщо процедура щось виконує, то функція
щось обчислює і повідомляє про це викликає програмі. Звичайно ж, це
розподіл дуже умовно, і, як ми переконаємося, більш зручно використовувати функції.

Отже, функція починається ключовим словом FUNCTION і завершується словом
RETURN. Після RETURN звичайно треба змінна або вираз, який буде
повернуто викликає програмі. Якщо цей вислів відсутній або відсутній
саме ключове слово RETURN, то передбачається повернення логічного виразу. T.
(Істина).

Приклад функції, яка обчислює щось:

FUNCTION MyFUNC
PARAMETER X, Y, Z
LOCAL Result
Result=x+y+z
RETURN Result

Виклик цієї функції може бути таким:

MyVar = MyFunc(MyParam1, MyParam2, MyParam3)

або таким:

Something = MyFunc(Param1) + MyFunc(Param2)

або навіть так:

=MyFunc()

Як видно, у другому і третьому випадку число переданих у функцію параметрів
менше, ніж оголошено в самій функції. Це не помилка, "зайві" параметри
приймаються як змінні логічного типу зі значенням. F. (Помилково). Цей
момент слід враховувати,

Число переданих параметрів у функції завжди можна дізнатися за допомогою функції
PARAMETERS (), або перевірити параметри функцією EMPTY (), яка поверне. T., якщо
вираз, передане в неї, є порожнім (тобто,. F. або порожній рядок або
0 або порожня дата або NULL)

В останньому прикладі видно як функція викликається без фіксації повертається
результату (до речі кажучи, тут і сам знак = не потрібен, але так читабельнее). Те
Тобто в цьому випадку, що повертається результат ніде не зберігається. У цьому випадку,
функція веде себе як типова процедура, виконуючи щось, а не обчислюючи.
До речі, більшість функціональних можливостей VFP реалізовано саме як
функції.

Далі ми побачимо, що методи класів теж реалізуються саме як функції.
Функції, визначені Вами, в VFP називаються User Defined Function, тобто
функції, визначені користувачем. UDF це дуже потужний інструмент
структурного програмування.

Цикли і умовні оператори


Якщо Ви знайомі зі структурним програмуванням, то Вам особливо не потрібно
пояснювати, що таке цикли і умовні оператори. Але все ж коротенько на цьому
зупинимося.

Умовний оператор дозволяє виконувати той чи інший блок програми в
Залежно від якогось умови:

IF lExpression <частина коду 1> ELSE <частина коду 2>
ENDIF

lExpression будь логічне вираження. Якщо воно істинне, то виконується
"Частина коду 1", інакше "частина коду 2". У VFP існує маса функцій, результат
яких є логічним і тому може використовуватися в цій конструкції.

Цикли дозволяють виконати яку або частина коду кілька разів.
Відповідно, в VFP існують кілька видів циклів:


Циклів з післямовою, таких як паскалівский цикл repeat until, в VFP немає.
Але, при бажанні, їх можна легко реалізувати. Цикли з передумовою це цикли,
виконуються до тих пір, поки умова виконання істинно. Перевірка умови
відбувається перед черговим циклом, звідси й назва.

Такий цикл будується такою конструкцією:

DO WHILE lExpression
<Оператори тіло циклу>
ENDDO

Цикл перерахування це цикл, в якому відбувається послідовне нарощування
(Або зменшення) якого або значення, тобто його перерахування.

Типовий цикл перерахування:

FOR I = nMin TO nMax STEP nStep
<Оператори тіло циклу>
ENDFOR

У цьому випадку, відбувається послідовне збільшення змінної циклу (у
даному прикладі I) від мінімального значення nMin, до максимального nMax, з кроком
збільшення nStep.

Цикли "для кожного" дуже зручно використовувати для послідовного перегляду
масивів або колекцій (про них ми поговоримо пізніше). У цьому випадку, відбудеться
виконання операторів циклу для кожного елемента цього масиву або колекції:

Наведемо два приклади використання цього циклу. Перший приклад створюється
масив і потім послідовно виводяться його елементи оператором (?):

DIMENSION cMyArray(3)
cMyArray[1] = “A”
cMyArray[2] = “B”
cMyArray[3] = “C”
FOR EACH cMyVar IN cMyArray
? cMyVar
ENDFOR

У наступному прикладі за допомогою OLE Automation створюється об'єкт книги Excel і
послідовно виводяться імена аркушів цієї книги:

oExcel = CREATE("Excel.Application")
oExcel.Workbooks.ADD
FOR EACH oMyVar IN oExcel.sheets
? oMyVar.name
ENDFOR

У всіх циклах можна перервати виконання циклу оператором EXIT або припинити
виконання поточної ітерації (перейти на наступну ітерацію) за допомогою команди
LOOP.

Реакція на події


Як ми вже відзначали, VFP реалізує систему, керовану подіями. Поговоримо
про це більш докладно. Перші мови програмування і перші підходи до
програмування реалізували модель, керовану даними. Тобто програма
чогось там обробляла, і залежно від даних (вихідних, обчислених,
збережених та інш.) виконувала той чи інший свій блок.

Характерною відмінністю такої моделі є наявність алгоритму обробки, то
є чіткої схеми, що показує роботу програми. На жаль (чи на щастя?)
світ влаштований по-іншому. Динамічний розвиток ситуації неможливо уявити в
вигляді закінчених схем, блоків готових рішень. Ми не знаємо, що станеться через
секунду або через хвилину, ми також не знаємо коли взагалі що-небудь трапиться. І,
відповідно, ми не можемо отримати закінчений алгоритм обробки.

Таким чином, ми приходимо до поняття події. Подія ця деяка зміна
оточуючого нас світу. Подією може бути все що завгодно, наприклад (можна застосувати до
комп'ютера), користувач пересунув мишку, натиснув кнопку, модем отримав
черговий байт або блок байтів, хтось ломиться до нас по мережі, минуло стільки-то
секунд після якоїсь команди та інше.

Відповідно, суть системи керованої подіями це опис реакції
системи на певні події. Неважко бачити, що алгоритму тут немає,
тому що ми не можемо передбачити події. Ми можемо лише заявити наступне: "В
випадку того-то й того-то система поведе себе так-то і так-то ". Таким чином,
програмування системи полягає в описі реакції на події. Це дуже
важливий момент у розумінні подібних систем. Основна відмінність від звичайних підходів
в тому, що ми описуємо тільки ті події, які нас цікавлять, залишаючи для
інших стандартну (раніше описану) реакцію. Тобто, якщо при створенні
звичайних програм, Ви були зобов'язані описати всі функціональні блоки Вашої
програми, то в даному випадку, Ви описуєте лише те, що відрізняє Вашу
програму від стандартної поведінки системи, як би кажучи: "А в іншому веди
себе, як і раніше ".

Хто і як розписав це "колись" зараз Вас не цікавить, головне те, що
програма може себе вести стандартним чином, нехай навіть не-як, весь порожня
реакція це теж реакція. Найбільш повно система, керована подіями,
реалізується в об'єктній моделі програмування, і ми розглянемо її пізніше, але в
VFP є ще кілька способів управлінням реакцією на події. Перше, що
необхідно знати, це поняття обробника подій. Коли Ви налагоджує Ваше
додаток в середовищі VFP, або просто експериментуєте з VFP, Вам про це
піклуватися не треба, так як сам VFP вже має свій оброблювач подій, інше
справа, коли стартує Ваше вже закінчила додаток. Ви повинні включити його при
старті і вимкнути при закінченні роботи Вашого застосування. При всій своїй
Складність це робиться дуже просто:

* Старт <ініціалізація Вашого застосування>
READ EVENTS
* Завершення
CLEAR EVENTS

І все. Де саме це розміщувати ми покажемо пізніше. А поки просто прийміть це до
відома.

Найбільш яскравим прикладом засобів управління подіями, за винятком класів,
мабуть, є меню VFP. Система програмування VFP є досить потужною,
настільки, що Ви завжди можете не просто створити меню у своєму додатку, а й
змінити, доповнити або кардинальним способом поміняти меню самого VFP. Це
робиться за допомогою команд управління меню, яких досить багато. Проте, на
щастя, концепція RAD, і саме будівник меню дозволяє Вам створити складне,
повнофункціональне меню, взагалі не вдаючись до написання коду. Сам процес
побудови меню ми розглянемо пізніше, тут лише зазначимо, що його результатом
зазвичай є отримана програма (файл з розширенням *. MPR), яка будучи
одноразово запущеної, досить швидко завершить своє виконання і почне
відслідковувати події (мишку, гарячі клавіші) як звичайне Windows-меню.

Крім цього прикладу, можна привести команди VFP ON:

ON KEY LABEL – відстежує натискання на клавіші або миша
ON ERROR – відстежує помилки виконання

Спробуйте наступне. У середовищі VFP в командному вікні введіть рядок:

On error MessageBox (Ошібка!)

Після чого, до тих пір, поки ви не вимкнете це відстеження, замість
повідомлення про помилку буде вікно з Вашим повідомленням (MessageBox). Це ж буде
відбуватися і у Ваших програмах (про виключення ми поговоримо пізніше). Ось
хороший приклад використання такого відстеження.

Функція LocFile () повертає ім'я обраного користувачем файлу, але якщо
користувач відмовляється від вибору, то відбувається помилка. Спробуємо її
відстежити:

local lcSelectedFile, llError, lcOnError
llError = .F.
lcOnError = ON("ERROR")
On Error llError = .T.
lcSelectedFile = locfile ("readme.txt", "txt, me", "Файл")
On Error &lcOnError
if llError MessageBox ("Файл не обраний")
else
Modify file (lcSelectedFile)
endIf

Коментарі наприклад: У змінній lcSelectedFile зберігається повне ім'я
вибраний файл, мінлива llError спочатку встановлюється в. F. і, в разі
помилки в. T., lcOnError зберігає попередню установку ON ERROR, яка
зчитується функцією ON (ERROR), відновлюється установка макропідстановки
& LcOnError, файл відкривається за допомогою команди Modify file (lcSelectedFile).
І ще коментар, не потрібно приймати цей приклад як оптимального
рішення. Насправді все можна зробити значно більше елегантніше, це всього лише
приклад перехоплення помилки (реакції на помилку) в процесі виконання програми.

Форма елемент Вашого застосування



Отже, форма це не програма, а клас. Клас форми зберігається у файлі з
розширенням SCX (SCT додатковий файл). Примірник форми створюється командою DO
FORM, при цьому, відповідно виконуються події (методи) форми, які
виникають при її завантаженні. При виконанні форми (якщо це не вказана спеціально)
створюється об'єктна змінна. Цим процесом можна керувати, вказуючи ім'я
змінної в команді DO FORM:

* Оголосимо змінну для форми
public goMyForm
* Запустимо форму, у змінній буде створений об'єкт
DO FORM MyForm.scx NAME goMyForm
* А тепер закриємо форму, звертаючись до її методу
goMyForm.Release

Як ми покажемо нижче, насправді формами керувати дуже і дуже просто. Ну
а поки на цьому все по формах.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*