МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ПРАКТИЧЕСКИМ РАБОТАМ по дисциплине «Программирование баз данных»
Инфоурок Информатика Другие методич. материалыМЕТОДИЧЕСКИЕ УКАЗАНИЯ К ПРАКТИЧЕСКИМ РАБОТАМ по дисциплине «Программирование баз данных»

МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ПРАКТИЧЕСКИМ РАБОТАМ по дисциплине «Программирование баз данных»

Скачать материал

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РЕСПУБЛИКИ КАЗАХСТАН

 

 

Высший Колледж Инновационного Евразийского университета

 

 

 

 

 

 

 

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

 

К ПРАКТИЧЕСКИМ РАБОТАМ

 

 

 

 

по дисциплине «Программирование баз данных»

 

 

для студентов образовательной программы

 

1305000 «Информационные системы»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПАВЛОДАР 2020

 

 

 

 

 

 

1


Автор: преп.: Шоклева Л.А.                _______________

 

 

 

 

 

 

 

 

 

МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ПРАКТИЧЕСКИМ РАБОТАМ по дисциплине «Программирование баз данных» для студентов образовательной программы 1305000 «Информационные системы»

для очной формы обучения на базе общего среднего образования

 

 

 

 

 

 

 

 

 

 

 

 

 

Одобрено предметной (цикловой) комиссией информационных технологий

 

“       ”                              20 __ж.г.

 

Хаттама №                 Комиссия торағасы  

 

Протокол №   _______________      Председатель комиссии       В.Д. Простоквашина

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2


Содержание

 

Введение……………………………………………………………………………………….4

Практическая работа 1………………………………………………………………………..5

Практическая работа 2……………………………………………………………………….9

Практическая работа 3.………………………………………………………………………13

Практическая работа 4……………………………………………………………………….18

Практическая работа 5… ……………………………………………………………………24

Практическая работа 6..………………………………………………………………………27

Практическая работа 7..………………………………………………………………………34

Практическая работа 8..………………………………………………………………………39

Практическая работа 9………………………………………………………………………..46

Практическая работа 10…………………………………………………………………….   54

Практическая работа 11.……………………………………………………………………   59

Практическая работа 12…………………………………………………………………….   61

Практическая работа 13… …………………………………………………………………   64

Приложение А……………………………………………………………  ………………….69

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3


Введение

 

После разработки проекта базы данных можно приступать к его реализации в конкретной системе баз данных (СБД). Современная волна информационных технологий управления данными основывается на использовании систем управления реляционными базами данных.

Спроектировать и создать базу данных еще недостаточно для успешной работы с данными: у нас должна быть возможность как-то обращаться к этим данным, дополнять и изменять их. В этом и состоит цель клиентского приложения - специальной программы, позволяющей работать с данными в удобной для пользователя форме. В общем случае с одной базой данных могут работать множество различных приложений. При рассмотрении приложений, работающих с одной базой данных, предполагается, что они могут работать параллельно и независимо друг от друга, и именно СБД призвана обеспечить работу множества приложений с единой базой данных таким образом, чтобы каждое из них выполнялось корректно, но учитывало все изменения в базе данных, вносимые другими приложениями.

Среда программирования Delphi позволяет сравнительно легко и быстро создавать законченные приложения Windows. Поэтому она получила название RAD (Rapid Application Development – среда быстрой разработки приложение).

Среда программирования Delphi имеет встроенный компилятор, переводящий текст программы в машинный код, понятный процессору компьютера. В настоящее время этот компилятор является самым быстрым и позволяет обеспечивать высокую производительность среды программирования, необходимую для создания приложений Windows. Компилятор среды программирования Delphi создает автономные exe-файлы (исполняемые файлы). Поэтому приложения, созданные в Dephi, будут работать на компьютере, на котором не установлена среда Delphi.

Предлагаемые методические указания к выполнению лабораторных работ разработаны для освоения студентами основ разработки баз данных в среде Delphi. Описание каждой практической работы содержит необходимую для его выполнения информацию из сопутствующего курса, пример решения аналогичной задачи. После выполнения всех практических работ студент должен представить отчет и защитить работу.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 


Практическая работа1

ИСПОЛЬЗОВАНИЕ ВИЗУАЛЬНЫХ КОМПОНЕНТОВ ДЛЯ ПРОГРАММИРОВАНИЯ МАССИВОВ

 

Цель работы: приобретение практических навыков проектирования и программирования массивов.

Используемые программные средства: Borland Delphi.

 

1. Теоретические сведения. Работа с компонентами

 

Массивом называется упорядоченная индексированная совокупность однотипных элементов, имеющих общее имя. Элементами массива могут быть данные различных типов. Каждый элемент массива одновременно определяется именем массива и индексом (номер этого элемента в массиве) или индексами, если массив многомерный. Количество индексных позиций определяет размерность массива (одномерный,

двумерный и т.д.).

Работу с массивами данных удобно организовывать в виде таблиц. Для этой цели предназначены компоненты StringGrid типа TStringGrid и DrawGrid типа     TDrawGrid, отображающие информацию в виде двумерных таблиц. Компоненты расположены на панели Additional Палитры компонентов и имеют

 

Пиктограммы                       (StringGrid) и             (DrawGrid).

 

Компонент DrawGrid     позволяет отображать любую (текстовую и графическую) информацию, однако вся работа по визуальному отображению объектов возлагается на разработчиков программы. Компонент StringGrid применяется для работы с текстовой информацией, причем ее отображение и хранение производится компонентом автоматически. В дальнейшем будем рассматривать компонент StringGrid.

Основным элементом таблицы является ячейка, для доступа к которой используется свойство

Cells[ACol,ARow:Integer]:string, где ACol и ARow – индексы элемента двумерного массива. Индекс ACol определяет номер столбца, а индекс ARow – номер                строки. Свойство Cells доступно только во время выполнения программы. Нумерация элементов таблицы начинается с нуля.

Некоторые свойства компонента StringGrid приведены в табл. 5.1.

Таблица 5.1

 

Свойства компонента StringGrid

ColCount

число столбцов в таблице

RowCount

число строк в таблице

FixedCols

число фиксированных столбцов

FixedRows

число фиксированных строк

ColWidths

ширина столбца в пикселах

RowHeights

высота строки в пикселах

DefaultColWidth

значение ширины столбца по умолчанию

DefaultRowHeight

значение высоты строк по умолчанию

BorderStyle

определяет наличие или отсутствие внешней рамки таблицы

ScrollBars

параметры отображения полосы прокрутки :

ssNone

полоса прокрутки не допускается

ssHorizontal

допускается горизонтальная полоса прокрутки


ssVertical

допускается вертикальная полоса прокрутки

ssBoth

допускаются обе полосы прокрутки

Options

опции для доступа к параметрам таблицы для их настройки :

goVertLine

отображение в сетке вертикальных разделительных линий

goEditing

Возможность редактирования содержания ячейки с клавиатуры

goHorzLine

отображение в сетке горизонтальных разделительных линий

 

В качестве фиксированных элементов используются крайние левые столбцы и верхние строки, что используется при оформлении заголовков. В них запрещен ввод значений с клавиатуры.

Для визуального выделения функционально связанных компонентов или в качестве средств визуального группирования используются компоненты GroupBox или Panel. Компонент GroupBox представляет собой прямоугольную рамку с заголовком (свойство Caption) в левом верхнем углу и служит только для объединения содержащихся в нем элементов. Компонент Panelпредназначен для объединения произвольных элементов управления с возможностями их перемещения по форме и стыковкой с другими панелями.

Кроме того, компонент Panel может использоваться для создания рамок разнообразного вида (свойства BevelInner, BevelOuter , BevelWidth компонента).

 

2. Порядок выполнения работы

 

Изучить компонент StringGrid и его свойства, выполнить контрольный пример и задания соответствующего варианта.

Контрольный пример 1

 

Сформировать матрицу A размерности n*n, для которой

 

 

 

 

 

 

 

 

 

 

 

Решение.

1. Открыть новый проект Delphi: File New Application .

 

2. Установить с помощью Object Inspector следующие свойства

 

компонента Form1:

 

Form1.Height = 480 Form1.Width = 487 Form1.BorderIcons biMaximize = false Form1.BorderStyle = sSingle

3. На форме расположить следующие компоненты: один компонент Edit, два компонента Label, один компонент StringGrid, два


компонента Buttonи один компонент BitBtn установить с помощью Object Inspector для них следующие свойства:

Label1.Caption = 'Размерность матрицы А' Label2.Caption = 'Матрица А' Edit1.Width = 120

Button1.Caption = 'Изменить размерность матрицы А'

StringGrid1.Left = 50 StringGrid1.Top = 150

7StringGrid1.Height = 153 StringGrid1.Width = 313 StringGrid1.ScrollBars = ssBoth Button2.Caption = 'Получение матрицы А' BitBtn1.Kind = 'bkClose'

BitBtn1. Caption = '&Закрыть'. Результат показан на рис. 5.1.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 5.1. Вид формы для контрольного примера 5.1

 

4. Запишем обработчик события Button1.Click (кнопка изменить размерность матрицы А), в процессе выполнения которого устанавливается размерность матрицы, число столбцов и число строк в компоненте StringGrid1.

В разделе описания глобальных переменных должны быть описаны следующие типы и переменные:

type

mas=array[1..10,1..10] of real; var

Form1: TForm1; N: integer; A:mas;

Текст процедуры TForm1.Button1Click имеет вид: procedure TForm1.Button1Click(Sender: TObject); var

i:integer;


begin

N:=StrToInt(Edit1.Text);// размерность матрицы А {Задание числа строк и столбцов в таблице}

