Робота з отладчиком
Давайте від теорії перейдемо до практики. Завантажте Lazarus з новим проектом, встановіть на форму просту кнопку і збережіть проект в папку 27-01. Імена проекту, форми, модуля і кнопки змінювати не потрібно, залиште імена, дані за замовчуванням.
Далі, згенеруйте подія OnClick для кнопки, в якому напишіть наступний код:
Що ми тут робимо? Цілочисельну змінну i використовуємо в якості лічильника для циклу for. Цикл виробляємо від -3 до 3, тобто, 7 разів, включаючи нуль. У тілі циклу ми ділимо 10 на значення i. результат оформляємо у вигляді рядка і додаємо до списку рядків st. Ми вже наголошували, що подібні дії потрібно укладати в блок обробки виняткових ситуацій try-finally-end. що ми і зробили.
Якщо ви уважно вивчали курс, то неозброєним оком бачите, що при четвертому проході циклу відбудеться помилка часу виконання - розподіл 10 на нуль. Такий очевидний приклад найбільше підходить для знайомства з вбудованим отладчиком, так як ви вже знаєте, де буде помилка, і зможете проаналізувати роботу відладчика. Тому прикинемося, що не підозрюємо про помилку.
Отже, програму ми написали, зберегли, пора її компілювати. Натисніть кнопку "Запустити" на Панелі управління (або
Мал. 27.3. Повідомлення Lazarus про помилку
Судячи з повідомлення, помилка сталася під час виконання коду 42-го рядка. Гаразд, натиснемо "ОК" і командою "Запуск -> Скинути відладчик" припинимо виконання програми. Повернемося до коду і проаналізуємо 42-й рядок (якщо ви додавали порожні рядки, то у вас буде інший номер):
Ну що, нічого кримінального тут немає, чому ж сталася помилка? Код вірний і повинен був нормально виконуватися ... Коли ви заходите в подібний глухий кут. допомогти вам може здоровий глузд і вбудований відладчик. Здоровий глузд говорить, що помилка сталася десь в тілі циклу for. А щоб скористатися отладчиком, потрібно призупинити виконання програми на цьому циклі, щоб потім через підрядник його продовжити. Для зупинки роботи програми служать так звані точки зупинки (англ. Breakpoints).
Точки останова- це рядки, перед виконанням яких відладчик припиняє виконання програми, і чекає ваших подальших дій.
Ви можете встановити одну таку точку або декілька, в різних частинах коду. Оскільки помилка виникає в 42-му рядку, розумніше буде призупинити виконання на попередній, 41-му рядку. Переведіть курсор на цей рядок, на будь-який її місце.
Встановити точку зупину можна різними способами:
Останні два способи найбільш зручні, але вибирати вам. У будь-якому випадку, рядок з встановленої точкою зупинки забарвиться червоним кольором:
Мал. 27.4. Рядок з точкою зупинки
Зняти точку зупину зручніше також останніми двома способами. Точка зупинки у нас є, знову натискаємо кнопку "Запустити". Програма починає свою роботу, натискаємо кнопку "Button1".
Мал. 27.5. Рядок, яка буде виконана далі
У нас викликів функцій немає, тому ми можемо скористатися як
Отже, натиснемо
Тут нам на допомогу приходить ще один корисний інструмент отладчика - спостереження за значеннями змінних. Скиньте програму командою "Запуск -> Скинути відладчик". Тепер знову натисніть кнопку "Запустити", а потім знову кнопку "Button1". Отладчик знову призупинив виконання програми на сходинці з циклом, однак не поспішайте натискати
Мал. 27.6. Установка спостереження за змінною
Тепер відладчик спостерігає за значеннями змінної i. але нам від цього не легше - ми не бачимо цих значень! Щоб їх побачити, потрібно вивести на екран вікно Списку спостережень. Робиться це командою "Вид -> Вікна налагодження -> Вікно спостережень" або "гарячими клавішами"
яке у нас повинно обчислюватися всередині циклу. У вікні Списку спостереження ви побачите і змінну i. і вираз. а також їх значення:
Мал. 27.7. Вікно Списку спостережень
Оскільки змінної i ще не було присвоєно значення -3, то в колонці значень ви, швидше за все, побачите 1, яким за замовчуванням була проініціалізувати наша змінна. Відповідне значення буде і у вирази. Тепер ми готові рухатися далі. натискаємо
натискаємо
виявилася невдалою, то коли змінна i дорівнює нулю. І тут вже нескладно здогадатися, чому ця помилка виникає - тому що відбувається спроба ділення 10 на 0.
Мал. 27.8. Результуюче повідомлення програми
Як бачите, обчислення. де i дорівнює нулю, було пропущено.
Вбудований відладчик має і інші інструменти, з якими ви самі зможете згодом освоїтися, експериментуючи з ними.
Дякуємо за Ваш чудовий курс!
У самостійній роботі №2 при компіляції модуля MyCript.pas (ОС: Windows 7 x64, Lazarus 1.4 win64) видається помилка на код асемблера
mycript.pas (54,5) Error: Asm: [push reg32] invalid combination of opcode and operands
mycript.pas (95,5) Error: Asm: [pop reg32] invalid combination of opcode and operands
Я розумію, що курс готувався для 32 розрядних ОС, але як бути в разі 64 розрядних систем?
У обробниках пунктів меню FileCreate і FileOpen, а також в обробнику закриття форми OnClose - в цих трьох процедурах міститься один і той же код
їх перед створенням нового тексту>
if Memo1.Modified then begin
// якщо користувач згоден зберегти зміни:
if MessageDlg ( 'Збереження файлу',
'Поточний файл був змінений. Зберегти зміни?',
mtConfirmation, [mbYes, mbNo, mbIgnore], 0) = mrYes then
FileSaveClick (Sender);
end; // if
Дозвольте запитати: чи не краще було б винести цей код в окрему процедуру, наприклад - в обробник події форми OnCloseQuery? Наскільки я пам'ятаю з досвіду Delphi, виклик цієї процедури сам по собі не повинен призводити до закриття форми. А значить, її можна використовувати і в процедурах очищення Memo1 і читання з файлу. Або в Lazarus так робити не можна?