О.О.П / Обьектно-орієнтоване програмування / Лабораторні роботи / методичка
.pdfAB
|
|
|
|
|
F Tran |
sf |
|
|
|
|||
|
|
|
|
D |
|
|
|
|
|
|||
|
|
Y |
P |
|
|
|
|
or |
e |
|||
B |
Y |
|
|
|
|
|
|
|
|
m |
||
|
|
|
|
|
|
buy |
|
r |
||||
|
|
|
|
|
|
|
|
2 |
||||
|
|
|
|
|
|
|
|
|
0 |
|||
|
|
|
|
|
|
|
to |
|
|
|
|
. |
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
|
|
Click |
|
|
|
|
|
програма буде запущена(природно, тільки в тому випадку, якщо в програмі |
||
w |
|
|
|
|
|
|
|
|||||
|
|
w |
|
|
|
|
|
|
|
m |
||
|
|
w. . |
o |
помилок). |
||||||||
|
|
|
|
|
A BBYY |
c |
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F Tran |
sf |
|
||
|
|
|
|
|
D |
|
|
|||
|
|
|
Y |
P |
|
|
|
or |
e |
|
|
B |
Y |
|
|
|
|
|
|
m |
|
B |
|
|
|
|
|
buy |
r |
|||
|
|
|
|
|
|
2 |
||||
|
|
|
|
|
|
|
0 |
|||
A |
|
|
|
|
|
|
to |
|
|
. |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Click |
|
|
|
|
|
немає |
|
|
m |
|||||||
|
w |
|
|
|
|
|
|
|||
|
|
|
w |
w. |
|
|
|
o |
||
|
|
|
|
|
|
|
. |
|
||
|
|
|
|
|
|
A B BYY |
c |
|
||
|
|
|
|
|
|
|
|
2.10 Помилки
Компілятор переходить до другого етапу генерації виконуваної програми тільки в
тому випадку, якщо початковий текст не містить синтаксичних помилок. В більшості випадків в тільки що набраній програмі є помилки. Програміст повинен їх усунути. Процес усунення помилок носить ітераційний характер. Зазвичай спочатку усуваються
найбільш очевидні помилки, наприклад, оголошуються неоголошені змінні. Після чергового внесення змін до тексту програми виконується повторна компіляція. Слід
звернути увагу на те, що компілятор не завжди може точно локалізувати помилку. Тому, аналізуючи фрагмент програми, який, «на думку» компілятора, містить помилку, потрібно звертати увагу не тільки на той фрагмент коду, на який компілятор встановив
курсор, але і на той, який знаходиться в попередньому рядку. Наприклад, в наступному фрагменті коду:
//обчислити струм
i = u/r
//. вивести результат в полі мітки
Label4->Caption = "Струм : " +
FloatToStrf(i,ffgeneral,7,2)+ " А";
не поставлена крапка з комою після оператора привласнення. Компілятор це
виявляє, виводить повідомлення statement missing ; але виділяє рядок Label4->Caption
="Струм : " + і встановлює курсор після ідентифікатора Label4.
Утаблиці. 2.10 перераховані типові помилки і відповідні ним повідомлення компілятора.
Таблиця 2.10. Типові помилки
Повідомлення
Undefined symbol
(невідомий символ)
Statement missing ;
(відсутня крапка з комою)
Помилка |
|
|
|
|
Використовується |
неоголошена |
змінна |
|
Ім'я |
змінної, функції або параметра записано невірно. |
||||
Наприклад, в програмі оголошена зміннаSummа в |
|
|||
інструкціях використовується sum |
|
|
|
Після інструкції не поставлена крапка з комою
31
AB
|
|
|
F |
|
|
|
D |
|
|
Y |
P |
B |
Y |
|
|
|
|
||
|
|
|
|
w |
Click |
||
|
|||
|
|
w |
|
|
|
|
w. |
|
|
|
A |
Tran |
sf |
|
|
|
|
|
|
|
|
|
|
|
|
F |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|||
|
|
|
or |
e |
|
|
|
|
|
|
Y |
P |
|
|||
|
|
|
|
m |
|
|
|
|
|
B |
Y |
|
|
|
|
|
|
|
buy |
r |
|
|
|
B |
|
|
|
|
|||||
|
|
|
2 |
|
|
|
|
|
|
|
|
|||||
|
|
|
0 |
|
|
|
|
|
|
|
|
|
||||
|
to |
|
|
|
|
. |
|
|
|
A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
here |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Click |
||
|
|
|
|
o |
m |
Unterminated |
string or |
|
|
|
|
w |
||||
|
|
. |
|
|
|
|
|
|
|
w |
|
w. |
|
|||
BBYY |
c |
character |
constant(незавершена |
|
|
|
|
|
|
|
A |
|||||
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
В кінці строкової константи, наприклад, тексту |
||||||||||
|
|
|
|
|
строкова |
або |
символьна |
|
повідомлення, немає подвійних лапок |
|
|
|
|
|
|
|
|
|
|
|
|
константа) |
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
T ansf |
|
|||
|
|
|
or |
|
|
|
|
m |
|
|
|
|
|
e |
|
|
|
buy |
r |
|
|
|
0 |
|
|
|
|
|
2 |
|
|
to |
|
. |
|
here |
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
|
|
o |
|
|
|
|
.c |
|
B BYY |
|
) expected |
(очікується |
|
При записі арифметичного виразу, що містить |
|
|||
|
дужки, |
порушений |
баланс |
відкриваючих |
|
||
закриваюча дужка) |
|
|
закриваючих дужок |
|
|
|
|
|
|
|
|
|
|
if statement missing ( (у
інструкції if немає відкриваючої
дужки)
Compound statement missing }
У інструкції if умова не поміщена в дужки
Порушений баланс відкриваючих і закриваючих
фігурних дужок. Ймовірно, не поставлена закриваюча фігурна дужка що відзначає кінець функції або групи
інструкцій, наприклад, після умови або словаelse у інструкції if
Extra parameter |
in call |
|
Невірно записана інструкція виклику функції, |
|
to(зайвий параметр при |
виклику |
|
||
|
вказаний зайвий параметр |
|||
функції) |
|
|
|
|
Якщо компілятор виявив достатньо багато помилок, то проглянете всі повідомлення і усунете спочатку найбільш очевидні помилки і виконаєте повторну компіляцію. Цілком імовірно, що після цього кількість помилок значно зменшиться. Це
пояснюється особливостями синтаксису мови, коли одна незначна помилка може
"тягнути" за собою досить велику кількість інших.
2.11 Попередження і підказки
При виявленні в програмі неточностей, які не є помилками, компілятор виводить
підказки (Hints) і попередження (Warnings). Наприклад, найбільш підказкою, що часто
виводиться, є повідомлення про оголошену, але не використовувану змінну(... is declared but never used.). Дійсно, навіщо оголошувати змінну і не використовувати її? У таблиці. 2.11 приведені попередження, що найчастіше виводяться компілятором.
Таблиця 2.11. Попередження компілятора
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Попередження |
|
|
Вірогідна причина |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
не |
|
|
... is declared but never used |
|
Змінна |
оголошена, |
але |
ніде |
|
|
||||
|
|
використовується |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
||
|
Possibly |
incorrect |
assignment. |
|
У |
умові, |
наприклад, |
інструкції |
if |
|
|
|
|
(ймовірно, |
інструкція |
привласненнязамість |
оператора |
порівняння(==) |
|
|
|||||
|
некоректна) |
|
|
|
використаний оператор привласнення (=) |
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Possibly |
use of ... before definition. |
|
Не |
привласнено початкове |
значення |
|
|
||||
|
(ймовірно, |
використовується |
|
|
|
|||||||
|
|
змінної |
|
|
|
|
|
|
|
|||
|
неініціалізована змінна) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
F Tran |
sf |
|
|||
|
|
|
|
|
D |
|
|
|
|||
|
|
|
Y |
P |
|
|
|
|
or |
e |
|
|
B |
Y |
|
|
|
|
|
|
|
m |
|
B |
|
|
|
|
|
|
buy |
r |
|||
|
|
|
|
|
|
|
2 |
||||
|
|
|
|
|
|
|
|
0 |
|||
A |
|
|
|
|
|
|
|
to |
|
|
. |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
|
Click |
|
|
|
|
||
|
w |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|
||||
|
|
|
w |
w. |
|
|
|
|
o |
||
|
|
|
|
|
|
|
|
. |
|
||
|
|
|
|
|
|
A BBYY |
c |
|
|||
|
|
|
|
|
|
|
|
2.12 Компоновка
AB
|
|
|
|
|
F Tran |
sf |
|
|||
|
|
|
|
D |
|
|
|
|||
|
|
Y |
P |
|
|
|
|
or |
e |
|
B |
Y |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
buy |
r |
|||
|
|
|
|
|
|
|
2 |
|||
|
|
|
|
|
|
|
|
0 |
||
|
|
|
|
|
|
|
to |
|
|
. |
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
Click |
|
|
|
|
||
w |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
||||
|
|
w |
w. |
|
|
|
|
o |
||
|
|
|
|
|
|
|
. |
|
||
|
|
|
|
|
A B BYY |
c |
|
|||
|
|
|
|
|
|
|
Якщо в програмі немає помилок, то можна виконати компоновку. Для цього треба в меню Compile вибрати команду Make або Build. Різниця між командами Make і Build
полягає в наступному. Команда Make забезпечує компоновку файлів проекту, а команда Build — примусову перекомпіляцію, а потім — компоновку.
На етапі компоновки також можуть виникнути помилки. Найчастіше причина помилок під час компоновки полягає в недоступності файлів бібліотек або інших
модулів, що раніше відкомпілювалися. Усуваються ці помилки шляхом налаштування середовища розробки і включенням в проект бракуючих модулів. У простих проектах помилки часу компіляції, як правило, не виникають.
2.13 Запуск програми
Пробний запуск програми можна виконати безпосередньо з середовищ розробки, не завершуючи роботу з C++ Builder. Для цього потрібно в меню Run вибрати команду Run або клацнути на командній кнопці Run (мал. 2.33).
Мал. 2.33. Запуск програми з середовища розробки
2.14 Помилки часу виконання
Під час роботи додатки можуть виникати помилки, які називаються помилками
часу виконання (run time errors) або виключеннями (exceptions). В більшості випадків
причинами виключень є невірні початкові дані.
Наприклад, якщо під час роботи програми обчислення сили струму в полі Напругу ввести ю.5, тобто розділити цілу і дробову частину крапкою, то в результаті
клацання на кнопці Обчислити на екрані з'явиться вікно з повідомленням про помилку
(мал. 2.34).
33
AB
|
|
|
|
|
F Tran |
sf |
|
|||
|
|
|
|
D |
|
|
|
|||
|
|
Y |
P |
|
|
|
|
or |
e |
|
B |
Y |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
buy |
r |
|||
|
|
|
|
|
|
|
2 |
|||
|
|
|
|
|
|
|
|
0 |
||
|
|
|
|
|
|
|
to |
|
|
. |
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
Click |
|
|
|
|
||
w |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
||||
|
|
w |
w. |
|
|
|
|
o |
||
|
|
|
|
|
|
|
. |
|
||
|
|
|
|
|
A BBYY |
c |
|
|||
|
|
|
|
|
|
|
AB
|
|
|
|
|
F Tran |
sf |
|
|||
|
|
|
|
D |
|
|
|
|||
|
|
Y |
P |
|
|
|
|
or |
e |
|
B |
Y |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
buy |
r |
|||
|
|
|
|
|
|
|
2 |
|||
|
|
|
|
|
|
|
|
0 |
||
|
|
|
|
|
|
|
to |
|
|
. |
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
Click |
|
|
|
|
||
w |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
||||
|
|
w |
w. |
|
|
|
|
o |
||
|
|
|
|
|
|
|
. |
|
||
|
|
|
|
|
A B BYY |
c |
|
|||
|
|
|
|
|
|
|
Мал. 2.34. Приклад вікна з повідомленням про помилку часу виконання (програма запущена з Windows)
Причина виникнення помилки в наступному. У тексті програми дробова частина числа від цілої відділяється крапкою. При введенні даних в полі редагування користувач може відокремити дробову частину числа цілою крапкою або комою. Який з
цих двох символів є правильним, залежить від налаштування Windows.
Якщо в налаштуванніWindows вказане, що роздільник цілої і дробової частин числа — кома (для Росії це стандартна установка), а користувач використовував крапку
(ввів в поле Напругу (Edit1) рядок10.5), то при виконанні інструкції
u = StrToFloat(Editl->Text);
виникне виключення, оскільки при вказаному налаштуванніWindows вміст поля редагування і, отже, аргумент функції Strtofloat не є зображенням дробового числа.
Якщо програма запущена з середовища розробки, то при виникненні виключення виконання програми припиняється і на екрані з'являється вікно з повідомленням про
помилку і її тип. Як приклад на мал. 2.35 приведено вікно повідомлення про виникнення
виключення, причина якого полягає в тому, що рядок, введений користувачем в полі редагування, не є дробовим числом.
Мал. |
2.35. Приклад повідомлення про |
виникнення |
виключення(програма |
запущена з C++ Builder) |
|
|
|
Після |
виникнення виключення і клацання |
на кнопці |
ОК у діалоговому вікн |
Debugger Exception Notification (мал. 2.35) виконання програми можна перервати або,
не дивлячись на виниклу помилку, продовжити. Щоб перервати виконання програми,
треба в меню Run вибрати команду Program Reset щоб продовжити — команду Step Over.
Обробку виключень бере на себе код, що автоматично додається у виконувану
програму, який забезпечує, зокрема, і виведення інформаційного повідомлення. Разом з тим C++ Builder дає можливість програмі самій виконати обробку виключення.
34
AB
|
|
|
|
|
F Tran |
sf |
|
|||
|
|
|
|
D |
|
|
|
|||
|
|
Y |
P |
|
|
|
|
or |
e |
|
B |
Y |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
buy |
r |
|||
|
|
|
|
|
|
|
2 |
|||
|
|
|
|
|
|
|
|
0 |
||
|
|
|
|
|
|
|
to |
|
|
. |
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
Click |
|
|
|
|
||
w |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
||||
|
|
w |
w. |
|
|
|
|
o |
||
|
|
|
|
|
|
|
. |
|
||
|
|
|
|
|
A BBYY |
c |
|
|||
|
|
|
|
|
|
|
Інструкція обробки виключення виглядає так:
try
{
// тут інструкції, виконання яких може викликати виключення
}
catch ( Тип &е)
{
// тут інструкції обробки виключення
}
де:
AB
|
|
|
|
|
F Tran |
sf |
|
|||
|
|
|
|
D |
|
|
|
|||
|
|
Y |
P |
|
|
|
|
or |
e |
|
B |
Y |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
buy |
r |
|||
|
|
|
|
|
|
|
2 |
|||
|
|
|
|
|
|
|
|
0 |
||
|
|
|
|
|
|
|
to |
|
|
. |
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
Click |
|
|
|
|
||
w |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
||||
|
|
w |
w. |
|
|
|
|
o |
||
|
|
|
|
|
|
|
. |
|
||
|
|
|
|
|
A B BYY |
c |
|
|||
|
|
|
|
|
|
|
§try — ключове слово, що позначає, що далі слідують інструкції, при виконанні яких можливе виникнення виключень, і що обробку цих виключень бере на себе програма;
§catch — ключове слово, що позначає початок секції обробки виключення.
Інструкції цієї секції будуть виконані, якщо в програмі виникне виключення вказаного типу.
Основною характеристикою виключення є його тип. У таблиці. 2.12 перераховані найбільш часто виникаючі виключення і вказані причини, які можуть привести до їх
виникнення.
Таблиця 2.12. Типові виключення
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Виключення |
|
|
|
Виникає |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|||||
|
EConvertError |
— |
|
|
При виконанні перетворення, якщо перетворювана |
|
|
||||||
|
|
величина не може бути приведена до необхідного типу. |
|||||||||||
|
помилка перетворення |
|
|
Найчастіше виникає при перетворенні рядка символів в |
|||||||||
|
|
|
|
|
число |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EDivByZero |
— |
|
|
При |
виконанні |
операції |
цілочисельного |
ділення, |
||||
|
цілочисельне |
ділення |
|
|
на |
||||||||
|
нуль |
|
|
|
якщо дільник дорівнює нулю |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
EZeroDivide |
— |
|
|
При |
виконанні |
операції |
ділення над |
дробовими |
||||
|
ділення на нуль |
|
|
|
операндами, якщо дільник дорівнює нулю |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
При |
виконанні |
файлових |
операцій. Найбільш |
|
|
||
|
EInOutError |
— |
|
частою причиною є відсутність необхідного файлу або, у |
|
|
|||||||
|
помилка введення/виводу |
|
|
разі використання змінного диска, відсутність диска |
в |
||||||||
|
|
|
|
|
накопичувачі |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35
AB
|
|
|
F |
|
|
|
D |
|
|
Y |
P |
B |
Y |
|
|
|
|
||
|
|
|
|
w |
Click |
||
|
|||
|
|
w |
|
|
|
|
w. |
|
|
|
A |
Tran |
sf |
|
|
|
|
|
|
|
|
|
F Tran |
sf |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|||||
|
|
|
or |
e |
|
|
|
Y |
P |
|
|
|
|
or |
e |
||||
|
|
|
|
m |
|
B |
Y |
|
|
|
|
|
|
|
|
m |
|||
|
|
buy |
|
r |
B |
|
|
|
|
|
|
buy |
r |
||||||
|
|
|
2 |
|
|
|
|
|
|
|
2 |
||||||||
|
|
|
0 |
|
|
|
|
|
|
|
|
0 |
|||||||
|
to |
|
|
|
|
. |
A |
|
|
|
|
|
|
|
to |
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
here |
|
|
|
|
|
|
|
|
|
|
|
|
here |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
Click |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
m |
У програмі обчислення сили струму виключення можуть виникнути при виконанні |
|
|
|
|
m |
||||||||
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|||||
|
|
|
|
o |
|
|
|
|
w |
|
|
|
|
|
|
o |
|||
|
|
|
c |
|
перетворення рядків, введених в поля редагування, в числа і при обчисленні величини |
|
|
c |
|
||||||||||
|
|
. |
|
|
|
|
|
|
|
|
w. |
|
|
. |
|
|
|||
BBYY |
|
|
|
|
|
|
|
|
|
|
A B BYY |
|
|
|
струму. Виключення EConvertCrror виникне, якщо користувач неправильно введе числа в поля редагування: наприклад, розділив цілу і дробову частини крапкою. Виключення EZeroDivide виникне, якщо користувач задасть величину опору рівну нулю. У лістингу 2.3 приведена функція обробки події OnСlick на командній кнопці Обчислити. У функцію
включені інструкції обробки виключень.
Лістинг 2.3. Обробка виключень
void __fastcall TForm1::Button1Click(TObject *Sender)
{ |
|
float u; |
// напруга |
float r; |
// опір |
float i; |
// струм |
//отримати дані з полів введення
//можливе виключення — помилка перетворення рядка в число
try
{
u = StrToFloat(Editl->Text);
r = StrToFloat(Edit2->Text);
}
catch (EConvertError &e)
(
ShowMessage("При введенні дробових чисел використову кому.");
return;
}
//обчислити струм
//можливе виключення — ділення на нуль
try
36
AB
|
|
|
|
|
F Tran |
sf |
|
|||
|
|
|
|
D |
|
|
|
|||
|
|
Y |
P |
|
|
|
|
or |
e |
|
B |
Y |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
buy |
r |
|||
|
|
|
|
|
|
|
2 |
|||
|
|
|
|
|
|
|
|
0 |
||
|
|
|
|
|
|
|
to |
|
|
. |
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
Click |
|
|
|
|
||
w |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
||||
|
|
w |
w. |
|
|
|
|
o |
||
|
|
|
|
|
|
|
. |
|
||
|
|
|
|
|
A BBYY |
c |
|
|||
|
|
|
|
|
|
|
{
i = u/r;
}
catch (EZeroDivide &e)
{
AB
|
|
|
|
|
F Tran |
sf |
|
|||
|
|
|
|
D |
|
|
|
|||
|
|
Y |
P |
|
|
|
|
or |
e |
|
B |
Y |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
buy |
r |
|||
|
|
|
|
|
|
|
2 |
|||
|
|
|
|
|
|
|
|
0 |
||
|
|
|
|
|
|
|
to |
|
|
. |
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
Click |
|
|
|
|
||
w |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
||||
|
|
w |
w. |
|
|
|
|
o |
||
|
|
|
|
|
|
|
. |
|
||
|
|
|
|
|
A B BYY |
c |
|
|||
|
|
|
|
|
|
|
ShowMessage("Величина опору не має дорівнювати нулю"); Edit2->SetFocus(); // курсор а поле Опір
return; }
// вивести результат в полі мітки
Label4->Caption = "Струм : " +
FloatToStrf(i,ffgeneral,7,3);
У приведеній функції для виведення повідомлень у разі виникнення виключень
використана функція ShowMessage, яка виводить на екран вікно з текстом і командною
кнопкою .ОК Інструкція виклику функціїShowMessage виглядає так: ShowMessage(Повідомлення);
Де повідомлення — строкова константа (текст, який треба вивести). На мал. 2.36 приведений вид вікна повідомлення, отриманого в результаті виконання інструкції:
ShowMessage("Величина опору не має дорівнювати нулю.");
Мал. 2.36. Повідомлення, виведене функцією ShowMessage
Слід звернути увагу на те, що в заголовку вікна повідомлення, що виводиться функцією ShowMessage указується назва додатку. Назва додатку задається на вкладці Application вікна Project Options. Якщо назва додатку не задана, то в заголовку буде ім'я виконуваного файлу.
Для виведення повідомлень можна використовувати функціюMessagedig.
Функція Messagedig дозволяє помістити у вікно з повідомленням один із стандартних
значків, наприклад "Увага", задати кількість і тип командних кнопок і визначити, яку з
37
AB
|
|
|
F |
|
|
|
D |
|
|
Y |
P |
B |
Y |
|
|
|
|
||
|
|
|
|
w |
Click |
||
|
|||
|
|
w |
|
|
|
|
w. |
|
|
|
A |
Tran |
sf |
|
|
|
|
|
|
|
|
|
F Tran |
sf |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|||||
|
|
|
or |
e |
|
|
|
Y |
P |
|
|
|
|
or |
e |
||||
|
|
|
|
m |
|
B |
Y |
|
|
|
|
|
|
|
|
m |
|||
|
|
buy |
|
r |
B |
|
|
|
|
|
|
buy |
r |
||||||
|
|
|
2 |
|
|
|
|
|
|
|
2 |
||||||||
|
|
|
0 |
|
|
|
|
|
|
|
|
0 |
|||||||
|
to |
|
|
|
|
. |
A |
|
|
|
|
|
|
|
to |
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
here |
|
|
|
|
|
|
|
|
|
|
|
|
here |
|
|
|
|
||
|
|
|
|
|
кнопок натиснув користувач. На мал. 2.37 приведено вікно, виведене в |
|
|
|
|
|
Click |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
результаті |
|
|
|
|
m |
||||||||
|
|
|
|
|
m |
|
w |
|
|
|
|
|
|
|
|
||||
|
|
|
|
o |
виконання інструкції |
|
|
|
w |
w. |
|
|
|
|
|
o |
|||
|
|
|
c |
|
|
|
|
|
|
|
|
|
|
c |
|
||||
|
|
. |
|
|
|
|
|
|
|
|
|
|
. |
|
|
||||
BBYY |
|
|
|
|
|
|
|
|
|
|
A B BYY |
|
|
|
Messagedig("Файл c:\xtemp\\test.txt буде видалений.",
mtwarning, Tmsgdlgbuttons() « mbok « mbcancel, 0);
Мал. 2.37. Приклад вікна повідомлення
Значення функції Messagedig — число, перевіривши значення якого можна визначити, вибором якої командної кнопки був завершений діалог. У загальному вигляді
звернення до функції Messagedig виглядає так:
Вибор:= Messagedig(Повідомлення, Тип, Кнопки, Контекст справки)
де:
§повідомлення — текст повідомлення;
§Тип — тип повідомлення. Повідомлення може бути інформаційним, застережливим або повідомленням про критичну помилку. Кожному типу повідомлення
відповідає певний значок. Тип повідомлення задається іменованою константою
(таблиця. 2.13);
§кнопки — кнопки, що відображаються у вікні повідомлення. Задаються операцією включення в множину елементів — констант (таблиця. 2.14).
§контекст справки — параметр, який визначає розділ довідкової інформації, який з'явиться на екрані, якщо користувач натисне клавішу<F1>. Якщо виведення
довідкової інформації не передбачене, то значення параметра має дорівнювати нулю.
Таблиця 2.13. Константи, що визначають тип повідомлення
|
|
|
|
|
|
|
|
Константа |
|
Тип повідомлення |
|
Значок |
|
|
|
|
|
|
|
|
|
MtWarning |
|
Увага |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MtError |
|
Помилка |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Mtlnformation |
|
Інформація |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MtConfirmation |
|
Підтвердження |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MtCustom |
|
Звичайне |
|
Без значка |
|
|
|
|
|
|
|
|
38
AB
|
|
|
|
|
F Tran |
sf |
|
|||
|
|
|
|
D |
|
|
|
|||
|
|
Y |
P |
|
|
|
|
or |
e |
|
B |
Y |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
buy |
r |
|||
|
|
|
|
|
|
|
2 |
|||
|
|
|
|
|
|
|
|
0 |
||
|
|
|
|
|
|
|
to |
|
|
. |
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
Click |
|
|
|
|
||
w |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
||||
|
|
w |
w. |
|
|
|
|
o |
||
|
|
|
|
|
|
|
. |
|
||
|
|
|
|
|
A BBYY |
c |
|
|||
|
|
|
|
|
|
|
Таблиця 2.14. Константи, що визначають кнопки у вікні повідомлення
Константа |
|
Кнопка |
|
Константа |
|
Кнопка |
mbYes |
|
|
|
|
|
Abort |
|
Yes |
|
mbAbort |
|
||
mbNo |
|
|
|
|
|
Retry |
|
No |
|
mbRetry |
|
||
mbOk |
|
|
|
|
|
Ignore |
|
OK |
|
mblgnore |
|
||
mbCancel |
|
|
|
|
|
All |
|
Cancel |
|
mbAll |
|
||
mbHelp |
|
|
|
|
|
|
|
Help |
|
|
|
|
AB
|
|
|
|
|
F Tran |
sf |
|
|||
|
|
|
|
D |
|
|
|
|||
|
|
Y |
P |
|
|
|
|
or |
e |
|
B |
Y |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
buy |
r |
|||
|
|
|
|
|
|
|
2 |
|||
|
|
|
|
|
|
|
|
0 |
||
|
|
|
|
|
|
|
to |
|
|
. |
|
|
|
|
|
|
here |
|
|
|
|
|
|
|
|
Click |
|
|
|
|
||
w |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
||||
|
|
w |
w. |
|
|
|
|
o |
||
|
|
|
|
|
|
|
. |
|
||
|
|
|
|
|
A B BYY |
c |
|
|||
|
|
|
|
|
|
|
Окрім приведених констант можна використовувати константиmbokcancel, |
|
|||
mbyesnocancel іmbabortretryignore. Ці |
константи |
визначають |
найбільш |
часто |
використовувані в діалогових вікнах комбінації командних кнопок. |
|
|
Значення, повертане функцією Messagedig (таблиця. 2.15)дозволяє визначити, яка з командних кнопок була натиснута користувачем.
Таблиця 2.15. Значення функції Messagedlg
|
|
|
|
|
|
Значення функції Messagedlg |
|
Діалог завершений натисненням кнопки |
|
|
|
|
|
|
|
mrAbort |
|
Abort |
|
|
|
|
|
|
|
mrYes |
|
Yes |
|
|
|
|
|
|
|
mrOk |
|
Ok |
|
|
|
|
|
|
|
mrRetry |
|
Retry |
|
|
|
|
|
|
|
mrNo |
|
No |
|
|
|
|
|
|
|
mrCancel |
|
Cancel |
|
|
|
|
|
|
|
mrlgnore |
|
Ignore |
|
|
|
|
|
|
|
mrAll |
|
All |
|
|
|
|
|
|
2.15 Внесення змін
Після декількох запусків програми "Сила струму" виникає бажання удосконалити
програму, внести до неї зміни. Наприклад, такі, щоб після введення напруги в результаті натиснення клавіші <Enter> курсор переходив в полі Опір, а після введення
опору в результаті натиснення цієї ж клавіші виконувався розрахунок. Крім того, було б непогано, щоб користувач міг вводити в поля редагування тільки числа. Щоб внести
зміни до програми, потрібно запустити C++ Builder і відкрити відповідний проект. Зробити це можна звичайним способом, вибравши в меню File команду Open Project.
Можна також скористатися командою Reopen з меню File. При виборі команди Reopen відкривається список проектів, над якими працював програміст останнім часом. У
лістингу 2.4 приведена програма "Сила струму", до якої внесені зміни: додані функції
39
AB
|
|
|
F |
|
|
|
D |
|
|
Y |
P |
B |
Y |
|
|
|
|
||
|
|
|
|
w |
Click |
||
|
|||
|
|
w |
|
|
|
|
w. |
|
|
|
A |
Tran |
sf |
|
|
|
|
|
|
|
|
|
|
|
|
F Tran |
sf |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|||||
|
|
|
or |
e |
|
|
|
|
|
|
Y |
P |
|
|
|
|
or |
e |
||||
|
|
|
|
m |
|
|
|
|
B |
Y |
|
|
|
|
|
|
|
|
m |
|||
|
|
buy |
|
r |
|
|
|
B |
|
|
|
|
|
|
buy |
r |
||||||
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
2 |
||||||||
|
|
|
0 |
|
|
|
|
|
|
|
|
|
|
|
0 |
|||||||
|
to |
|
|
|
|
. |
|
|
|
A |
|
|
|
|
|
|
|
to |
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
here |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
here |
|
|
|
|
||
|
|
|
|
|
обробки |
подій OnKeyPress для |
компонентів Edit1 і |
Edit2. Щоб додати |
|
|
|
|
|
Click |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
в програму |
|
|
|
m |
||||||||||||
|
|
|
|
|
m |
|
|
|
|
w |
|
|
|
|
|
|
|
|
||||
|
|
|
|
o |
функцію |
обробки події, треба у |
вікніObject Inspector |
вибрати компонент, |
|
|
|
w |
|
|
|
|
|
|
o |
|||
|
|
|
c |
|
для якого |
|
|
c |
|
|||||||||||||
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
w. |
|
|
. |
|
|
|||
BBYY |
|
|
|
|
|
|
|
|
|
|
|
|
|
A B BYY |
|
|
|
потрібно створити функцію обробки події, на вкладці Events вибрати подію і зробити подвійне клацання в полі поряд з ім'ям події. C++ Builder сформує шаблон функції обробки події. Після цього можна вводити інструкції, що реалізовують функцію.
Лістинг 2.4. Функції обробки подій на компонентах форми програми "Сила струму"
// клацання на кнопці Обчислити
void__fastcall TForm1::Button1Click(TObject *Sender)
{
float u; // напруга float r; // опір float i; // струм
// перевіримо, чи введені дані в поля Напруга і Опір
if ( ((Edit1->Text).Length() == 0) || ((Edit2->Text).Length() ==0))
{
Messagedlg("Haдo ввести напругу і опір" mtlnformation, Tmsgdlgbuttons() << mbok, 0); if ((Editl->Text).Length() == 0) Edit1->SetFocus(); // курсор в полі Напруга else
Edit2->SetFocus(); // курсор в полі Опір return; }; // отримати дані з полів введення
u = StrToFloat(Editl->Text);
r = StrToFloat(Edit2->Text); // обчислити силу струму try
{
i = u/r;
}
catch (Ezerodivide &e)
40