StringGrid1.ColCount:=N+1; StringGrid1.RowCount:=N+1;

{Ввод     в       левую       верхнюю       ячейку       таблицы       названия       массива} StringGrid1.Cells[0,0]:='Массив A:';

{Заполнение    левого      и      верхнего      столбцов      поясняющими записями} for i:=1 to N do begin

StringGrid1.Cells[0,i]:=' i= '+IntToStr(i); StringGrid1.Cells[i,0]:=' j= '+IntToStr(i);

end; end;

5. Для формирования матрицы А нужно записать процедуру, являющуюся обработчиком события Button2.Click(кнопка Получение матрицы А). Текст процедуры приведен ниже:

procedure TForm1.Button2Click(Sender: TObject); var i,j:integer;

begin

for i:=1 to n do for j:= 1 to n do begin if i<j then A[i,j]:=sqr(j)*i;

if i=j then A[i,j]:=2;

if i>j then A[i,j]:=i*sqr(i)/j; end;

{Вывод результата в таблицу StringGrid1} for i:=1 to N do

for j:=1 to N do StringGrid1.Cells[j,i]:=FloatToStrf(A[i,j],fffixed,6,2); end;

 

6. Запустить проект на выполнение. Результат выполнения программы показан на рис. 5.2.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 5.2. Результат выполнения программы для контрольного примера 5.1


Практическая работа №2 Двумерный массив.

Типизированный файл, записи, перечисляемый тип

 

1. Двумерный массив

Двумерные массивы удобно вводить через компонент StringGrid, который находится на вкладке Additional (Дополнительная). Основные свойства этого компонента перечислены в лабораторной работе №5. В отличии от работы с одномерными массивами надо указывать количество строк и столбцов (RowCount, ColCount). Обращение к ячейке осуществляется следующим образом: StringGrid1.Cells[столбецтрока].

 

Внимание: На первом месте всегда номер столбца.

Выводить элементы массива можно в компонент StringGrid или на форму через метку Label. Рассмотрим ввод и вывод элементов массива на конкретных задачах.

Задача №1. Найти в целочисленном массиве минимальный и максимальный элементы и поменять их местами.

Ввод элементов массива осуществляется через StringGrid, а вывод результатов на форму через Label (см. рис.1). На форме помещены три кнопки: Вычислить, Сброс, Выход.

StringGrid1                                                                                                              Label1

 

 

 

 

 

 

Label2                                                                                                                   Label3

 

Label5                                                                                                                   Label6

 

 

Label7                                                                                                                   Label8

 

 

 

Button1             Button2       Button3

Рис. 1.

 

При нажатии кнопки Вычислить активизируется следующая процедура:

 

procedure TForm1.Button1Click(Sender: TObject); var a:array[1..5,1..5] of integer; max,min,i,j,maxi,maxj,mini,minj:integer;

begin

for j:=1 to 5 do begin

for i:=1 to 5 do begin

a[i,j]:=strtoint(StringGrid1.Cells[i-1,j-1]); label5.Caption:=Label5.Caption+inttostr(a[i,j])+' '; end;

label5.Caption:=Label5.Caption+#13;

end;

max:=a[1,1];

maxi:=1;

 maxj:=1;

min:=max;

 mini:=1;

 minj:=1;

for j:=1 to 5 do

for i:=1 to 5 do

begin if a[i,j]>max then begin max:=a[i,j];

 maxi:=i;

maxj:=j end;

if a[i,j]<min then begin min:=a[i,j];

mini:=i;

minj:=j; end;

end;

a[maxi,maxj]:=min;

Label7.Caption:='max='+inttostr(max);

a[mini,minj]:=max;

Label8.Caption:='min='+inttostr(min);

for j:=1 to 5 do

begin

for i:=1 to 5 do

label6.Caption:=Label6.Caption+inttostr(a[i,j])+' ';

label6.Caption:=Label6.Caption+#13;

end;

end;

 

Текст процедуры обработки события KeyPress приведен ниже. Процедура осуществляет контроль вводимых данных, разрешая вводить в ячейку таблицы только цифры. Перемещение курсора в нужную ячейку таблицы осуществляется по нажатию клавиши Enter. Свойства Col и Row содержат соответственно номера колонки и строки таблицы, в которой находится курсор. Надо учитывать, что колонки и строки нумеруются с нуля.

 

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);

begin

case key of #8,'0'..'9':;

#13: begin if stringGrid1.Col< stringGrid1.ColCount-1

then stringGrid1.Col:=stringGrid1.Col+1      {переход на следующую колонку} else begin

if stringGrid1.Row< stringGrid1.RowCount-1 then

begin stringGrid1.col:=0;

stringGrid1.Row:=stringGrid1.Row+1    {переход на следующую строку} end;

end;

end;

else key:=Chr(0);

end;

end;

 

При нажатии кнопки Сброс происходит очистка полей ввода-вывода: procedure TForm1.Button2Click(Sender: TObject);

var i,j:integer;

begin

for j:=1 to 5 do

for i:=1 to 5 do

StringGrid1.Cells[i-1,j-1]:=''; label5.Caption:='';


label6.Caption:=''; label7.Caption:=''; label8.Caption:='';

stringGrid1.col:=0;                      становка курсора в позицию 0,0 таблицы} stringGrid1.row:=0;

end;

 

При нажатии кнопки Выход происходит закрытие приложения. См. предыдущие работы. Задача №2: В целочисленной квадратной матрице (массиве) найти максимальный элемент

среди элементов, лежащих на главной диагонали и ниже ее.

 

В этой задаче элементы массива вводятся через генератор случайных чисел, а вывод осуществляется в компонент StringGrid. Вид формы см. на рис.2.

 

StringGrid1                                                                                                                 Label1

 

 

 

 

 

 

 

 

Label 2                                                                                                        Label3

 

 

 

 

 


Button1           Button2           Button3

Рисунок 2

 

При нажатии кнопки Вычислить активизирующая процедура:

 

procedure TForm1.Button1Click(Sender: TObject); var a:array[1..5,1..5] of integer; max,min,i,j,maxi,maxj,mini,minj:integer;

begin

randomize;                         {активизация генератора случайных чисел}

 for j:=1 to 5 do

for i:=1 to 5 do begin

a[i,j]:=random(50);      {заполнение массива}

StringGrid1.Cells[i-1,j-1]:=inttostr(a[i,j]); {вывод элементов массива в таблицу StringGrid} end;

max:=a[1,1]; maxi:=1; maxj:=1; for j:=1 to 5 do

for i:=1 to j do

begin if a[i,j]>max then begin max:=a[i,j]; maxi:=i;

maxj:=j end;

end;

Label2.Caption:='max='+inttostr(max); {вывод найденного значения}

Label3.Caption:='i='+inttostr(maxj)+' j='+inttostr(maxi); end;

 

При нажатии клавиши Сброс происходит очистка полей вывода:

 

procedure TForm1.Button2Click(Sender: TObject); var i,j:integer;

begin

for j:=1 to 5 do

for i:=1 to 5 do

StringGrid1.Cells[i-1,j-1]:=''; label2.Caption:=''; label3.Caption:=''; stringGrid1.col:=0; stringGrid1.row:=0;

end;

 

Реакция на нажатие клавиши Выход аналогична рассмотренной ранее.

В заключении можно сказать, что обработка двумерных массивов Delphi осуществляется так же как и в языке Pascal. Отличие заключается только в формах ввода-вывода элементов массива. Надо помнить, что в Delphi:

-    на первом месте стоит номер колонки, а на втором номер строки

-    колонки и строки нумеруются с нуля.

 

 

2. Перечисляемые типы

Перечисляемые типы в Delphi позволяют создавать упорядоченный перечень элементов. Каждый элемент именуется некоторым идентификатором (имя идентификатора должно быть без пробелов и состоять из букв латинского алфавита) и находиться в списке, по краям обрамленном круглыми скобками. Элементы отделяются друг от друга запятой. Перечисляемые типы в программе делают код нагляднее и понятнее. Также они повышают надежность программ из-за возможности контроля значений, получаемых переменными.

Пример:

type

TypeMonth = (jan,feb,mar,apr); Color = (red, green, blue, white);

Объявив перечисляемый тип, мы можем задавать переменные данного типа.

var

col : Color;

Month : TypeMonth;

Для того чтобы присвоить значения переменным напишем операторы:

col := red; Month := feb;

Переменные перечисляемого типа можно создавать сразу, без предварительного описания типа типа переменной.

var

Countri : (Russia, France, USA, Poland, Germany, Italy);

Значения перечисляемого типа и порядковые номера этих значений имеют соответствие согласно порядку перечисления. Первое значение имеет порядковый номер 0, второе 1, и т.д. Максимальное возможный порядковый номер равен 65536.

Функция Ord(X) возвращает порядковый номер значения выражения X. C порядковыми типами применяют еще 2 функции Pred(X) и Succ(X). Pred(X) - возвращает предыдущее значение.

Succ (X) - возвращает следующее значение.

Расположим на форме кнопку и напишем следующий код:

procedure TForm1.Button1Click(Sender: TObject);

var

Nalog : Currency;

Countri : (Russia, France, USA, Poland, Germany, Italy); begin

Countri := USA; case Countri of

Russia : Nalog := 99; France : Nalog := 36; USA    : Nalog := 75; Poland : Nalog := 76; Germany : Nalog := 92; Italy : Nalog := 45;

end;

 

Nalog : Currency;

 

Countri : (Russia, France, USA, Poland, Germany, Italy);

 

begin

Countri := USA; case Countri of

 

