Лабораторна робота №7
.pdfЛабораторна робота №7
Тема: Програмування з використанням компоненту ListBox на основі
властивостей Items і ItemIndex.
Мета: Отримання практичних навиків використання компоненту ListBox
палітри компонентів Standart на основі властивостей Items і ItemIndex.
Теоретичні відомості
Змінна — це область пам'яті, в якій знаходяться дані, якими оперує програма. Коли програма маніпулює з даними, вона, фактично, оперує вмістом елементів пам'яті, тобто змінними.
Щоб програма могла звернутися до змінної (області пам'яті), наприклад,
для того, щоб отримати початкові дані для розрахунку по формулі або зберегти результат, змінна повинна мати ім'я. Ім'я змінній дає програміст.
Як ім'я змінної можна використовувати послідовність з букв латинського алфавіту, цифр і деяких спеціальних символів. Першим символом в імені змінної повинна бути буква. Пропуск в імені змінної використовувати не можна.
Слід звернути увагу на те, що компілятор мови Delphi не розрізняє прописні і рядкові букви в іменах змінних, тому імена SUMMA, Summa і summa
позначають одну і ту ж змінну.
Бажано, щоб ім'я змінної було логічно пов'язане з її призначенням.
У мові Delphi кожна змінна перед використанням повинна бути оголошена. За допомогою оголошення встановлюється не тільки факт існування змінної, але і задається її тип, чим вказується і діапазон допустимих значень.
Змінна оголошується в розділі оголошення змінних var.
У загальному вигляді інструкція оголошення зміної виглядає так:
var
Ім'я : тип;
де:
ім'я — ім'я змінної;
1
тип — тип даних, для зберігання яких призначена змінна.
Приклад:
var
а : Real;
b : Real;
i : Integer;
Уприведених прикладах оголошені дві змінні типу real і одна змінна типу integer.
Утексті програми оголошення кожної змінної, як правило, поміщають на окремому рядку.
Якщо в програмі є декілька змінних, що відносяться до одного типу, то імена цих змінних можна перерахувати в одному рядку через кому, а тип змінних вказати після імені останньої змінної через двокрапку, наприклад:
Var
а,b,с : Integer;
x1,x2 : Real;
Компонент Delphi ListBox - це компонент, що використовується для зберігання і обробки текстової інформації. Значок компоненту ListBox
знаходиться на вкладці Standard (рис. 7.1).
Рисунок 7.1 Компонент ListBox на вкладці Standart
Кожен рядок Delphi ListBox зберігає рядок даних в форматі String.
Вигляд ListBox на етапі конструювання та на формі в робочій програмі (Рис.7.2)
2
Компонент Delphi ListBox |
Компонент Delphi ListBox |
на этапе конструювання |
на формі в робочій програмі |
|
Рисунок 7.2 |
Компонент ListBox – це масив рядків. ListBox може завантажувати дані з диску, і зберігати інформацію в файл. Також ListBox може сортувати рядки.
Доступ до рядків надає властивість Items цього компоненту. У відповідності з цим звернення до рядка з номером i відбувається наступним чином:
ListBox1.Items[i-1]; // Минус один, так як нумерація рядків
|
//в компоненті починається з нуля |
Таблиця 7.1. Властивості компоненту ListBox |
|
|
|
Властивість |
Визначає |
|
|
Name |
Ім'я компоненту. У програмі використовується для доступу до |
|
властивостей компоненту |
Items |
Елементи списку |
ItemIndex |
Номер вибраного елементу списку. Номер першого елементу |
|
списку рівний нулю |
Left |
Відстань від лівої межі списку до лівої межі форми |
Top |
Відстань від верхньої межі списку до верхньої межі форми |
Height |
Висоту поля списку |
Width |
Ширину поля списку |
Font |
Шрифт, що використовується для відображення елементів |
|
списку |
Parent-Font |
Ознака спадкоємства властивостей шрифту батьківської форми |
Найбільший інтерес представляють властивості Items і ItemIndex.
Властивість Items містить елементи списку.
3
Властивість ItemIndex задає номер вибраного елементу списку. Якщо жоден з елементів не вибраний, то значення властивості рівне мінус одиниці.
Список може бути сформований під час створення форми або під час роботи програми.
Для формування списку під час створення форми треба у вікні Object Inspector вибрати властивість Items і клацнути на кнопці запуску редактора списку рядків (рис. 7.3).
Рисунок 7.3. Кнопка запуску редактора списку
У діалоговому вікні String List Editor, що відкриється потрібно ввести список, набираючи кожен елемент списку в окремому рядку. Після введення чергового елементу списку для переходу до нового рядка необхідно натиснути клавішу <Enter>. Після введення останнього елементу клавішу <Enter>
натискати не треба. Завершивши введення списку, слід клацнути на кнопці ОК.
Постановка задачі
Створіть програму, що виконує наступні дії. Після запуску програми з’являється зображення аналогічне тому, що зображено на рисунку 7.1.
4
Рисунок 7.1
Користувач, переміщуючись за допомогою клавіш-стрілок по списку
«Фізична величина» обирає любе значення, натиснув клавішу «Enter». Потім він переходить в список «Назва величини» і обирає відповідну назву фізичної величини.
Якщо обрано правильну назву величини, то під словом «Оцінка» з’являється репліка «Правильно», якщо вибрано неправильне слово, то −
«Помилка». Кількість спроб відповіді відповідає кількості записів у списку
«Фізична величина».
Новим в цій роботі є:
•Забезпечення взаємодії двух списків ListBox (вкладка палітри компонентів Standard) на основі властивостей Items і ItemIndex,
•Створення багаторядкових надписів в компоненті Label.
План розробки програми
1.Відкрийте новий проект.
2.Розмістіть в формі екземпляри компонент у відповідності з рис.7.2 і
привласніть заголовки міткам. Зверніть увагу, що заголовки міток «Фізична величина» і «Назва величини» складаються з двох рядків і отцентровані.
5
|
|
Рисунок 7.2 |
|
|
Для виведення багаторядкових надписів в Label задайте: |
|
|||
|
|
|
|
|
Виділений |
Вкладка |
Ім’я властивості/ Ім’я |
|
Значення/Дія |
об’єкт |
вікна |
події |
|
|
|
Object |
|
|
|
|
Inspector |
|
|
|
Label1 |
Properties |
AutoSize (зміна |
|
False |
|
|
розміру в залежності |
|
|
|
|
від текста в Caption) |
|
|
|
|
WordWrap (розрив |
|
True |
|
|
рядка) |
|
|
|
|
Height Width |
|
Встановити потрібні |
|
|
|
|
розміри |
|
|
Alignment |
|
taCenter |
|
|
(вирівнювання тексту) |
|
|
3.Збережіть код програми і проект під іменами, наприклад, Unit7.pas і Pr7.dpr.
4.Виділіть ListBox1, справа від властивості Items клацніть на кнопці з трьома крапками. В вікні влаштованого редактора String List Editor, що з’явилося введіть фізичні величини, кожну на новому рядку: «Ватт», «Ом», «Вольт», «Ампер».
Збережіть набраний текст під ім’ям Fiz_1.txt. Для цього клацніть правою кнопкою миші і оберіть режим Save. Для вихода з влаштованого редактора клацніть на кнопку «OK» (див. Проект «Довідник»).
6
5.Оберіть ListBox2 і зробіть з ним аналогічну роботу, введіть назви фізичних величин: «Напруга», «Опір», «Сила струму», «Потужність».
Збережіть набраний текст під ім’ям Fiz_2.txt.
6.Вставте в розділі реалізації після ключового слова implementation
об’явлення змінних:
Var Num1, |
// номер вибраного запису в першому вікні |
Num2, |
// номер вибраного запису в другому вікні |
CountR, |
// кількість правильних відповідей |
CountC, // загальна кількість відповідей |
|
CountN |
// загальна кількість питань |
теста |
|
:Byte;
7.Створіть наступні процедури обробки подій:
Виділений |
Ім’я події |
Дія |
об’єкт |
|
|
|
|
|
Form1 |
OnCreate |
CountN:=4; // кількість записів |
|
|
CountC:=0; |
ListBox1 |
OnKeyPress |
If key=#13 then |
|
|
Num1:=ListBox1.ItemIndex; |
|
|
ActiveControl:=ListBox2; |
|
|
Коментар |
|
|
Запам’ятовує в змінній Num1 номер обраного запису в |
|
|
першому вікні. |
|
|
Робить активним об’єкт ListBox2, тобто після |
|
|
закінчення введення фокус перейде в вікно введення |
|
|
ListBox2. |
ListBox2 |
OnKeyPress |
If key=#13 then |
|
|
Begin |
|
|
case ListBox2.ItemIndex of |
|
|
0: Num2:= 2; |
|
|
1: Num2:= 1; |
|
|
2: Num2:= 3; |
|
|
3: Num2:= 0; |
|
|
end; |
|
|
if Num1=Num2 then begin |
|
|
Label4.Caption:='Правильно!'; |
|
|
CountR:=CountR+1 |
|
|
End |
|
|
else Form1.Label4.Caption:='Помилка!'; |
7
CountC:=CountC+1;
if CountC=CountN then ShowMessage('Тест закінчено.
Бали : '+ FloatToStr(CountR/CountN * 5 )+' (правильних
відповідей: '+IntToStr(CountR)+')'); ListBox2.Itemindex:=-1; ActiveControl:=ListBox1;
end;
Коментар
Якщо обраний запис в другому вікні, то його номер порівнюється на відповідність з раніше обраним номером першого вікна (оператор Case). В залежності від результата порівняння видається повідомлення про правильність відповіді, а потім перевіряється чи на всі питання отримано відповідь.
В кінці змінюється властивість ListBox2.ItemIndex для того, щоб вибрати виділення обраного запису в другому вікні і потім робить активним об’єкт ListBox1, тобто після закінчення введення фокус перейде в вікно введення ListBox1.
8.Збережіть проект остаточно, запустіть і протестуйте його.
Завдання для самостійного виконання
1.Списки ListBox1 і ListBox2 зробіть почергово доступними після натиснення
клавіши Enter.
Підказка. Встановіть значення False властивості Enabled компоненту ListBox2,
а в процедуру KeyPressed, що відноситься до ListBox1, додати рядки:
ListBox2.Enabled := True;
ListBoxl.Enabled := False;
2.Внести зміни в програму, щоб при правильному виборі назви фізичної
величини слово в лівому списку зникало.
Підказка. В процедуру KeyPressed, що відноситься до ListBox2, додати:
ListBox1.Items.Delete(Num1);
ListBox1.Items.Insert(Num1, '');
8
Тут видаляється рядок і вставляється на її місце порожній, щоб зберегти відповідність між записами в двох вікнах.
Крім того необхідно в процедуру KeyPressed, що відноситься до ListBox1,
додати:
If (Key=#13) and
(ListBox1.Items.Strings[ListBox1.ItemIndex]<>'') Then...
для того, щоб не розглядався вибір порожнього рядка.
3.Зробіть доступними списки ListBox1 і ListBox2 не тільки після натиснення клавіши Enter, але і по клацанню миші.
4.Збільшіть кількість фізичних величин до 10. Наприклад: довжина (метр), маса
(кілограм), час (секунда), сила світла (кандела), кількість речовини (моль),
частота (герц).
Внесіть необхідні зміни до програми.
5.Введіть додаткову кнопку «Повторити», яка дозволить повторно виконати завдання, відновив списки ListBox1.
Підказка В процедуру обробки натиснення кнопки «Повторити» додати:
CountC:=0;
CountR:=0;
Num1:=0;
Num2:=0;
ListBox2.ItemIndex:=-1;
ListBox1.Items.LoadFromFile('Fiz_1.txt');// повторне
завантаження файлу
ListBox1.SetFocus;
9
Лістинг програми unit Unit7; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs, StdCtrls, Buttons; type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
ListBox1: TListBox;
ListBox2: TListBox;
Label3: TLabel;
Label4: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure ListBox1KeyPress(Sender: TObject; var Key: Char);
procedure ListBox2KeyPress(Sender: TObject; var Key: Char);
procedure BitBtn2Click(Sender: TObject); private
{Private declarations } public
{Public declarations }
end;
var
Form1: TForm1;
implementation
{$R |
*.dfm} |
|
Var |
Num1, |
// номер вибраного запису в першому вікні |
10