Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Використання компоненту Memo

В деяких випадках для введення масиву можна використовувати компонент Memo. Компонент Memo дозволяє вводити текст, що складається з достатньо великої кількості рядків, тому його зручно використовувати для введення символьного масиву. Компонент Memo додається у форму звичайним способом. Значок компоненту знаходиться на вкладці Standard (рис. 4).

Рисунок 4 Компонент Memo

 

У табл. 3 перераховані деякі властивості компоненту Memo.

 

Таблиця 3 Властивості компоненту Memo

Властивість Визначає
Name Ім'я компоненту. Використовується в програмі для доступу до властивостей компоненту
Text Текст, що знаходиться в полі Memo. Розглядається як єдине ціле
Lines Текст, що знаходиться в полі Memo. Розглядається як сукупність рядків. Доступ до рядка здійснюється по номеру
Lines.Count Кількість рядків тексту в полі Memo
Left Відстань від лівої межі поля до лівої межі форми
Top Відстань від верхньої межі поля до верхньої межі форми
Height Висоту поля
Width Ширину поля
Font Шрифт, використовуваний для відображення тексту, що вводиться
ParentFont Ознака спадкоємства властивостей шрифту батьківської форми

 

При використанні компоненту Memo для введення масиву значення кожного елементу масиву слід вводити в окремому рядку і після введення кожного елементу масиву натискати клавішу <Enter>.

Дістати доступ до Memo рядка тексту, що знаходиться в полі, можна за допомогою властивості Lines, вказавши в квадратних дужках номер потрібного рядка (рядки нумеруються з нуля).

 

Приклад Наступна програма, текст якої приведений в лістингу, демонструє використання компоненту Memo для введення символьного масиву.

Основний цикл процедури введення символьного масиву з компоненту Memo може виглядати так:

for i:=l to SIZE do

а [ i ]:= Memol.Lines[i];

де:

- SIZE - іменована константа, що визначає розмір масиву;

- а - масив;

- Memo - ім'я Memo-компоненту;

- Lines - властивість компоненту Memo, що є масивом, кожен елемент якого містить один рядок Memo тексту, що знаходиться в полі.

Форма програми приведена на рис. 5. Крім поля Memo вона містить командну кнопку (Buttonl), при клацанні на якій виконується введення значень елементів масиву з поля Memo.

Рисунок 5 Діалогове вікно застосування Введення масиву

 

Лістинг 5. Введення масиву рядків з компоненту Memo

unit fr_memo_; interface

uses

Windows, Messages, SysUtils, Classes

Graphics, Controls, Forms, Dialogs, Menus, StdCtrls;

type

TForm1 = class(TForm)

Memo1: TMemo;

Button1: TButton;

Label1: TLabel;

procedure ButtonlClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Forml: TForm1;

implementation

($R *.DFM}

procedure TForml.ButtonlClick(Sender: TObject);

const

SIZE=5; // розмір масиву var

a:array[l..SIZE]of string[30]; //массив

n: integer; // кількість рядків, введених в поле Memo

i:integer; // індекс елементу масиву

st:string;

begin

n:=Memo1.Lines.Count;

if n = 0 then begin

ShowMessage('Початкові дані не введені!');

Exit; // вихід з процедури обробки події

end;

// у полі Memo є текст

if n > SIZE then begin

ShowMessage('Кількість рядків перевищує розмір масиву.');

 

n:=SIZE; // вводитимемо тільки перші SIZE рядків

end;

for i:=1 to n do

а[i]:=Form1.Memol.Lines[i-1]; // рядки Memo пронумеровані з нуля

// виведення масиву у вікно повідомлення

if n > 0 then begin

st:='Введенный масив:'+#13;

for i: =1 to n do

st:=st+IntToStr(i)+' '+ а[i]+f13; ShowMessage(st);

end;

end;

end.

Основну роботу виконує процедура TForm1.Button1Click, яка спочатку перевіряє, чи є в полі Memo1 текст. Якщо текст є (в цьому випадку значення властивості Lines.Count більше нуля), то процедура порівнює кількість введених рядків і розмір масиву. Якщо ця кількість перевищує розмір масиву, то програма змінює значення п, тим самим готує введення тільки перших SIZE рядків.

На мал. 6 приведений вид діалогового вікна застосування Введення масиву. Після клацання на командній кнопці Введення з'являється вікно (рис. 7), яке містить значення елементів масиву, одержані з Memo-поля.

Рисунок 6 Вікно застосування Рисунок 7 Масив, введений

Введення масиву з Memo-поля

 