Russia : Nalog := 99; France : Nalog := 36; USA    : Nalog := 75;

Poland : Nalog := 76; Germany : Nalog := 92; Italy : Nalog := 45;

end;

ShowMessage(FloatToStr(Nalog)+ ' $');

ShowMessage(IntToStr(Ord(Countri)));

end;


Нажмем на кнопку и получим два сообщения. Первое 75 $ (пусть это будет цена визы в данную страну), второе - 2 (USA по порядку идет третьей, но счет элементов начинается с 0).

Итог: мы познакомились с двумерными массивами и порядковыми типами в Delphi

 

Практическая работа № 3

Программирование алгоритмов выбора в среде разработки Borland Delphi

 

Цель работы: Научиться программировать процессы, которые позволяют сделать выбор того или иного действия.

Задачи лабораторной работы: После выполнения работы студент должен:

1.  Знать, как отличить алгоритм выбора от других алгоритмов и как его можно реализовать в среде Delphi.

2.  Уметь самостоятельно написать программу для любого процесса выбора.

Перечень обеспечивающих средств

Для обеспечения выполнения работы необходимо иметь компьютер со следующим математическим обеспечением: операционная система Windows 2003 и выше и система визуального программирования Delphi на основе 6-ой версии.

Общие теоретические сведения

Интегрированная среда разработки Delphi представляет собой многооконную систему (рис. 1).

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 1. Пользовательский интерфейс интегрированной среды разработки Delphi

 

После загрузки интерфейс Delphi включает следующие окна:

1.  Главное окно Project1, осуществляет основные функции управления проектом создаваемой программы.

2.  Окно Инспектора объектов Object Inspector содержит две страницы Properties (Свойства) и Events (События).

3.  Окно Конструктора формы Form1 представляет проект интерфейсной части будущего проекта.

4.  Окно Редактора кода – Unit1.pas предназначено для создания и редактирования текста программы на языке Object Pascal.

Пункт меню View позволяет увидеть окна на экране при их отсутствии. В зависимости от настроек можно видеть окна:

-    окно обозревателя дерева объектов Object Tree View;

-    окно Проводника кода – Exploring Unit1.pas.

Delphi – однодокументная среда и может работать только с одним приложением. Закрытие Delphi закрытие главного окна.

Project1 включает:

Ø главное меню, которое содержит команды доступа к функциям Delphi;

Ø панели инструментов (часто используемые команды главного меню);

Ø палитру компонентов (содержит строительные блоки для форм приложения).

Имеется 6 панелей инструментов:

1.  Standard (стандартная).

2.  View (просмотра). 3.        Debug (отладки).

4.  Custom (пользователя).

5.  Desktop (рабочий стол).

6.  Internet (интернет).

Все компоненты разбиты на группы, каждая из которых в Палитре компонентов располагается на отдельной странице. Нужная страница выбирается щелчком мыши на ее ярлычке.

Основные страницы Палитры компонентов:

1.         Standard (стандартная)

2.    Additional (дополнительная)

3.    Win32 (32-разрядный интерфейс Windows)

4.    System (доступ к системным функциям)

5.    Data Access (работа с информацией из базы данных)

6.    Data Controls (создание элементов управления данными)

7.    BDE (доступ к данным с помощью процессора баз)

8.    Qreport (составление отчетов)

9.    Dialogs (создание стандартных диалоговых окон)

Окно конструктора формы находится в центре экрана с заголовком Form1.

В нем выполняется проектирование формы. На форму из палитры компонентов помещаются компоненты. Окно редактора кода Unit1.pas находится под окном конструктора формы – это обычный текстовый редактор, используется для редактирования текста модуля и в начале содержит исходный код модуля. Окно проводника кода (Exploring Unit1.pas) содержит и отображает все объекты модуля формы.

Окно инспектора объектов (Object Inspector) находится в левой части экрана и отображает свойства и события объектов для текущей формы Form1. Страница Properties (Свойства) отображает информацию о текущем компоненте и позволяет изменять свойства компонентов.

Events (События) определяет процедуру, которую должен выполнить компонент при возникновении события. Компонент, расположенный на форме, можно выбрать щелчком мыши на нем или выбором в списке Инспектора объектов (Object Inspector).Каждый объект имеет свой набор свойств и событий, определяющий его особенности.

Разработка приложения Разработка приложения включает:

1.  Создание интерфейса приложения.

2.  Определение функциональности приложения.

Интерфейс приложения определяет способ взаимодействия пользователя и приложения т.е. внешний вид формы. Интерфейс создается путем размещения в форме компонентов, которые называются интерфейсными или управляющими компонентами и выполняется с помощью конструктора формы.

Функциональность приложения определяется процедурами, которые выполняются при возникновении определенных событий, например, при действиях пользователя с управляющими элементами формы. В процессе создания приложения на форму помещаются компоненты, для которых создаются обработчики событий.

Создание интерфейса приложения

Интерфейс приложения составляют компоненты, которые разработчик выбирает из Палитры компонентов и размещает на форме. При этом выполняются следующие операции:

-   выбор компонента в Палитре компонентов и размещение на форме;

-   изменение свойств компонента.

Выбор компонента выполняется щелчком мыши на нужном компоненте, в результате пиктограмма принимает утопленный вид и, если щелкнуть на свободном месте формы на ней, появится выбранный компонент и его пиктограмма принимает обычный вид. Пиктограммы компонентов отражают назначение компонентов. В обозначении типа объектов Delphi, в том числе и компонент указывается буква T. Это означает, что объект принадлежит классу T, например, TForm1, T - это имя класса, созданного по образцу стандартного класса TForm.

Определение функциональности приложения.

Для компонентов, размещенных на форме, разработчик может определить нужную реакцию на те или иные действия пользователя, например, что должно произойти, если нажать кнопку на форме. На форме, как правило, размещены компоненты, образующие интерфейс приложения, и разработчик должен для этих компонентов определить нужную реакцию на те или иные действия пользователя. Например, на нажатие кнопки или включение переключателя. Эта реакция и определяет функциональность приложения. Так, если при создании интерфейса на форме размещена кнопка Button1, то ее можно нажимать с помощью мыши; она отображает нажатие на себя визуально, но никаких действий она не выполняет до тех пор, пока не будет создана процедура обработки этого события. Для создания этой процедуры нужно выделить кнопку на форме и перейти на страницу событий инспектора объектов (Events), где указаны все возможные события для кнопки. При нажатии на кнопку возникает событие OnClick и необходимо создать обработку этого события. Двойной щелчок на кнопке и Delphi автоматически создает в модуле формы заготовку процедуры-обработчика, при этом окно редактора кода переводится на передний план, а курсор устанавливается в место, куда должны быть внесены изменения.

Компиляция выполняется с помощью меню или клавишами Ctrl + F9. В результате компиляции создается готовый к выполнению файл с расширением *.exe. Языком программирования Delphi является язык Object Pascal, который представляет собой объектно-ориентированное расширение стандартного языка Pascal. В версии Delphi 7 язык Object Pascal переименован в язык Delphi, который почти идентичен языку Object Pascal. Отличие касается работы с базами данных и Интернет.

Рассмотрим реализацию процесса выбора из двух вариантов.

Если переменная х задана на отрезке [0,1] вычислить площадь квадрата, иначе вычислить площадь круга (переменную использовать соответственно как сторону квадрата или радиус круга).

Пример 1

Если переменная х задана на отрезке [0,1] вычислить площадь квадрата, иначе вычислить площадь круга (переменную использовать соответственно как сторону квадрата или радиус круга).

Конструирование формы

Для формы Form1 в инспекторе объектов Object Inspector можно задать следующие свойства:

-     Caption – заголовок окна (например, «Вычисление»);          Height – 400 (высота окна);

-     Width – 600 (ширина окна). Поместить на форму компоненты:

-     панель Panel1 (в верхней части экрана для ввода информации);

-     панель Panel2 (в нижней части для вывода информации) (страница Standard). Для панелей с помощью свойства Caption очистить поле заголовка.

На панели Panel1 разместить компоненту Edit1 – для ввода переменной х (страница Standard).

Поле Text – очистить для ввода переменной x.

Label1 – использовать для задания метки для х (страница Standard). Для Label1 задать свойство Caption x=.

На панели Panel2 разместить метку Label2. Caption задать Результат.

Управлять вычислением будет кнопка Button1, разместить ее на панели Panel1 и задать Caption Вычислить. Для Button1 необходимо создать обработчик события OnClick (нажатие кнопки).

Форма будет иметь вид (рис. 2):

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 2. Форма с размещенными объектами

 

Для создания обработчика надо перейти на вкладку Events Инспектора объектов Object Inspector, выбрать мышкой нужную компоненту (Button1) и найти требуемое событие OnClick.

Двойной щелчок на этой кнопке и на экране окно кода программы.

Курсор устанавливается в процедуру – обработчика события, которая должна иметь следующий вид:

procedure Tform1.Button1Click(Sender:Tobject); begin

<место курсора> End;

 

Ниже представлена программа обработки заданного события. procedure Tform1.Button1Click(Sender:Tobject);

Var

x,s:real; // описание переменных begin

x:=StrToFloat(Edit1.Text);// ввод переменной х и преобразование ее из строкового в вещественный тип в соответствии с заданием

If (x>=0) and(x<=1) then begin S:=x*x; Panel2.Caption:=Площадь квадрата=+FloatToStr(s) end // вывод результата с преобразованием его в строковый тип данных для вывода в форму

else

begin s:=3,14*x*x; Panel2.Caption:=’Площадь круга=+FloatToStr(s) end;

end;

Вывод результата выполнен в заголовок панели Panel2.

 

