Глава 6 Програмування додатків з графічним інтерфейсом
нени всі оператори поточного рядка (тому рекомендується розташовувати в рядку строго по одному оператору, щоб мати можливість контролювати виконання кожного оператора окремо). Кожне наступне натискання клавіші F7 викличе виконання оператора в наступному рядку. Здійснюється в даний момент оператор буде виділено сірим кольором, а її номер позначений зеленою стрілкою, рис. 6.35. Якщо в коді зустрічається виклик процедури або функції, то будуть виконані всі оператори тіла цієї процедури (функції)
також в покроковому режимі.
Покрокове виконання в обхід. При кожному натисканні клавіші F8 також будуть виконані всі оператори поточного рядка. Якщо в коді зустрічається ви-
поклик процедури або функції, то будуть виконані всі оператори тіла процеду-
ри (функції) без входу, тобто "Відразу" і покажчик буде встановлений на следую-
щей після виклику підпрограми рядку.
Вікно спостережень. Мабуть, найголовніший і корисний інструмент від-
ладком. В цьому вікні можна спостерігати за поточними значеннями змінних в процесі виконання програми. Цей засіб допоможе вам простежити за життєвим циклом цікавлять вас змінних і побачити, як змінюються їхні значення після виконання того чи іншого оператора. Відкрити це вікно можна командою меню Вид -> Вікна налагодження -> Вікно спостережень. ще про-
ще відкрити комбінацією клавіш
зан на малюнку 6.36. Щоб додати нову змінну клацніть правою кла-
вишів у вікні спостережень, в діалоговому вікні введіть ім'я пере-
тимчасової або вираз, рис. 6.37. Можна призначити постійне местоположе-
![Основи програмування в середовищі lazarus (Візуальне програмування середовищі Lazarus) Основи програмування в середовищі lazarus](https://images-on-off.com/images/148/osnoviprogrammirovaniyavsredelazarus-25428821.jpg)
6.3 Візуальне програмування в середовищі Lazarus
Мал. 6.35. Покрокове виконання програми
Мал. 6.36. Вікно списку спостережень
Мал. 6.37. Вікно додавання нової змінної в список спостереження
Прийнято вважати, що налагодження передує тестування. Тобто про-
грамміст, розробляючи програму, спочатку налагоджує її (виявляє і
"Вбиває" всіх "жучків"), потім приступає до тестування. Але, взагалі гово-
Глава 6 Програмування додатків з графічним інтерфейсом
ря, тестування і налагодження взаємопов'язані процеси. Найчастіше при тестіро-
вання виявляються помилки, які виправляються ... налагодженням, і навпаки,
під час налагодження виявляються багато алгоритмічні помилки. Тому це словосполучення практично завжди вживають разом - тестування і налагодження.
В принципі, тестування починається тоді, коли ваше додаток стала цілком працездатною, тобто перестала "вилітати", "зависати", "заціклі-
тися "і так далі і стала видавати результати. Правильні це результати виявляються тестуванням. Але, крім правильності отриманих результатів,
під час тестування дуже важливо перевіряти "неприпустимі", "неможливі"
і навіть "дурні" дії користувача. Якщо він не повинен вводити число 0, ви обов'язково повинні перевірити, як поведе себе ваша програма при введенні саме цього самого нуля і т.д. У розглянутих нами прикладах ми, по суще-
ству, цим і займалися!
6.3.10 Компоненти відображення і вибору даних
Ця група компонентів дозволяє в наочному вигляді відображати інформа-
цію, а також легко здійснювати вибір потрібних даних. Інформація в цих компонентах міститься у вигляді списку (набору) рядків. Для роботи зі списками рядків розроблений спеціальний клас TStrings. Цей клас є абстрактне
вим і інкапсулює методи для роботи з наборами рядків. Від цього класу на-
Слід спеціалізовані класи в компонентах відображення і вибору даних, які забезпечують доступ і обробку набору рядків в соответст-
вії з функціональністю компонента. Оскільки методи додавання і удале-
ня рядків в класі TStrings не реалізовані і оголошені як абстрактні,
всі класи спадкоємці в компонентах відображення і вибору перекривають ці методи. Для введення, редагування і виведення багаторядкових даних зручніше
6.3 Візуальне програмування в середовищі Lazarus
використовувати компонент TMemo.
6.3.10.1. компонент TMemo
"Блокнот", тобто доступні всі стандартні функції редагування (виділення,
Інформація в TMemo міститься у вигляді сукупності (масиву) рядків типу TStrings. Кожен елемент масиву містить рівно один рядок. дос
тупий до окремому рядку здійснюється за допомогою властивості Lines по її но-
міру (індексу). Індекс вказується, як і належить для масивів, в квадрат-
них дужках. Нумерація рядків починається з нуля. Загальна кількість рядків з-
тримається в властивості Lines.Count.
Якщо рядок не вміщується цілком у вікні, то можна встановити властивість
WordWrap = true і тоді не уміщається частина рядка буде автоматично перенесена на наступний рядок.
Можна також встановити смуги прокрутки властивістю ScrollBars.
Можливі значення властивості:
ssNone - встановлено за замовчуванням, смуги прокрутки відсутні.
ssVertical - встановити вертикальну смугу прокрутки.
ssHorizontal - встановити горизонтальну смугу прокрутки.
ssBoth - встановити і вертикальну і горизонтальну смуги.
ssAutoVertical - вертикальна смуга в вікні компонента видно, але не доступна, поки вікно не заповниться по вертикалі.
ssHorizontal - горизонтальна смуга в вікні компонента видно, але не доступна, поки вікно не заповниться по горизонталі.
ssAutoBoth - об'єднує два попередніх значення.
Заборонити користувачеві редагування можна, встановивши властивість
Глава 6 Програмування додатків з графічним інтерфейсом
Додавання нового рядка при введенні даних з клавіатури здійснюється натисканням клавіші Enter. при цьому властивість WantReturns має бути ус-
тановлено рівним true. Якщо WantReturns = false. то для переходу на новий рядок необхідно натиснути Ctrl + Enter.
Властивість SelStart вказує початок виділеного тексту, а SelLength
- довжину виділеного тексту (кількість символів).
У властивості Text весь набір рядків представляється у вигляді одного рядка з роздільниками повернення каретки і перенесення рядка (# 13 # 10) між рядками.
Подивимося, як програмно заповнювати поле введення компонента. щоб до-
бавить рядок в TMemo необхідно скористатися методами:
function Add (const S: string): integer; - додає рядок S
в кінець набору рядків TMemo і повертає її індекс.
procedure Append (const S: string); - просто додає рядок S
в кінець набору рядків.
Щоб додати цілий набір рядків, наприклад, з іншого компонента
TMemo. можна застосувати методи:
procedure AddStrings (TheStrings: Tstrings); - де TheStrings набір рядків типу TStrings. додає цей набір рядків до сущест-
procedure Assign (Source: TPersistent); - повністю очищає вміст TMemo і завантажує новий набір рядків з Source.
Для вставки рядка в довільне місце списку рядків існує метод
procedure Insert (Index: integer; const S: string); -
де Index номер (індекс) рядки куди вставляється рядок S. При цьому стара рядок не зникає, а зсувається вниз разом з усіма нижележащими рядками
(Їх індекси автоматично збільшуються на одиницю).
Замінити вміст якого-небудь рядка можна простим оператором присвоювання, наприклад, щоб замінити вміст рядка з індексом до дос-
![Основи програмування в середовищі lazarus (середовищі) Основи програмування в середовищі lazarus](https://images-on-off.com/images/148/osnoviprogrammirovaniyavsredelazarus-7b4897e1.jpg)
6.3 Візуальне програмування в середовищі Lazarus
таточно записати оператор:
Memo1.Lines [k]: = 'Вміст замінної рядки';
Додавати рядки оператором присвоювання теж можна, але за однієї ус-
ловіі, не можна застосовувати цей спосіб під час створення форми, тобто в обработ-
Чіке OnCreate форми.
І, нарешті, щоб видалити рядок застосовується метод
Давайте застосуємо отримані знання на простому прикладі. створіть но
вий проект. Покладіть на форму два компоненти TMemo. два написи і кнопку приблизно так, як показано на малюнку 6.38.
Мал. 6.38. Форма з компонентами TMemo
В обробник OnCreate форми введіть код:
procedure TForm1.FormCreate (Sender: TObject);
Memo1.Lines.Append ( 'Це довга рядок,' + // метод Append
«Не вміщується у вікні Memo1 ');
Memo1.Lines.Add ( "А це короткий рядок '); // метод Add
Memo2.Clear; // очищення набору рядків Memo2
for i: = 0 to Memo1.Lines.Count - 1 do // додавання рядків
Memo2.Lines.Append (Memo1.Lines [i]); // в циклі
//Memo2.Lines.Add(Memo1.Lines[i]);// можна застосувати Add
Memo2.Lines.AddStrings (Memo1.Lines); // 1-й спосіб
Memo2.Lines.Assign (Memo1.Lines); // 2-й, з очищенням
Експериментуйте з введенням тексту при різних значеннях властивостей
WordWrap. WantReturns. ReadOnly і ScrollBars.
Для установки параметрів шрифту є властивість Font. У ньому є такі подсвойства, як Name - назва шрифту, Size - розмір, Color -
колір, Style - стиль накреслення шрифту та інші.
Властивість Aligment - служить для вирівнювання тексту в вікні TMemo.
Воно має значення:
taLeftJustify - вирівнювання по лівому краю. taCenter - вирівнювання по центру. taRightJustify - вирівнювання по правому краю.
![Основи програмування в середовищі lazarus (середовищі) Основи програмування в середовищі lazarus](https://images-on-off.com/images/148/osnoviprogrammirovaniyavsredelazarus-54f341f5.jpg)
6.3 Візуальне програмування в середовищі Lazarus
Властивість Font також є в програмі. Для попереднього прикладу додайте на форму ще одну кнопку, як показано на рис. 6.39.
Напишіть для цієї кнопки наступний оброблювач:
procedure TForm1.Button2Click (Sender: TObject);
Мал. 6.39. форма додатка
Після запуску програми і натискання на кнопку "Змінити шрифт" текст в
Memo2 змінить свій розмір і колір.
Виникає питання, а чи не можна надати самому користувачеві право змінювати атрибути шрифту? Для цього існує спеціальний компонент ви-
бору властивостей шрифту TFontDialog. Він розташований на сторінці Dialogs
палітри компонентів. Компонент є не візуальним, так як під час виконання користувач побачить не сам компонент, а стандартний діалог, ви-
![Основи програмування в середовищі lazarus (Візуальне програмування середовищі Lazarus) Основи програмування в середовищі lazarus](https://images-on-off.com/images/148/osnoviprogrammirovaniyavsredelazarus-a7942682.jpg)
Глава 6 Програмування додатків з графічним інтерфейсом
зувати при зверненні до цього компоненту. Тому його можна роз-
жити в будь-якому місці форми. Показ діалогу ініціюється спеціальним мето-
будинок компонента Execute. Це функція, яка повертає true. якщо в ре-
док діалогу користувач насправді вибрав якісь параметри шрифту. Обрані параметри запам'ятовуються у властивостях компонента TFontDialog. Якщо ж користувач нічого не вибрав і натиснув на кнопку Скасування
або клавішу Esc. то функція повертає false.
Таким чином, для виклику діалогу необхідно записати:
if FontDialog1.Execute then
Створіть новий додаток. Перенесіть на форму компонент TMemo,
TFontDialog. дві кнопки і два написи, як показано на рис. 6.40.
Мал. 6.40. Форма додатка з додатковим компонентом TFontDialog
В обробник кнопки "Змінити шрифт" введіть код:
procedure TForm1.Button1Click (Sender: TObject);
if FontDialog1.Execute then