2 Багатовимірні масиви

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

 

Таблиця 4

  Січень Лютий Березень ... Листопад Грудень
ВA3 2106            
ВA3 2107            
ВA3 2108            
ВA3 2109            
ВАЗ 2110            
ВАЗ 2111            

 

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

vaz2106: array [1..12] of integer;

vaz2107: array [1..12] of integer;

vaz2108: array [1..12] of integer;

vaz2109: array [1..12] of integer;

vaz2110: array [1..12] of integer;

vaz2111: array [1..12] of integer;

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

Можливо і таке представлення таблиці:

jan: array [1..6] of integer;

feb: array [1..6] of integer;

mar: array [1..6] of integer;

dec: array [1..6] of integer;

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

Якщо вся таблиця містить однорідну інформацію, наприклад, тільки цілі числа, то така таблиця може бути представлена як двовимірний масив.

У загальному вигляді інструкція оголошення двовимірного масиву виглядає так:

Ім'я: array[ Нижняя Межа1..Верхняя Межа 1; Нижняя Межа 2..Верхняя Межа 2] of Тип

де:

- Ім'я - ім'я масиву;

- array - слово мови Delphi, вказуючи, що оголошуваний елемент даних є масивом;

- НижняяГраница1, ВерхняяГраница1, НижпяяГраница2, ВерхняяГраница2 - цілі константи, що визначають діапазон зміни індексів і, отже, число елементів масиву;

- Тип - тип елементів масиву.

Табл. 7 може бути представлена у вигляді двовимірного масиву таким чином:

itog: array [1..12, 1..6] of integer

Кількість елементів двовимірного масиву можна обчислити за формулою:

(ВМ1-НМ1+1) х (ВМ2-НМ2+1):

де:

- ВМ1 і ВМ2 - верхня межа першого і другого індексів;

- НМ1 і НМ2 - нижня межа першого і другого індексів. Таким чином, масив itog складається з 60 елементів типу integer.

Для того, щоб використовувати елемент масиву, потрібно вказати ім'я масиву і індекси елементу. Перший індекс звичайно відповідає номеру рядка таблиці, другої - номеру колонки. Так, елемент itog [2,3] містить число проданих в березні (третій місяць) автомобілів марки ВАЗ 2107 (дані про продаж ВАЗ 2107 знаходяться в другому рядку таблиці).

При роботі з таблицями (масивами) зручно використовувати інструкцію for. Наприклад, фрагмент програми, що обчислює кількість проданих за рік автомобілів одного найменування, виглядає так:

s:= 0;

for j:= 1 to 12 do

s:= s + itog[2,j];

Наступний фрагмент програми обчислює суму елементів масиву (загальна кількість автомобілів, проданих за рік).

s:=0;

for i:= 1 to 6 do // шість моделей автомобілів

for j:= 1 to 12 do //12 місяців s:= s + itog[i,j];

У приведеному фрагменті програми кожного разу, коли внутрішній цикл (цикл по j) завершується, в зовнішньому циклі значення i збільшується на одиницю і внутрішній цикл виконується знов. Таким чином, до поточного значення змінної s послідовно додаються значення елементів масиву itog: itog[l,l], itog[l,2],..., itog[l,12], itog[2,l], itog[2,2],..., itog[2,12] і т.д.

Приклад. Як приклад розглянемо програму, яка обробляє результати спортивних змагань літньої олімпіади в Сіднеї, 2000 р. Початкові дані представлені табл. 5.

 

Таблиця 5 Результати олімпіади 2000 р. в Сіднеї

Країна Золотих Срібних Бронзових
Австралія      
Білорусь      
Великобританія      
Німеччина      
Італія      
Китай      
Корея      
Куба      
Нідерланди      
Росія      
Румунія      
США      
Франція      
Японія      

 

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

Вид діалогового вікна програми приведений на рис. 8.

Рисунок 8 Діалогове вікно програми Підсумки олімпіади

 

Для введення початкових даних і відображення результату використовується компонент StringGrid, властивості якого приведені табл. 6.

 

Таблиця 6 Значення властивості компоненту StringGrid1

Властивість Значення
Name Tab1
ColCount  
RowCount  
FixedCols  
FixedRows  
Options. goEditing TRUE
DefaultColWidth  
DefaultRowHeight  
GridLineWidth  

Осередки першого зафіксованого рядка таблиці використовуються як заголовки колонок таблиці. Під час створення форми застосування не можна встановити значення елементів масиву cells, оскільки елементи масиву доступні тільки під час роботи програми. Тому значення елементів масиву Сells, відповідних першому рядку таблиці, встановлює процедура обробки події OnActivate (її текст приведений в лістингу 6), яка відбувається під час активізації форми застосування. Крім того, ця процедура вписує в першу колонку таблиці назви країн-учасниць змагань.