Переменная х и результат s в форме – строкового типа, поэтому в программе переменная х преобразована в вещественный тип данных (StrToFloat), а при выводе s преобразуется в строковый тип данных (FloatToStr).

Множественный выбор

Для выполнения множественного выбора используются переключатели. Delphi для работы с переключателями предлагает следующие компоненты:

1.      переключатель с независимой фиксацией (CheckBox), флажок этого компонента можно переключать щелчком мыши;

2.      переключатели с зависимой фиксацией – RadioButton (кнопки выбора), RadioGroup руппа переключателей RadioButton).

Если в группе зависимых переключателей выбран один, то в отличие от независимого переключателя, его состояние нельзя изменить повторным щелчком. Для отмены выбора зависимого переключателя нужно выбрать другой переключатель из этой группы.

 

Пример 2

Вывести на экран произведения одного из пяти известных поэтов. Вывод выполнить с помощью зависимого переключателя RadioGroup.

Конструирование формы

Для ввода фамилий поэтов выберем компонент RadioGroup (группа зависимых переключателей).

Items этого компонента – список (зададим заголовки переключателей: (А.С. Пушкин, М.Ю. Лермонтов, С. Есенин, А. Блок, В. Маяковский).

ItemIndex указывает, какой из списка выбран переключатель: -1 – выбран никакой, 0 – первый и т. д.).

Добавить компонент Panel2 для вывода результата и метку. Label2 с заголовком Caption – Произведения известных поэтов.

Для запуска программы выберем компоненту Button и поместим ее на Panel1 в верхней части формы. Свойство Caption у кнопки зададим Выполнить (рис. 3).

Все выбранные компоненты находятся на странице Standard.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 3. Форма с размещенными объектами

 

Для установки обработчика события выберем компоненту Button1.

Двойной щелчок на этой компоненте и мы попадаем в редактор кода программы. В процедуре для получения результата используется оператор множественного выбора case of.

Результат зависит от месторасположения поэта.

procedure Tform1.Button1Click(Sender:Tobject); Var

c:string;

begin

case RadioGroup1.ItemIndex of

0: c:='Поэмы: Руслан и Людмила, Бахчисарайский фонтан';

1: c:='Поэмы: Мцыри, Демон';

2: c:='Поэмы: Анна Снегина, Пугачев';

3: c:='Стихи О прекрасной даме';

4: c:='Поэмы: Хорошо, Облако в штанах'; end;

Panel2.Caption:=c; end;

 

Так как в процедуре нет никаких вычислений и результат символьный ип string), то и нет никаких преобразований данных в отличие от предыдущего примера. Полный текст модуля будет иметь вид:

unit Unitradio1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm) Panel1: TPanel; Panel2: TPanel;

RadioGroup1:TRadioGroup; Button1: TButton; Label1: TLabel;

procedure Button1Click(Sender: TObject); private

{ Private declarations } public

{ Public declarations } end;

var

Form1: TForm1; implementation {$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); Var

c:string; begin

case RadioGroup1.ItemIndex of

0: c:='Поэмы: Руслан и Людмила, Бахчисарайский фонтан';

1: c:='Поэмы: Мцыри, Демон';

2: c:='Поэмы: Анна Снегина, Пугачев';

3: c:='Стихи О прекрасной даме';

4: c:='Поэмы: Хорошо, Облако в штанах';

 end;

Panel2.Caption:=c;

end;

end.

Задания для самостоятельной работы

Задание 1. Создать форму и процедуру обработки процесса выбора.

Вычислить площадь прямоугольника, если его стороны положительные.

Задание 2. Создать форму и процедуру обработки процесса множественного

выбора

Вывести в форму в зависимости от выбора фамилии двух известных писателей, двух поэтов или двух художников.

 

Практическая работа 4

ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ПОДПРОГРАММ

 

Цель работы: приобретение практических навыков реализации процедур и функций.

Используемые программные средства: Borland Delphi.

 

1. Теоретические сведения

 

В практике программирования часто возникают ситуации, когда одну и ту же группу операторов, реализующих определенную цель, требуется повторить без изменений в нескольких местах программы. Для избавления от столь нерациональной траты времени была предложена концепция подпрограммы, которые в языке ОР бывают двух типов: процедуры и функции.

Процедура это независимая именованная часть программы, которую можно вызвать по имени для выполнения определенных действий. Структура процедуры повторяет структуру программы. Процедура не может выступать в качестве операнда в выражении. Упоминание имени процедуры в тексте программы приводит к активизации процедуры и называется ее вызовом.

Функция сходна с процедурой, но имеет 2 отличия: функция передает в точку вызова скалярное значение; имя функции может входить в выражение в качестве операнда.

Итак, отличие подпрограмм-процедур от подпрограмм-функций состоит в том, что процедуры служат для задания совокупности действий, направленных на изменение внешней по отношению к ним программной обстановки, а функции, являясь частным случаем процедур, обязательно возвращают в точку вызова основной программы единственный результат как значение имени этой функции. Все процедуры и функции языка Оbject Рascal делятся на две группы: встроенные (стандартные) и определенные пользователем. Первые входят в состав языка и вызываются для выполнения по строго фиксированному имени. Вторые разрабатываются и именуются самим пользователем.

Для использования стандартной процедуры или функции к программе подключается тот или иной специализированный библиотечный модуль, в который входит данная стандартная процедура или функция, для чего имя специализированного библиотечного модуля указывается в разделе uses. Затем в программе осуществляется вызов процедуры или функции, для чего записывается ее имя и указываются фактические параметры, например: Pi, Sin(x), Inc(x,5), Chr(125). Так как после выполнения функции ее значение присваивается имени, то имя функции используется в выражении.

Если в программе возникает необходимость частого обращения к некоторой группе операторов, то рационально сгруппировать такую группу операторов в самостоятельный блок, к которому можно обращаться, указывая его имя. Такие разработанные программистом самостоятельные программные блоки называются подпрограммами пользователя. Они являются основами модульного программирования.

Разбивая задачу на част оформляя логически обособленные модули в виде процедур и функций, программист реализует основные принципы широко используемого в практике системного подхода и методов нисходящего проектирования.

При вызове подпрограммы, определенной программистом, работа главной программы на некоторое время приостанавливается и начинает выполняться вызванная подпрограмма. Она обрабатывает данные, переданные ей из главной программы. По завершении выполнения подпрограммаункция возвращает главной программе результат (подпрограмма-процедура не возвращает явно результирующего значения).

Передача данных из главной программы в подпрограмму и возврат результата выполнения функции осуществляется с помощью параметров. Параметром называется переменная, которой присваивается некоторое значение в рамках указанного применения. Различают формальные параметры – параметры, определенные в заголовке подпрограммы, и фактические параметры выражения, задающие конкретные значения при обращении к подпрограмме. При обращении к подпрограмме ее формальные параметры замещаются фактическими, переданными из главной программы.

Описание процедуры состоит из заголовка процедуры и тела процедуры. Заголовок включает в себя служебное слово procedure, имя процедуры и заключенные в круглые скобки список формальных параметров с указанием их типов:

procedure мя> (<список формальных параметров>); Формальные параметры отделяются точкой с запятой (список однотипных

параметров может быть перечислен через запятую). После заголовка идут разделы описаний онстант, типов, переменных, процедур и функций, используемых в процедуре) и операторы языка ОР, реализующие алгоритм процедуры.

Например:

 

procedure f1 (x: real; var y: real; var c: real); begin y:=sin(x)/cos(x); c:=ln(x)/ln(10);

end;

Формальные параметры нельзя описывать в разделе описаний процедуры.

Для обращения к процедуре необходимо использовать оператор вызова процедуры. Он имеет следующий вид:

<имя процедуры> (<список фактических параметров>); Например: f1(r, r1, r2);

Фактические параметры в списке отделяются друг от друга запятой. Механизм применения формальных-фактических параметров обеспечивает замену первых параметров последними, что позволяет выполнять процедуру с различными данными. Между фактическими параметрами в операторе вызова процедуры и формальными параметрами в заголовке процедуры устанавливается взаимно однозначное соответствие.

Замечание. Количество, типы и порядок следования формальных и фактических параметров должны совпадать.

Функция, определенная пользователем, состоит из заголовка и тела функции.

Заголовок содержит зарезервированное слово function, идентификатор (имя) функции, заключенный в круглые скобки, необязательный список формальных параметров и тип возвращаемого функцией значения:

Function <имя> (список формальных параметров): <тип результата>;

Тело функции представляет собой локальный блок, по структуре аналогичный программе.

Например:

 

function tan (c: real): real; begin tan:=sin(c)/ cos(c); end;

В теле функциивсегда долженбытьодиноператор, присваивающий значение имени функции.

Обращение к функции осуществляется по имени с указанием списка фактических параметров. Количество, типы и порядок следования формальных и фактических параметров должны совпадать:

<имя функции> (<список фактических параметров>);

Например: tg: =tan(x);

 

При использовании процедур и функций переменные объявляются несколько раз в основной программе и подпрограммах.

Переменные и типы, определенные в основной программе до объявления процедур и функций, называются глобальными они доступны всем функциям и процедурам. Переменные, определенные в какой-либо подпрограмме после раздела описания процедур и функций, называются локальными.

Для правильного          определения         области        действия        идентификаторов (переменных) необходимо придерживаться следующих правил:

 

a)     каждая переменная должна быть описана перед тем, как она будет использована;

b)    областью действия переменной является та подпрограмма, в которой она будет описана;

c)     все переменные в подпрограммах должны быть уникальными;

d)    одна и та же переменная может быть по-разному определена в каждой из подпрограмм;

