Инструкционные карты занятий
1 1 1 1 1 1 1 1 1 1 Рейтинг 0.00 (0 Голоса)

ИНСТРУКЦИОННАЯ КАРТА № 13

На выполнение практического занятия по учебной практике

«Программирование»

Тема: Элементы графики в Delphi

Цель работы

- продолжить дальнейшее освоение работы с объектами Delphi;

- научиться использовать специальные графические компоненты (элементы управления) для рисования графиков функций.

Норма времени: 2 часа.

Оснащение рабочего места:

Инструкционные карты, конспект, ПК, среда Delphi.

ХОД РАБОТЫ

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

Построение графика. Методы некоторых объектов, имеющих канву (точнее, методы самой канвы), например формы, позволяют формировать графические изображения непосредственно, в том числе и рисовать графики. Однако среди многочисленных компонентов Delphi имеется специальный объект типа TChart для графического представления числовых данных. Прототип этого компонента находится на странице Additional. Компонент является специальной панелью, на которой можно создавать диаграммы и графики различных типов. Компонент служит контейнером для объектов Series типа TChartSeries – серий данных (страниц), характеризующихся различными стилями отображения. Компонент может включать несколько серий. Каждая серия имеет собственное имя и в Инспекторе объектов описывается как отдельный объект. Обычно серия содержит один какой-то набор данных (например, таблицу значений функции). Набор представляет собой множество пар значений, интерпретируемых обычно как значения координат x и y (точки). Можно говорить, что серия содержит набор точек. Этот набор можно формировать программно, последовательно добавляя в него новые точки. После добавления каждой точки отображение набора в серии (например, график) автоматически перерисовывается. Каждый набор отображается в заданном для серии виде (например, в виде графика или в виде гистограммы и т. д.). При этом можно для каждой серии определить свой стиль (цвет, толщину линий и т. п.). При отображении на экране изображения всех серий накладываются друг на друга, формируя единое изображение. Таким образом, на экране (в компоненте TChart) можно получить несколько различных графиков одновременно: каждый график в своей серии. При необходимости отдельные графики (серии) можно скрывать. Для идентификации серий используется так называемая легенда – прямоугольная область, в которой для каждой серии показывается стиль, которым она отображается.

Многочисленные свойства самого компонента и его серий можно установить с помощью Редактора диаграмм (рис. 1) или программно.

Рисунок 1 – Окно Редактора диаграмм

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

Окно Редактора диаграмм содержит две страницы (закладки верхнего уровня) – Chart (общие свойства графика) и Series (свойства серий). Каждая из этих страниц, в свою очередь, имеет несколько закладок. Причем, состав закладок на странице Series зависит от вида графика. Для добавления новой серии необходимо на странице Chart активизировать закладку Series, щелкнуть кнопку Add и в предложенной галерее выбрать форму представления данных серии – тип диаграммы или графика. Затем можно установить остальные свойства серии.

Как уже отмечалось, если компонент TChart содержит несколько серий, диаграммы или графики, отображаемые в них, накладываются друг на друга. Чтобы какую-то диаграмму или график временно убрать из экрана, необходимо свойству Active серии, к которой относятся данные этой диаграммы или графика, присвоить значение false.

Компонент содержит большое количество специфических свойств, событий и методов.

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

· Clear – очистка серии от занесенных ранее данных;

· AddXY – добавление в серию (график) новой точки.

Создание многостраничных окон. Этой практической работе для вывода графика функции понадобилось бы еще одно окно (форма), дополнительно к главному окну и окну вывода таблицы значений функции, т. е. организовать многооконное приложение, как это было сделано в предыдущей работе. Обычно реальные приложения содержат несколько окон (иногда – десятки). Для уменьшения количества окон и совмещения информации в одном окне часто используются многостраничные окна. Для этой цели предназначен компонент TPageControl (набор страниц с закладками). Этот компонент позволяет создавать несколько перекрывающих друг друга страниц (панелей) класса TtabSheet. Каждая страница содержит свой набор компонентов. Доступ к конкретной странице осуществляется через связанный с ней корешок (закладку) – небольшой выступ над страницей, содержащий краткое название страницы. Это широко распространенный в Windows и его приложениях элемент управления, позволяющий создавать многостраничные окна. В процессе конструирования новая страница добавляется командой New Page из контекстного меню компонента. Каждая страница – самостоятельный объект, поэтому для каждой созданной страницы в окне Инспектора объектов появляется очередной объект класса TTabSheet. Чтобы показать в окне Инспектора объектов свойства какой-либо страницы, необходимо выделить (активизировать) эту страницу. Для этого сначала сделать щелчок на ее корешке (выбрать нужную страницу), а затем – щелчок в области данных страницы (ниже области корешков). Щелчок в области корешков активизирует компонент TpageControl в целом. Естественно, активизировать как компонент TpageControl, так и любую его страницу, можно с помощью раскрывающегося списка в верхней части окна Инспектора объектов.