Лістинг 6. Ініціалізація таблиці

procedure TForml.FormActivate(Sender: TObject); begin

tabl.Cells[0,0]:='Страна';

tabl.Cells[1,0]:='Золотых';

tabl.Cells[2,0]:='Серебряных';

tabl.Cells[3,0]:='Бронзовых';

tabl.Cells[4,0]:='Bcero';

tabl.Cells[5,0]:='Баллов';

tabl.Cells[0,1]:='Австралия';

tabl.Cells[0,2]:='Белоруссия';

tabl.Cells[0,3]: ='Великобритания';

tabl.Cells[0,4]:='Германия';

tabl.Cells[0,5]:='Италия';

tabl.Cells[0,6]:='Китай';

tabl.Cells[0,7]:='Корея';

tabl.Cells[0,8]:='Куба';

tabl.Cells[0,9]:='Нидерланды';

tabl.Cells[0,10]:= 'Росія';

tabl.Cells[0,ll]:='США';

tabl,Cells[0,12]:='Франция';

tabl.Cells[0,13]:='Япония'; end;

 

Програма обробки початкової таблиці (лістинг) запускається клацанням миші на командній кнопці Підсумки (Buttoni).

Лістинг 7. Обробка двовимірного масиву

procedure TForml.ButtonlClick(Sender: TObject);

var

с,r:integer; // номер колонки і рядка таблиці

s:integer; // всього медалей у команди

р:integer; // окулярів у команди

m:integer; // номер рядка з максимальною кількістю очок

buf:array[0..5] of string; // буфер для обміну рядків

i:integer; // номер рядка. Використовується під час сортування

begin

for r:=l to tab1.rowcount do // обробити всі рядки

begin s:=0;

// обчислюємо загальну к-ть медалей

for c:=l to 3 do

if tabl.cells[с,r] <>''

then s:=s+StrToInt(tab1.cells[с,r])

else tabl.cells[с,r]:='0'; // обчислюємо кількість очок

p:=7*StrToInt(tab1.cells[l,r])+

6*StrToInt(tabl.cells[2, r])

+ 5*StrToInt(tabl.cells[3,r]};

// виведення результату

tabl.cells[4,r]:=IntToStr(s); // всього медалей

tabl.cells[5,r]:=IntToStr(p); // окулярів

end;

// сортування таблиці по убуванню у відповідності

// з кількістю балів (по вмісту 5-го стовпця)

// сортування методом вибору

for r:=l to tab1.rowcount-1 do

begin

m:=r; // максимальний елемент — в r-й рядку

for i:=r to tabl.rowcount-1 do

if StrToInt(tabl.cells[5,i])>StrToInt(tabl.cells[5,m])

then m:=i;

if r <> m then

begin // обміняємо г-ю і m-ю рядки таблиці

for c:=0 to 5 do begin

buf[с]:=tab1.Cells[с,r];

tab1.Cells[с,r]:=tabl.Cells[с,m];

tab1.Cells[с,m]:=buf[c];

end;

end;

end;

end;

 

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

 

На рис. 9 приведене діалогове вікно програми після завершення процесу обробки масиву.

Рисунок 9 Вікно програми Підсумки олімпіади

 

3 Помилки при використанні масивів

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

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

day: array[0..6] of string[ll]

то під час компіляції програми інструкція

day [7]:= 'Неділя';

буде помічена як помилкова.

Якщо для доступу до елементу масиву як індекс використовується змінна або вираз, то можливо виникнення помилки (виключення) часу виконання програми. Наприклад, якщо в програмі оголошений масив

tab1: array [1..N] of integer;

то інструкція

for i:=0 to N do tab1[i]:= 5;

формально є вірною, і її компіляція буде успішно виконана.

Проте під час виконання програми, при спробі привласнити значення неіснуючому нульовому елементу масиву tab, на екран буде виведене повідомлення про помилку. Вид вікна і текст повідомлення залежить від того, звідки запущена програма.

При запуску даної програми з Delphi виникає виключення, і повідомлення має вигляд, приведений на мал. 10.

Рисунок 10 Повідомлення про помилку при зверненні до неіснуючого елементу масиву (програма запущена з Delphi)

 