e)    если            имя      подпрограммы          совпадает       с          названием      стандартной подпрограммы, то последняя игнорируется, а выполняется подпрограмма пользователя;

f)    если внутри какой-либо процедуры встречается переменная с таким же именем, что и глобальная переменная, то внутри процедуры будет действовать локальное описание;

g)   каждая подпрограмма может изменить значение глобальной переменной.

Рекурсия (рекурсивная процедура или функция) возникает, если функция

или процедура вызывает саму себя. Прямая рекурсия может вызывать себя непосредственно, например:

function Factorial (n: LongInt) : LongInt; begin Factorial:=n*Factorial(n-1); end;

Рекурсивная процедура также может вызывать себя косвенно, вызывая вторую процедуру, которая, в свою очередь, вызывает первую:

 

procedure Ping(n: Integer); begin Pong(n-1); end;

procedure Pong(n: Integer); begin Ping(n div 2); end;

 

Классическим примером рекурсии является вычисление факториала.

 

)

 
 Факториал числа n – это произведение целых чисел от 1 до n : 1* 2 * 3*…(n-1)*n. Приведенное выражение можно переписать следующим образом: n!= n *((n-1)*(n- 2)*...*3 * 2 * 1) = n * (n-1 )!

Рекурсивная функция вычисления факториала:

 

function Factorial (N: Integer): Integer; begin if (N<=0) then Factorial := 1

else

Factorial=N*Factorial(N-1); end;

 

Функция сначала проверяет число на условие N 0. Для чисел, меньших нуля факториал не определен, но это условие проверяется для подстраховки. Если бы функция проверила только условие равенства числа нулю, то для отрицательных чисел рекурсия была бы бесконечной.

Если входное значение меньше или равно нулю, функция возвращает значение, равное 1. Иначе значение функции равно произведению входного значения на факториал, уменьшенный на единицу.

Существуют два фактора, которые гарантируют, что эта рекурсивная функция в конце концов остановится. Во-первых, при каждом последующем вызове значение параметра N уменьшается на единицу. Во-вторых, значение N ограничено нулем. Когда значение достигает 0, функция заканчивает рекурсию. Такое условие, как N 0, которое останавливает рекурсию, называется основным условием или условием остановки.

При каждом вызове подпрограммы система сохраняет некоторые значения в стеке (стек упорядоченный список, в котором элементы добавляются и удаляются с одного и того же конца списка). Если рекурсивная процедура вызывается много раз, она может заполнить весь стек и вызвать ошибку переполнения стека.

Количество вызовов рекурсивной функции зависит от объема памяти компьютера и количества данных, которые программа помещает в стек.

 

2. Порядок выполнения работы

 

Изучить операторы, используемые для организации подпрограмм, выполнить контрольные примеры и задания

 

Пример 1

 

Написать программу вычисления выражения

 

 

в котором возведение в степень выполняется функцией Step.

Решение.

1. Открыть новый проект Delphi: File New Application .

 

2.  Установить с помощью Object Inspector следующие свойства компонента Form1:

Form1.Height = 345 Form1.Width = 396 Form1.BorderIcons biMaximize = false Form1.BorderStyle = bsSingle

Form1.Position = poScreenCenter Form1.Caption = 'Контрольный пример 1'.

3. Расположить на форме следующие компоненты: три компонента Edit, три

 

компонента Label, один компонент Button. Установить с помощью Object Inspector для них следующие свойства:

Label1.Caption = 'A' Label2.Caption = 'M' Label3.Caption = 'Z' Edit1.Text = '' Edit2.Text = '' Edit3.Text = ''

Button1.Caption = 'Выполнить'. 4. Текст программы приведен ниже:

 

unit Unit1; interface uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls; type

TForm1 = class(TForm) Edit1: TEdit;

Label1: TLabel;

Label2: TLabel;

Edit2: TEdit;

Button1: TButton;

Label3: TLabel;

Edit3: TEdit;

procedure Button1Click(Sender: TObject);

private { Private declarations } public

{ Public declarations } end; var

Form1: TForm1; M:integer; A,Z,R:real; implementation

{$R *.dfm}

//Функция вычисления степени.// N,Х формальные параметры, // результат, возвращаемый функцией в точку вызова // имеет

вещественный тип.

function Step(N:integer; X:real):real; var i:integer; y:real;

begin y:=1;

for i:=1 to N do y:=y*x;

step:=y; // присваивание функции результата // вычисления степени

end; // Step

procedure TForm1.Button1Click(Sender: TObject); begin

// ввод значения числа А и показателя степени М A:=StrToFloat(Edit1.Text); M:=StrToInt(Edit2.Text);

// Вызов функции с передачей ей фактических параметров Z:=Step(5,A);

Z:= Z+Step(3,1/A); if M=0 then R:=1

 

else if M>0 then R:=Step(M,A)

else R:=Step(-M,1/A); Z:=Z/(2*R);

 Edit3.Text:=FloatToStrF(Z,fffixed,7,5);

end;

end.

 

 


5. Запустить программу на компиляцию и выполнение.

Пример 2

Напишите процедуру, которая по заданному интервалу и функции определяет «ноль» функции с заданной точностью, используя метод деления отрезка пополам. Известно, что на границах интервала функция принимает значения, отличные по знаку. Определите «ноль» функции sin(x) = 0.2*х (наименьший положительный корень) на произвольном интервале [a;b]. Числа a и b вводятся с клавиатуры.

Решение.

 

1. Открыть новый проект Delphi: File – New Application.

 

2. Установить с помощью Object Inspector следующие свойства формы:

 

Form1.Height = 392 Form1.Width = 289 Form1.BorderIcons biMaximize = false Form1.BorderStyle = bsSingle

Form1.Position = poScreenCenter Form1.Caption = 'Метод половинного деления'

 

3. Расположить на форме следующие компоненты: три компонента Edit, три компонента Label, один компонент Button и один компонент BitBtn. Установить с помощью инспектора объектов следующие свойства:

Label1.Caption = 'a' Label2.Caption = 'b' Label3.Caption = 'решение' Edit1.Text = ''

Edit2.Text = '' Edit3.Text = '' Button1.Caption = 'Счет' BitBtn1.Kind = 'bkClose'

BitBtn1. Caption = '&Закрыть'.

4. Для решения задачи запишем обработчик событий Button1.Click, щелкнув на компоненте Button1 (кнопка Счет) два раза левой кнопкой мыши. Текст соответствующей процедуры имеет вид:

procedure TForm1.Button1Click(Sender: TObject);

var a,b,x1,x2,y:real;

begin a:=StrToFloat(edit1.Text);

b:=StrToFloat(edit2.Text);

x1:=a;

x2:=b; zero(x1,x2,y);

edit3.Text:=FloatToStrF(y,fffixed,8,4);

end;

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

Для реализации метода половинного деления использовалась подпрограмма- процедура Zero, которая должна располагаться в тексте модуля до того, как к ней происходит обращение:

procedure zero(a,b:real; var res:real);

const eps=1E-5;

var s:boolean;x3:real;

function f(x:real):real;

 begin

f:=sin(2*x)-0.2*x; end; // f begin s:=f(a)< 0; repeat x1:=(a+b)/2; x3:=f(x1);

if (x3<0)=s then a:=x1 else b:=x1; until abs(a-b)<eps; res:=x1;

end; // zero

 

Раздел констант приложения содержит величину допустимой погрешности вычислений EPS. В процедуру Zero вложена функция f, которая задается пользователем как левая часть уравнения f (x)=0. При обращении к процедуре Zero происходит отделение корня: булева константа S принимает значение True, если f (a)< 0 и False при f (a)> 0f. Операторы, стоящие между

Repeat и until, повторяются до тех пор, пока выражение untilне примет значение Trueпри проверке стоящего за ним условия, что означает достижение нужной погрешности вычислений.

5. Запустить проект на компиляцию и выполнение.

 

3. Самостоятельная работа

Написать рекурсивную функцию вычисления наибольшего общего делителя по алгоритму Эйлера:

Если Bделится на A нацело, то НОД (А, В) = А.

 

В противном случае НОД(А, В) = НОД(B mod A, A).

 

Решение.

1. Открыть новый проект Delphi: File – New Application.

 

2. Установить с помощью Object Inspector следующие свойства формы:

 

Form1.Height = 347 Form1.Width = 359 Form1.BorderIcons biMaximize = false Form1.BorderStyle = bsSingle

Form1.Position = poScreenCenter

Form1.Caption = 'Нахождение наибольшего общего делителя'.

3. Расположить на форме следующие компоненты: три компонента Edit, три компонента Label, один компонент Button и один компонент BitBtn. Установить для них следующие свойства:

Label1.Caption = 'a'

Label2.Caption = 'b'

Label3.Caption = 'НОД'

Edit1.Text = ‘ ‘

Edit2.Text = '' Edit3.Text = ''

Button1.Caption = 'Вычислить НОД' BitBtn1.Kind = 'bkClose' BitBtn1. Caption = '&Закрыть'.

 

Практическая работа №5

ПОСТРОЕНИЕ ДИАГРАММ И ГРАФИКОВ ФУНКЦИЙ

 

Цель работы: приобретение практических навыков по построению диаграмм и графиков функций.

Используемые программные средства: Borland Delphi.

 

1. Теоретические сведения. Работа с компонентами

 

Компонент-диаграмма Chart типа TChart предназначен для работы с графиками и диаграммами различных типов и служит для графического представления результатов. Компонент находится на панели Additional Палитры компонентов и имеет пиктограмму.