Основные свойства объекта TPageControl:

· TabHeight – высота корешка в пикселях;

· TabWidth – ширина корешка в пикселях;

· MultiLine – имеет значение true, если разрешено отображать кореш-

· ки в несколько строк;

· ActivePage – содержит ссылку на активную страницу (имя активной

· страницы). Установка нового значения ActivePage размещает соответст-

· вующую страницу поверх остальных;

· ActivePageIndex – содержит индекс активной страницы (панели);

· PageCount – содержит количество страниц (только для чтения).

· Основные свойства объектов TtabSheet:

· Caption – определяет надпись на корешке страницы;

· PageIndex – индекс страницы (индексация с нуля).

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

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

Задание На основе проекта ПР9 разработать новый проект, включив в него блок вывода на экран графика функции; предусмотреть масштабирование графика в зависимости от размеров окна.

1 Войти в среду Delphi. Создать новый проект. Присвоить ему имя PR13.

2 Используя палитру компонентов (элементов управления), спроектировать форму Form1, изменить значение ее свойства Name в соответствии с требованиями, (PR13_<ФИО>_Form1). Для свойства BorderStyle оставить значение bsSizeable (устанавливается по умолчанию), что позволяет изменять размеры формы (окна) в процессе выполнения приложения. Сохранить форму и проект.

3 В нижней части формы поместить элемент управления BitBtn1

(командная кнопка) из страницы Additional. Растянуть его, чтобы он имел ширину примерно такую, как форма. Чтобы при расширении формы этот компонент тоже растягивался, в сложном свойстве Anchors установить в true значения параметров akLeft и akRight. Установка в true значения параметра akBottom в этом же свойстве привяжет кнопку к нижнему краю формы: при изменении вертикального размера формы кнопка всегда будет находиться в нижней части формы (при этом значение параметра akTop необходимо сбросить в false).

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

5 Привязать созданный компонент PageControl1 ко всем четырем сторонам формы, чтобы при изменении размеров формы соответственно изменялись и размеры компонента. Для этого в сложном свойстве Anchors значения всех параметров установить в true.

6 Щелкая правой клавишей мыши на компоненте PageControl1, и выбирая пункт контекстного меню New Page, создать три новых страницы.

7 Оставить названия полученных страниц TabSheet1… TabSheet3 или присвоить новые по своему усмотрению. В полях свойств Caption написать: «Ввод исходных данных», «Таблица значений» и «График функции», соответственно.

8 Страница TabSheet1 оформляется примерно так же, как и форма Form1 в практической работе №9 (рис. 2). С помощью буфера обмена можно скопировать все элементы этой формы на страницу TabSheet1. Это можно сделать следующим образом:

С помощью команды Project àAdd toProject…(появится окно диалога для выбора файла) временно добавить к проекту форму Form1 из практической работы № 9;

Щелчком на кнопке View Form раскрыть перечень форм проекта и выбрать в нем добавленную форму Form1 из практической работы № 9;

Выделить в этой форме все подлежащие копированию компоненты, последовательно щелкая на них мышью при нажатой клавише Shift;

Скопировать выделенные элементы в буфер обмена командой EditàCopy;

Перейти на соответствующую страницу (TabSheet1) компонента PageControl1 создаваемой формы;

Вставить компоненты из буфера обмена командой EditàPaste;

С помощью команды ProjectàRemove from Project… удалить не нужную уже форму из предыдущей практической работы.

Рисунок 2 – Примерный вид первой страницы компонента PageControl проектируемой формы