Якщо програма запущена з Windows, то при спробі привласнити значення неіснуючому елементу масиву на екран буде виведене повідомлення Range check error (помилка контролю діапазону). У заголовку вікна буде вказане ім'я застосування, в процесі виконання якого відбулася помилка (мал. 11).

Рисунок 11 Повідомлення про помилку при зверненні до неіснуючого елементу масиву (програма запущена з Windows)

 

Поведінка програми при виході індексного виразу за межі діапазону допустимих значень визначається настройкою компілятора.

Для того, щоб програма контролювала значення індексних виразів (в цьому випадку Delphi додає у виконувану програму інструкції, що забезпечують цей контроль), необхідно на вкладці Compiler діалогового вікна Project Options, яке відкривається вибором з меню Project команди Options, встановити прапорець Range checking (Контроль діапазону), що знаходиться в групі Runtime errors (Помилки часу виконання) (мал. 12).

Поведінка програми при виході індексного виразу за межі діапазону допустимих значень визначається настройкою компілятора.

Для того, щоб програма контролювала значення індексних виразів (в цьому випадку Delphi додає у виконувану програму інструкції, що забезпечують цей контроль), необхідно на вкладці Compiler діалогового вікна Project Options, яке відкривається вибором з меню Project команди Options, встановити прапорець Range checking (Контроль діапазону), що знаходиться в групі Runtime errors (Помилки часу виконання) (рис. 12).

Рисунок 12 Вкладка Compiler діалогового вікна Project Options

 

Контрольні питання

 

 

1. Які типи даних відносяться до складних?

2. Які змінні називаються структурованими?

3. Як класифікуються типи даних, що використовуються в Object Pascal?

4. Що таке масив? Наведіть приклади.

5. Наведіть приклади структури масиву.

6. Що таке індексна змінна масиву?

7. Як визначити n- вимірність масиву?

8. Наведіть графічну структуру дво - та тривимірного масиву.

9. Як розміщуються елементи матриці у пам'яті ЕОМ?

  1. Як та в яких розділах описується масив?
  2. Чому введення типу масиву спрощує налагодження програми?
  3. Що значить «ввести масив у комп'ютер»?
  4. Як ввести одновимірний масив з використанням компонен­та форми Edit?
  5. Утворіть діалогове вікно «Ввід одновимірного масиву».
  6. Що означає цей фрагмент?
    for i:=l to n do

а[і]:=Memol.Lines[і-1]

  1. Як Ви розумієте цей запис? n:=Memol.Lines.Count;
  2. В якому розділі програм та як саме слід оголошувати масив?

18. Які масиви називаються багатовимірними?

19. Для чого використовується зарезервоване слово packed Object Pascal-програми?

20. Що таке динамічні масиви Delphi 6?

21. Як оголошують динамічні масиви?

22. Що таке рядкова таблиця StringGrid?

23. На якій сторінці знаходиться компонент StringGrid?

24. Які властивості має компонент StringGrid?

25. Що означає властивість Name компонента StringGrid?

26. Поясніть, для чого існують властивості RowCount та ColCount компонента StringGrid.

  1. Як утворити процедуру FormCreate?
  2. Поясніть запис: tabl.Cells[2,l 1].
  3. Яким чином можна ввести елементи матриці в ЕОМ?
  4. Для чого слід складати таблицю значень властивостей компонентів форми?
  5. Які помилки найбільш поширені при використанні масивів?
  6. Як Delphi 6 реагує на помилку?
  7. Для чого використовується вкладка Compiler діалогового вікна Project Option?
  8. Як додати ім'я модуля програміста до списку модулів, що використовуються у Delphi?
  9. Як слід компілювати програму після додавання модуля до проекту?

 

 

Література

1. Архангельский А. Я. Разработка прикладных программ для Windows в Delphi 5 / А.Я. Архангельский. - М.: БИНОМ, 1999. - 256 с.

2. Бобровский С. И. Delphi 7: учеб. курс / С.И. Бобровский. - СПб.: Питер, 2004. - 736 с.

3. Фаронов В. Программирование баз данных в Delphi 6: Учебный курс / В. Фаронов. - СПб.: Питер, 2002. - 352 с:ил

4. Фаронов В. В. Delphi: программирование на языке высокого уровня: учебник для студ., обуч. по напр. подготовки дипломир. спец. "Информатика и вычис. техника" / В. В. Фаронов. - СПб.: Питер, 2005. - 640 с.

5. Фаронов В.В. Delphi 6. Учебный курс. –М. Нолидж, 2004. – 425 с.

 

 

<== предыдущая лекция | следующая лекция ==>
Використання компоненту StringGrid | 
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 10853; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.016 сек.