Компонент содержит большое количество разнообразных свойств, многие из которых являются объектами и имеют свои свойства. Установка значений этих свойств выполняется с помощью редактора Editing Chart ис. 6.1) во время разработки программы (приложения) либо при обращении к свойствам компонента во время ее выполнения. Всю работу по отображению графиков, построению и разметке координатных осей, сетки, подписей и т.д. берет на себя компонент Chart. Разработчику программы требуется задать тип диаграммы и источник данных.

Для представления данных, заданных таблично или с использованием функции, в виде линии, используется переменная Series1типа TLineSeries, которая описывает последовательность значений, отображающихся на диаграмме.

Добавление новой точки к серии выполняется с помощью метода

Add: function AddXY(Const AXValue,AYValue:Double; Const AXLabel:String; AColor:TColor),

где AXValue, AYValue параметры, определяющие координаты точки по осям OXи OY;

AXLabel – необязательный параметр;

AColor – цвет группы, к которой принадлежит точка.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 6.1. Окно редактора Editing Chart

 

Аналогично для добавления нового сектора в круговой диаграмме так же можно воспользоваться функцией

Add: function Add(Const PieValue:Double; Const APieLabel:String;

AColor: TColor) где PieValue величина сектора данных , APieLabel необязательный параметр, AColor – цвет сектора.

Связь между диаграммой и программным кодом происходит следующим образом. При создании каждой серии данных с помощью редактора Editing Chart, в разделе TForm1появляется новая переменная Series<n> (где <n> – номер серии) соответствующего типа. Например, для отображения серии данных в виде точек, переменная Series1будет иметь тип TPointSeries (точечное представление). Некоторые свойства компонента Chart приведены в табл. 6.1.

Таблица 6.1

Свойства компонента Chart

Title.Text

задание заголовка диаграммы

Title.Aligment

выравнивание заголовка

<NameAxis>.Automatic

автоматическое определение параметров по оси

<NameAxis>.Minimum

задание минимального значения по оси

<NameAxis>.Maximum

задание максимального значения по оси

<NameAxis>.Increment

задание шага разметки по оси

 

 

 

 

 

 

 

 

 

Под <NameAxis>понимается нижняя (BottomAxis), левая (LeftAxis), правая (RightAxis) или верхняя (TopAxis) координатная ось.

 

2. Порядок выполнения работы

Изучить компонент TChart и его свойства, выполнить контрольные примеры и задания.

Контрольный пример 1

Составить программу, отображающую графики функций f1 =sinx и f1 = cosx в интервале [a,b] с заданным шагом h.

Решение.

1. Открыть новый проект Delphi: File New Application.

2. На форме расположить следующие компоненты: три компонента Edit, три компонента Label, компонент Chartи компонент Buttonи установить для них следующие свойства:

Label1.Caption = 'a' Label2.Caption = 'b' Label3.Caption = 'h' Edit1.Text = '' Edit2.Text = '' Edit3.Text = ''

Button1.Caption = 'Построить'

Для изменения параметров компонента Chart необходимо два раза щелкнуть на нем левой кнопкой мыши (или один раз правой кнопкой и в контекстном меню выбрать пункт Edit Chart). В открывшемся окне редактирования Editing Chart1 создать два объекта Series1и Series2, щелкнув на кнопке Add, находящейся на вкладке Series. В качестве типа графика выбрать Line, отключив трехмерное представление с помощью переключателя 3D. Для изменения имен серий (на f1 и f2) используется кнопка Title. Редактирование завершается нажатием кнопки Close. Первоначально на графиках отображаются случайные значения.

3. Для решения задачи запишем обработчик событий Button1.Click, щелкнув на компоненте Button1 (кнопка Построить) два раза левой кнопкой мыши. Текст соответствующей процедуры имеет вид:

procedure TForm1.Button1Click(Sender: TObject); var a,b,h:double;

var x,f1,f2:double; begin

//удаление всех значений в ряду данных Series1.Clear;

Series2.Clear;

//задание значений границ и шага a:=StrToFloat(Edit1.Text); b:=StrToFloat(Edit2.Text); h:=StrToFloat(Edit3.Text);

//расчет значений функций x:=a;

repeat f1:=sin(x);

Series1.AddXY(x,f1,'',clRed); f2:=cos(x); Series2.AddXY(x,f2,'',clBlue); x:=x+h;

until x>b;

//задание названия диаграммы Chart1.Title.Text.Clear; Chart1.Title.Text.Add('Графики функций f1 и f2.

Шаг = '+FloatToStr(h)); //установка параметров нижней оси

Chart1.BottomAxis.Automatic:=false; Chart1.BottomAxis.Minimum:=a; Chart1.BottomAxis.Maximum:=b;

Chart1.BottomAxis.Increment:=(Chart1.BottomAxis.Maximum -Chart1.BottomAxis.Minimum)/2;

//установка параметров левой оси Chart1.LeftAxis.Automatic:=false; Chart1.LeftAxis.Minimum:=-1; Chart1.LeftAxis.Maximum:=1; Chart1.LeftAxis.Increment:=0.5;

end;

4. Запустить проект на компиляцию и выполнение.

5. Задать значения a = 0, b = 6.28, h = 0.1 и нажать кнопку Построить. График зависимостей будет иметь вид, показанный на рис. 6.2.

 

 

 

 

 

 

 

 

 

 

Рис. 6.2. Результат выполнения программы для контрольного примера 6.1

 

3. Самостоятельное задание

 

Задание 1. Построить график функции y = ax2 + bx + c. Значения параметров

a, b, с задаются с клавиатуры (использовать компонент Edit).

Задание 2. Построить круговую диаграмму реализации следующей продукции: кофе – 20%, чай – 35%, напитки – 45%. Использовать компонент типа TPieSeries (круговая диаграмма).

 

Практическая работа №6

Файловый тип данных. Типизированные файлы.

 

1.              Теоретические сведения

 

Файл – это именованная структура данных, представляющая собой последовательность элементов данных одного типа расположенных на диске или любом другом внешнем носителе.

Для файла существует понятие текущей позиции. Она показывает номер элемента, который будет прочитан или записан при очередном обращении к файлу. Чтение-запись каждого элемента продвигает текущую позицию на единицу вперед. Для большинства файлов можно менять текущую позицию чтения-записи, выполняя прямой доступ к его элементам.

В зависимости от типа элементов различают три вида файла:

– файл из элементов определенного типа (типизированные файлы);

– файл из элементов, тип которых не указан (нетипизированный файл);

– текстовый файл, т.е. элементами являются текстовые строки.

Для работы с файлом в программе объявляется файловая переменная (логический файл) в разделе описания переменных:

имя_файла:file of тип_элементов_файлов;

Файл, компонентами которого являются данные символьного типа, называется символьным, или текстовым:

имя_файла:TextFile;

После объявления файловой переменной, которая задает тип компонентов файла, необходимо указать конкретный файл, т.е. связать файловую переменную с физическим файлом. Для этого используется процедура:

AssignFile(var f, имя_файла:String);

Функции и процедуры для работы с файлами:

1. Открытие файла для записи

– перезапись (запись нового файла поверх существующего или создание нового файла) – используется процедура

rewrite(файловая_переменная)

– добавление в конец файла – используется процедура

append(файловая_переменная)

1. Запись в файл

Write(файловая_переменная, список_переменных)

Writeln(файловая_переменная, список_переменных)

Различие между инструкциями в том, что инструкция writeln после вывода всех значений, записывает в файл символ «новая строка».

2. Закрытие файла. Перед завершением работы все открытые файлы необходимо закрыть с помощью процедуры

CloseFile (файловая_переменная)

3. Открытие файла для чтения. Используется процедура Reset(файловая_переменная)

4. Чтение данных из файла

read(файловая_переменная, список_переменных)

readln(файловая_переменная, список_переменных)

Отличие между этими процедурами в том, что при вызове инструкции readln указатель чтения из файла автоматически перемещается в начало следующей строки файла.

5. Определение конца файла. Используется функция EOF(файловая_переменная). Значение функции равно false, если прочитанный элемент данных не является последним в файле, т.е. возможно дальнейшее чтение. Если прочитанный элемент файла является последним, то значение EOF равно true.

While not eof(f) do begin … end;

6. Rename(var F; NewName: string) – переименовывает неоткрытый файл F любого типа. Новое имя задается в NewName.

7. Seek(var F; NumRec: Longint) – устанавливает позицию чтения-записи на элемент с номером NumRec; F – типизированный или нетипизированный файл.

8. IOResult: Integer – возвращает код, характеризующий результат (была ошибка или нет) последней операции ввода-вывода.

9. FilePos(var F): Longint – возвращает для файла F текущую файловую позицию (номер элемента, на которую она установлена, считая от нуля). Не используется с текстовыми файлами.

10. FileSize(var F): Longint – возвращает число компонент в файле F. Не используется с текстовыми файлами.

Для работы с файлами можно использовать следующие визуальные компоненты:

– {SITELINK-S102}OpenDialog{/SITELINK};

– {SITELINK-S103}SaveDialog{/SITELINK} и др, которые находятся на вкладке Dialogs.

Организация доступа к типизированному файлу аналогична организации доступа к текстовому файлу: необходимы процедуры связывания файла с файловой переменной (AssignFile) и инициализации файла (для чтения, записи или перезаписи). Однако есть и отличия – к записям типизированного файла можно обращаться как последовательно, так и в любом порядке. Это обстоятельство связано с тем, что длина любого компонента ти- пизированного файла постоянна и, собственно, зависит от объявленного типа записей файла. Последовательное обращение к записям типизированного файла организуется стандартными процедурами Read и Write. Если есть необходимость сменить порядок чтения/записи, то можно воспользоваться процедурой Seek(f,k), которая смещает ука- затель текущего положения в файле f (f файловая переменная) к требуемому компонен- ту k (k – переменная типа LongInt).