9 Страница TabSheet2 также оформляется аналогично форме Form2 в практической работе №9 (рис. 3). На ней размещается компонент StringGrid1 (текстовая таблица) из страницы Additional для размещения таблицы значений функции, два компонента Label1 и Label2, а также два компонента Edit1 и Edit2 для размещения максимального и минимального значений функции. Определить свойства этих компонентов как в практической работе № 9.

Рисунок 3 – Примерный вид второй страницы компонента PageControl

Проектируемой формы

10 На третью страницу формы поместить компонент Chart1 из палитры Additionall, который осуществляет рисование графиков функций. Выбрав в контекстном меню компонента Chart1 пункт Edit Chart…, зайти в редактор компонента Chart1. Перейти на вкладку Titles и ввести примерно такой заголовок: «График функции, построенный по таблице значений». Во вкладке Series добавить один график типа Line. Остальные параметры, такие как цвет линии, количество координатных отрезков, на которые разбивается ось и т. п., подобрать самостоятельно. Привязать компонент Chart1 ко всем четырем сторонам страницы компонента PageControl путем установки в true всех параметров свойства Anchors, установив предварительно необходимые размеры компонент Chart1 (точнее расстояния от краев компонента PageControl). Удобнее в этом случае воспользоваться свойством Align, определив его значение равным alClient (растянуть на всю клиентскую область). Привязка компонента к границам контейнера (которым является компонент PageControl) означает, что при изменении размеров контейнера (страницы) будут соответственно изменяться и размеры компонента Chart1. А поскольку сам контейнер (компонент PageControl), в свою очередь, привязан к границам формы, то при изменении размеров формы будут автоматически изменяться и размеры компонента PageControl, а значит, и размеры компонента Chart1. При этом каждое изменение размеров компонента Chart1 будет автоматически инициировать перерисовку содержащегося в этом компоненте графика. Страница TabSheet3 будет иметь вид, примерно такой, как показано на рис. 4.

Рисунок 4 - Примерный вид третьей страницы компонента PageControl

Проектируемой формы

11 Создать функцию f (x) для вычисления значения функции, соответствующей варианту задания.

12 Создать или скопировать с предыдущих практических работ обработчики событий OnExit и OnEnter для однострочных окон редактирования.

13 Написать обработчик события OnChange для компонента PageControl1. В нем сначала необходимо выполнить проверку исходных данных. Эту часть кода можно скопировать из обработчика Button1Click предыдущей практической работы, внеся в него небольшие коррективы: при передаче фокуса на компонент, в котором необходимо исправить (ввести) данные следует, кроме того, активизировать первую страницу компонента PageControl1. Вторую часть данного обработчика можно скопировать из обработчика FormShow предыдущей практической работы. В любом случае обработчик события OnChange должен иметь примерно следующий вид:

//---------------------------------------------------

Procedure TPR13_Ivanov_Form1.PageControl1Change

(Sender:TObject);

// Обработка события Изменение страницы в PageControl1.

// Ввод данных осуществлен. Выполняем расчеты.

Var H, Xn, Xk, A,X, Y,Ymax, Ymin, Xmax, Xmin:Real;

Var s, s1:string;

Begin

// Перед тем, как делать расчеты, необходимо проверить,

// все ли необходимые данные введены.

// Если какое-то данное не введено, выводим сообщение об ошибке

// и фокус переводим на поле ввода этого данного.

If (Edit1.Text='') Then

Begin

ShowMessage('Отсутствует значение A');

PageControl1.ActivePageIndex:=0;

Edit1.SetFocus;

End

Else If (Edit2.Text='') Then

Begin

ShowMessage('Отсутствует начальное значение X');

PageControl1.ActivePageIndex:=0;

Edit2.SetFocus;

End

Else If (Edit3.Text='') Then

Begin

ShowMessage('Отсутствует конечное значение X');

PageControl1.ActivePageIndex:=0;

Edit3.SetFocus;

End

Else If (Edit4.Text='') Then

Begin

ShowMessage('Отсутствует шаг H');

PageControl1.ActivePageIndex:=0;

Edit4.SetFocus;

End

Else if (StrToFloat(Edit3.Text))<=

(StrToFloat(Edit2.Text)) Then

Begin

ShowMessage('Начальное значение X больше '+

'конечного!');

PageControl1.ActivePageIndex:=0;

Edit3.SetFocus;

End

Else // Ошибок не было, можно делать расчеты.

Begin

// Размечаем таблицу для вывода значений (StringGrid).