Для того чтобы узнать размер файла в компонентах его типа можно воспользоваться

стандартной функцией FileSize(f). Текущую позицию в файле (порядковый номер компонента файла, который будет обрабатываться следующей операцией ввода/вывода) возвращает функция FilePos(f).

 

2.              Пример работы с типизированными файлами.

 

Рассмотрим организацию работы с типизированными файлами на примере.

Разработаем программу – заготовку под текстовый редактор. Основная особенность редактора состоит в том, что цвета фона и шрифта зависят от дня недели и есть возмож- ность эти цвета настроить.

Создайте новое приложение, на главной форме разместите компоненты: Memo1 и TabControl1 (с вкладки Win32).

В компоненте TabControl1 (в разрабатываемом приложении он нужен для на- стройки цветов по дням недели) добавьте вкладки (Пн, Вт, Ср, Чт, Пт, Сб, Вс) через свой- ство Tabs, набрав соответствующие строки. Затем измените ширину ярлычков через свойство TabWidth (30 пикселей будет достаточно).

На компонент TabControl1 положите две метки Label (с надписями – шрифт и фон) и два компонента ColorBox (с вкладки Additional). Для цвета шрифта у ColorBox1 оставьте выделенный цвет clBlack (свойство Selected), а для цвета фона у ColorBox2 измените свойство Selected на clWhite.

Примерный вид формы смотрите на рисунке 1.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


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

1)                  при изменении цвета в ColorBox1 будет меняться цвет шрифта в Memo1;

2)                  при изменении цвета в ColorBox2 будет меняться цвет фона в Memo1;

3)                  при нажатии на ярлычок TabControl1 будут происходить изменения: устанавливаться цвета в ColorBox1, ColorBox2 и Memo1 для выбранного дня недели;

4)                  при запуске приложения подгружаются цветовые настройки из ini файла и устанавли- вается цветовая настройка Memo1, соответствующая текущему дню недели;

5)                  при закрытии приложения цветовые настройки по дням недели сохраняются в ini

файл.

Надпись: procedure TForm1.ColorBox1Change(Sender: TObject); begin
memo1.Font.Color:=ColorBox1.Selected; end;
procedure TForm1.ColorBox2Change(Sender: TObject); begin
memo1.Color:=ColorBox2.Selected; end;

Первые два обработчика достаточно просты. Через инспектор объектов для компонентов ColorBox1 и ColorBox2 создайте заготовки под обработчики событий OnChange и заполните их следующим кодом:

 

Апробируйте работу созданных процедур.

Переходим к третьему обработчику – он должен менять цветовые настройки многострочного текстового поля memo1 в зависимости от выбранного пользователем дня недели, то есть по клику на соответствующем ярлычке TabControl1. Сами цвета должны где-то храниться, для чего создадим массив записей с двумя полями – одно поле для хранения цвета шрифта, а другое для хранения цвета фона.

В разделе глобальных переменных модуля добавим описание массива:

m: array[1..7] of dn;

Надпись: Type
dn = record cfont,cback: TColor;
end; var
Form1: TForm1;
m: array[1..7] of dn;

где dn нестандартный тип данных, подразумевающий наличие двух полей записи: цвет шрифта и цвет фона. Идентификаторы полей у типа dn придумаем сами – например, cfont и cback. Нестандартный тип данных следует описать в соответствующем разделе модуля – в разделе Type:

 

Итак, массив m описан как глобальная переменная и доступен в любой процедуре модуля. На начальном этапе, пока еще нет ini файла программы, при запуске приложе- ния установим значения для всех дней недели одинаковыми: цвет фона – белый, цвет шрифта – черный. Чтобы реализовать эту возможность, создайте через инспектор объектов для главной формы приложения заготовку под обработчик события OnCreate и заполните его следующим кодом (это 4-ый из 5-ти разрабатываемых обработчиков):

 

 

Надпись: procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var i: byte;
begin
assignfile(f,'week.ini'); rewrite(f);
for i:=1 to 7 do write(f,m[i]); closefile(f);
end;

 
Надпись: procedure TForm1.FormCreate(Sender: TObject); var i: byte;
begin
for i:=1 to 7 do begin
m[i].cfont:=clBlack; m[i].cback:=clWhite;
end; end;

Надпись: procedure TForm1.TabControl1Change(Sender: TObject); begin
ColorBox1.Selected:=m[TabControl1.TabIndex+1].cfont; ColorBox2.Selected:=m[TabControl1.TabIndex+1].cback; memo1.Font.Color:=ColorBox1.Selected; memo1.Color:=ColorBox2.Selected;
end;

Теперь уже есть возможность переключаться между цветовыми настройками дней недели. Через инспектор объектов для компонента TabControl1 создайте обработчик события OnChange и заполните его следующим кодом (это 3-ий из 5-ти разрабатываемых обработчиков):

Первые две строчки обеспечивают изменение выбранных цветов шрифта и фона в соответствующих компонентах ColorBox1 и ColorBox2 в соответствии с выбранным днем недели (ярлычок TabControl1). Значения соответствующих цветов берутся из массива m. Тут следует пояснить, что, как и везде в Паскале, счет ярлычков в компоненте TabCon- trol ведется с нуля, поэтому, для приведения в соответствие номеров ярлычков с номе- рами элементов массива m необходимо увеличивать номер TabIndex нажатого ярлычка на единицу (m[TabControl1.TabIndex+1].cfont). Например, при нажатии на самый правый ярлычок (с надписью ‘вс’) TabIndex возвращает значение 6.

Надпись: Var
Form1: TForm1;
m: array[1..7] of dn; f: file of dn;

Следующие две строчки устанавливают цветовые параметры поля memo1.

Апробируйте работу программы.

Осталось реализовать сохранение цветовой настройки по дням недели в ini файле. Добавим в раздел описания глобальных переменных модуля еще одну строчку –описание файловой переменной f типа dn, описанного нами ранее:

Теперь можно организовать работу с типизированным файлом. Каждый компонент этого файла будет представлять собой запись с двумя полями: cfont, cback: TColor.

При закрытии приложения текущие цветовые настройки должны быть сохранены в ini файл. Через инспектор объектов создайте заготовку под обработчик события OnClose и заполните следующим кодом (это 5-ый из 5-ти разрабатываемых обработчиков):

Здесь все достаточно очевидно и не требует дополнительных комментариев. Апро- бируйте программу: измените цветовые настройки разных дней. При выходе из приложения они будут сохранены в ini файл.

Если вы сразу же запустите программу повторно, то ваши настройки будут уничтожены процедурой FormCreate, так как в ней, при запуске приложения, устанавливаются цветовые значения по умолчанию – черный и белый для всех семи дней недели. Пришло время убрать цикл (for i:=1 to 7 do) и заменить его на цикл чтения записей из типизированного файла.

Надпись: procedure TForm1.FormCreate(Sender: TObject); var i: byte;
begin
for i:=1 to 7 do begin
m[i].cfont:=clBlack; m[i].cback:=clWhite;
end; end;

Было так:

 

А следует сделать так:

Надпись: procedure TForm1.FormCreate(Sender: TObject); var i: byte;
begin
assignfile(f,'week.ini'); reset(f);
for i:=1 to filesize(f) do read(f,m[i]); closefile(f);
end;

Итак, к настоящему моменту программа уже функционально закончена и разработанные пять процедур реализуют основные задуманные возможности. Однако, до сих пор не реализовано основное предназначение ini файла: программа должна не только хранить в типизированном файле цветовые настройки, но и пользоваться ими, то есть приводить цветовые настройки поля memo1 в соответствие с цветовыми настройками дня недели. При запуске программы (процедура FormCreate) следует определять текущий день недели и устанавливать соответствующие цвет шрифта и фона поля memo1.

Текущий день недели возвращает в строковом формате стандартная функция

Надпись: procedure TForm1.FormCreate(Sender: TObject); var i: byte;
begin
assignfile(f,'week.ini'); reset(f);
for i:=1 to filesize(f) do read(f,m[i]); closefile(f); Form1.Caption:=FormatDateTime('ddd',Now);
end;

FormatDateTime('ddd',Now); извлекая его из переменной Now, содержащей системное время. Давайте попробуем её применить, добавив в процедуру FormCreate:

Апробируйте работу программы. Текущий день недели в сокращенном формате (Пн, Вт, Ср, Чт, Пт, Сб, Вс) при запуске приложения будет выводиться в заголовок главной формы.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Осталось только по дню недели определять какой порядковый номер использовать для извлечения цветовых настроек из массива m. Сде- лать это довольно просто, так как список дней недели в сокращенном формате уже находится в свойстве Tabs компонента TabControl1. Свой- ство Tabs представляет собой список строк (Пн, Вт, Ср, Чт, Пт, Сб, Вс), каждая из которых имеет свой порядковый номер и номера строк начина- ются с нуля. Например, TabControl1.Tabs[0] содержит строку ‘Пн’.

Дополним процедуру FormCreate циклом, последовательно проверяющим все строки свойства Tabs компонента TabControl1 на совпадение с текущим днем недели. При совпадении цикл прерывается и имитируется нажатие на ярлычок компонента  TabControl1, соответствующий текущему дню недели:

Надпись: procedure TForm1.FormCreate(Sender: TObject); var i: byte;
begin
assignfile(f,'week.ini'); reset(f);
for i:=1 to filesize(f) do read(f,m[i]); closefile(f); Form1.Caption:=FormatDateTime('ddd',Now); for i:=0 to 6 do
if TabControl1.Tabs[i]=Form1.Caption then break; TabControl1.TabIndex:=i; TabControl1Change(TabControl1);
end;

На этом разработку программы можно считать законченной. Создано пять несложных и небольших по объему процедур. Программа может служить шаблоном для разработки приложений, использующих в своей работе файлы конфигурации, содержащие необходимые настройки.

 

3.              Задание для самостоятельного исполнения.

 

Дополните разработанное приложение таким образом, чтобы от дня недели зависели не только цвета шрифта и фона компонента memo1, но и сам шрифт (например, его имя, размер или стиль).

 

Практическая работа №7.

Файлы. Текстовые файлы

 

1.1.             Доступ к файлам

Когда речь идет о работе программы с текстовым файлом, подразумеваются процедуры ввода данных из файла в программу или, наоборот, запись этих данных в файл программой. Для текстового файла допустима простая работа с файлом без особых дополнительных механизмов, которые применяются для работы со специализированными файлами, такими как при загрузке данных из Excel или работе программы с базой данных. Разумеется, Delphi располагает возможностями работать с файлами с использованием компонентов. Но в данной статье рассматривается механизм прямой работы с текстовым файлом без использования дополнительных компонентов.

Итак, в общем виде, работа с файлом заключается в следующих этапах:

1. подключение к файлу – связь с внешним файлом, указание режима подключения;

2. выполнение операций записи в файл или чтения из файла;

3. завершение работы с файлом.

Текстовые файлы рассматриваются как совокупность строк переменной длины. Доступ к каждой строке доступен лишь последовательно. Начать чтение строк файла можно только с первой строки. Чтение строки организуется с помощью процедуры ReadLn. Данная процедура имеет два аргумента. Первый аргумент используется для обозначения конкретного файла, из которого осуществляется чтение. Второй аргумент – переменная, в которую будет помещена очередная строка из файла. Пример: ReadLn(f,s) – здесь f– имя файловой переменной типа textfile, ассоциированной с конкретным файлом, а s – имя строковой переменной, в которую помещается считанная из файла строка.

Для того чтобы можно было обращаться к файлу через имя файловой переменной следует сначала их связать процедурой AssignFile(f,n), где f – имя файловой пере-менной, а n – имя файла. Имя файла можно задать непосредственно через строковую кон-станту:

AssignFile(f,’start.txt’) или через строковую переменную:

n:=’start.txt’; AssignFile(f,n);

Организация доступа к файлу этим не исчерпывается. Кроме связывания файловой переменной следует также инициализировать файл одной из процедур: Reset, Rewrite или Append. Процедура Resetоткрывает файл для чтения, Rewrite– для записи, Append – для добавления записей.

После работы с файлом его следует закрыть процедурой CloseFile(f), где f –имя файловой переменной.

 

 

 


Задание 1: Создайте приложение, которое создает текстовый файл

 

text1.txt и записывает в него текст, введенный пользователем в окно Edit, после чего закрывает файл.

 

Решение:

 

Создайте форму и задайте для ее свойства Caption значение «Создание файла и вывод в него текста». Разместите на форме компоненты Edit1, Labbel1, Button1, как показано на рис. 6.1. Задайте значения для свойства Label1. Caption «Введите текст», Button1. Caption «Сохранить». Выровняйте компоненты и зафиксируйте их положение на форме.

Сохраните файлы модуля под именем main и проекта под именем TextEditFile в папке Обработка текстовых файлов.


Рис. 6.1 Пример формы проекта

 

Создайте процедуру обработки события кнопки «Сохранить», введите в окне Редактора кода следующий текст:

procedure TForm1. Button1Click (Sender: TObject); var

f: TextFile; {описание файловой переменной} begin

AssignFile (f, 'text1.txt'); {связь файловой переменной с файлом} Rewrite(f); {создать новый файл}

Writeln (f, Edit1. Text); {записать в файл}

CloseFile(f); end; {закрыть файл}

 

Запустите приложение и введите в окно Edit следующее предложение – «Мой первый пример текста». Щелкните мышкой на кнопке «Сохранить» и закройте окно приложения.

Откройте окно Проводника Windows папку Обработка текстовых файлов, в которой сохранены файлы проекта. В списке файлов этой папки находится вновь созданный файл text1.txt. Дважды щелкните левой кнопкой мыши на имени файла text1.txt. Убедитесь, что это тот самый текст, который введен в окне приложения. Откроется окно редактора Блокнот с этим файлом. Закройте окно редактора Блокнот и Проводник.

 

Задание 2: Создайте приложение, открывающее текстовый файл для

 

чтения и считывающие из него текст в окно Memo. Перед открытием файла следует проверить его наличие, в случае его отсутствия должно выводиться соответствующее сообщение.

Решение:

 

Создайте новое приложение (проект). Создайте форму «Чтение текста из файла в окно». На форме разместите компоненты Memo1, Label1, Button1, как показано на рис. 6.2. Задайте значения свойств Label1. Caption «Текст из файла», Button1. Caption «Прочитать текст из файла».

Для удаления текста Memo1 из компонента выберите в окне Инспектора объектов объект Memo1, затем на странице Свойства выберите свойсво Lines и в поле со значением Strings произведите двойной щелчок. После этого в окне StringListEditor удалите текст и щелкните мышью на кнопке ОК.

Для обеспечения возможности просмотра в окне Memo1 длинных текстов с использованием вертикальной полосы прокрутки в окне Инспектора объектов выберите свойство ScrollBars значение ssVertical.

Выровняйте компоненты и зафиксируйте их положение на форме.

 

Рис. 6.2 Пример формы приложения

 

Создайте процедуру обработки события кнопки «Прочитать текст из файла», отредактируйте текст процедуры следующим образом:

procedure TForm1. Button1Click (Sender: TObject); var f: TextFile;

ch: Char; begin

AssignFile (f, 'text1.txt'); {$I-}

Reset(f); {$I+}

if IOResult=0 then begin while not Eof(f) do begin

Read (f, ch);

 

Memo1. Text:=Memo1. Text+ch; end;

CloseFile(f);

end else

 

ShowMessage ('Нет такого файла'); end;

Сохраните файл модуля под именем main1, а файл проекта под именем TextMemoFile1 в папке Обработка текстовых файлов.

Откомпилируйте и запустите приложение, проверьте его работу.

 

Задание 3: Создайте приложение, открывающее текстовый файл для дополнения и затем добавляющее в него введенный текст.

 

Решение:

 

Создайте новый проект, задайте название формы «Добавление текста в файл». На форме разместите компонентыButton1,2, Memo1, Label1,2, Edit1 как показано на рис. 6.3. Присвойте значения свойствам Label1. Caption «Текст из файла», Button1. Capton «Прочитать текст из файла», Label2. Caption «Добавляемый текст», Button2. Caption «Добавить текст в файл». Удалите текст из компонентов Memo1, Edit1. Установите линейку вертикальной прокрутки для обеспечения возможности просмотра длинных текстов в компоненте Memo1. Выровняйте компоненты и зафиксируйте их положение на форме.

Рис. 6.3 Пример формы приложения

 

Создайте обработчик нажатия кнопки «Прочитать текст из файла» самостоятельно.

Для кнопки «Добавить текст в файл» запишите следующий код события:

 

Procedure TForm1. Button2Click (Sender: TObject);

Var

F: TextFile;

Begin

AssingFile (f, ‘text1.txt’);

Append (f);

Writeln (f, Edit1. Text);

CloseFile (f);

End;

 

Сохраните файл модуля под именем Main2, а файл проекта под именем TextMemoFile2 в папке Обработка текстовых файлов.

Запустите и проверьте работу приложения.

 

Задание 4: Создайте приложение, которое открывает текстовый файл с использованием метода OpenDialog, считывает текст из него в объект Memo, затем сохраняет измененный текст в файл с использованием метода SaveDialog и выводит текст на печать, используя метод PrintDialog.

 

Решение:

 

Создайте новый проект и сохраните в папке «Диалоговая панель». На форме разместите компоненты Memo1, Button1,2,3. Кнопки назовите «Сохранить», «Открыть», «Печать» соответственно. Задайте компоненту Memo1 вертикальную полосу прокрутки и удалите текст. Выровняйте и зафиксируйте компоненты на форме (см. рис. 6.4).

 


Рис. 6.4 Форма проекта «Диалоговая панель»

 

Выберите в палитре компонентов страницу Dialog и поместите на форму компоненты OpenDialog, SaveDialog, PrintDialog. Так как они не являются визуальными компонентами, то их можно поместить в любое место формы.

Задайте для свойства SaveDialog. Title значение «Сохранить текстовый файл», которое будет отображаться в заголовке диалогового окна сохранения файла. Чтобы при сохранении файла в окне диалога обеспечить выбор типа файла, выберите свойство Filter и произведите двойной щелчок в списке значений. Откроется окно FilterEditor. Задайте фильтры для выбора типа и расширения файла:

 

Filter Name

Filter

Текстовый (*.txt)

*.txt

Текстовый (*.doc)

*.doc

 

И щелкните по кнопке ОК, затем установите расширение *.txt по умолчанию – задайте свойству SaveDialog1. FilterIndex значение 1.

Задайте для свойства OpenDialog1. Title «Открыть текстовый файл». Чтобы реализовать выбор типа файла при открытии файла в окне диалога, на странице Свойства произведите двойной щелчок по списку значений свойства Filter. В окне Filter Editor задайте фильтры для выбора типа и расширения файла:

 

Filter Name

Filter

Текстовый (*.txt)

*.txt