StringGrid1.Cells[0,0]:=' X';

StringGrid1.Cells[1,0]:=' f(X)';

StringGrid1.GridLineWidth:=2;

StringGrid1.RowCount:=2;

// Введенные данные переносим в рабочие переменные.

A:=StrToFloat(Edit1.Text);

Xn:=StrToFloat(Edit2.Text);

Xk:=StrToFloat(Edit3.Text);

H:=StrToFloat(Edit4.Text);

X:=Xn;Ymax:=-MaxLong;Ymin:=MaxLong;

// Очищаем компонент Chart1.

// Там могут остаться данные от предыдущего просмотра.

Chart1.SeriesList. Series[0].Clear;

// Организуем цикл для вычисления значения в каждой точке.

While X<=Xk Do

Begin

// Вычисляем значение функции.

Y:=f(X, A);

// Определяем экстремумы.

If Y>Ymax Then Begin

Ymax:=Y;Xmax:=X; End;

If Y<Ymin Then Begin

Ymin:=Y;Xmin:=X; End;

// Заносим очередную строку в таблицу.

// Для преобразования вещественных данных

// в строку используем встроенную процедуру

// STR(w, d,s).

// w - общее количество знаков.

// d - количество знаков в дробной части.

// s - результат преобразования.

Str(X:6:2,s);

StringGrid1.Cells[0,StringGrid1.RowCount -1]:=s;

Str(y:10:4,s);

StringGrid1.Cells[1,StringGrid1.RowCount -1]:=s;

// Количество строк в таблице увеличиваем на 1.

StringGrid1.RowCount:=StringGrid1.RowCount + 1;

// Добавляем очередную точку в график функции.

Chart1.SeriesList. Series[0].AddXY(X, Y,'',clRed);

X:=X+H;

End;

// Поскольку в таблице одна строка лишняя, уберем ее.

StringGrid1.RowCount:=StringGrid1.RowCount-1;

// Выводим на экран мах и мin.

Str(Ymin:0:4,s);

Str(Xmin:0:3,s1);

Edit5.Text:='Y='+s+' при '+'X='+s1;

Str(Ymax:0:4,s);

Str(Xmax:0:3,s1);

Edit6.Text:='Y='+s+' при '+'X='+s1;

If (PageControl1.ActivePageIndex = 1) Then StringGrid1.SetFocus;

End;

End;

14 Создать обработчик OnActivate для формы:

//---------------------------------------------------

Procedure TPR13_Ivanov_Form1.FormActivate(Sender: TObject);

// Обработка события onActivate, которое наступает,

// когда форма становится активной.

// Сделаем в форме активной первую страницу и фокус

// передадим первому полю ввода, чтобы сразу же можно

// было бы начать ввод данных.

Begin

PageControl1.ActivePageIndex:=0;

Edit1.SetFocus;

End;

15 Нажав на клавиатуре клавишу F9, запустить приложение на выполнение. В случае необходимости выполнить отладку. Объяснить работу приложения.

16 Сохранить отлаженный проект в папке размещения проекта практической работы.

17 По результатам выполнения работы составить отчет.

III. Контрольные вопросы

1.  Какой специальный объект имеется в Delphi для графического представления числовых данных?

2.  Каким образом вызывается редактор диаграмм из Инспектора объектов?

3.  Какие вкладки имеет окно Редактора диаграмм?

4.  Как выбирается форма представления данных серии – тип диаграммы или графика?

5.  Какие методы объекта Series используются для создания графиков?

6.  Каким образом создаются многостраничные окна?

Согласовано

На заседании цикловой комиссии общеобразовательных дисциплин

Протокол №___ от «__» ________

Председатель _________________

Добавить комментарий


Защитный код
Обновить

По темам:

История Украины

Культурология

Высшая математика

Информатика

Охотоведение

Статистика

География

Военная наука

Английский язык

Генетика

Разное

Технологиеские темы

Украинский язык

Филология

Философия

Химия

Экология

Социология

Физическое воспитание

Растениевосдство

Педагогика

История

Психология

Религиоведение

Плодоводство

Экономические темы

Бухгалтерские темы

Маркетинг

Иностранные языки

Ветеринарная медицина

Технические темы

Землеустройство

Медицинские темы

Творчество

Лесное и парковое хозяйство