Графіки функцій можна будувати та переглядати різними способами. Нижче описано один із способів - пряме виведення на панель малювання на формі графіка наперед шданої функції однієї змінної без збереження результатів обчислень у файлі. Однак у діалозі можна визначати ліву та праву межі зміни значень аргумента, а також максимальне за модулем значення функції. Крім того, демонструються деякі корисні прийоми роботи з компонентами, розташованими на формі.
Приклад 1 . Створити форму для переглядання графіків, як показано на рис.2
Рис.2 Проект форми для переглядання графіків
На формі розміщені дві панелі. Верхня вирівняна до верхньої межі форми, а нижня - до нижньої. Висоту панелей можна задати під час проектування або програмне під час виконання. На малюнку для прикладу спроектована лише верхня панель. Нижня - ідентична.
На кожній панелі повинно бути: зверху - підпис, посередині - панель для малювання PaintBox, знизу -три поля редакторів для введення чисел і відповідні підписи біля цих полів. У наведеному нижче роздруку тексту програми зверніть увагу на те, як вирівнюються елементи на панелі у разі зміни її розмірів. Отже, під час проектування форми не є дуже важливим місце розташування елементів, однак їхні розміри зафіксовані і не змінюються під час виконання програми, хоча і їх також можна було б змінювати.
Сам графік функції з'являється на панелі PaintBox внаслідок подвійного клацання на ній мишкою.
Ліву та праву межі вводять як дійсні числа у прийнятому в Delphi форматі. Вони означають інтервал за X, на якому відображається графік функції. Зазначимо, що, вводячи дробову частину числа, її треба відділяти
комою, а не крапкою. Те саме стосується максимального за модулем види
мого значення функції. Якщо фактичне значення функції його перевищує
то графіка просто не буде видно. '
Під час роботи форма програми може виглядати, наприклад, як на рис 5.19.

Рис.5.19. Виконання програми переглядання графіків.
Наведений роздрук відображає лише половину завдання - малює графік тільки першої функції на верхній панелі. Доповніть форму і програму так, щоб можна було малювати і другий графік на нижній панелі. Це виконують майже ідентично, змінюються лише імена компонент та імена опрацювання їхніх подій.
Працюючи з готовою програмою, зверніть увагу на те, що у разі зміни розмірів вікна графік зникає з панелі. Те ж саме відбувається у випадку мінімізації вікна та його наступного відновлення. Отже, після зміни стану вікна треба знову двічі клацнути мишкою на панелі малювання для повторного відображення графіка.
Приклад реалізації завдання:
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForml= class(TForm)
Panel1: TPanel;
Panel2: TPanel;
LabelFnl: TLabel;
LabelFn2: TLabel;
LeftFl: TLabel;
RightFl: TLabel;
EditLl: TEdit;
EditRl: TEdit;
Lmaxl: TLabel;
EditMaxl: TEdit;
PaintBoxl: TPaintBox;
procedure PanellResize(Sender: TObject);
procedure EditLlExit(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure EditRlExit(Sender: TObject);
procedure EditMaxlExit(Sender: TObject);
procedure PaintBoxlDblClick(Sender: TObject);
private
{Private declarations}
public
{Public declarations}
afl, bfl, af2, bf 2: real ; //лiвi тa npaвi мeжi
/ /iінтервалів
AbsMaxFl, AbsMaxF2: real; //максимальні зa модулем
//значення
rdafl, rdbfl, rdaf2, rdbf2: boolean; //oзнаки ввeдeння
rdAbsMaxFl, rdAbsMaxF2: boolean;
end;
var
Forml: TForml;
implementation
{$R*.DFM} .
//cталi для повідомлень у випадку помилок під час введення
//чисел
const
err = 'nомилкa!';
txtl = 'Hеправильно задана ліва межа' ;
txtr ='Hеправильно задана ліва межа' ;
Модуль програми:
txtm = 'Неправильно задане максимальне значення'; //опишемо функції, графіки яких будуватимемо Function Fl(x: real): real; begin try
Result:= x*x*Sin(l/x) except
on EZeroDivide do Result:=0 end; end;
Function F2(x: real): real; begin
Result:=Sin(x/Ln(Abs(x)+1.1)); end;
procedure TForml.FormCreate(Sender: TObject); {у разі створення форми присвоюємо початкові значення} begin
// спочатку значення ще не введені
rdafl:=false; rdbf 1: =false,- rdaf2:=false; rdbf2:=false; rdAbsMaxFl:=false; rdAbsMaxF2:=false; end;
procedure TForml.PanellResize(Sender: TObject); //ця процедура виконується у випадку будь-якої зміни
//розмірів першої (верхньої) панелі begin
//Усі елементи в нижній частині панелі вирівнюються до ї
//нижньої межі //однаково - за відкиданням висоти і ще 10 (властивість
//Тор) //Крім того, елементи вирівнюються за шириною (Left),
//однак по-різному
//підпис Ліва межа вирівнюється до лівого боку панелі With LeftFl do begin
Left:=20; Top:=Pane11.ClientHeight-Height-10; end; //підпис Права межа повинен бути лівіше від поля введення
//такого числа With RightFl do begin
Left:=Panel1.ClientWidth-Width-EditRl.Width-10; Top:=Pane11.ClientHeight-Height-10 ; end; //поле редактора для введення лівої межі повинне бути
//правіше від підпису With EditLl do begin
Left:=20+LeftFl.Width;
Top:=Panell.ClientHeight-Height-10; end; //поле редактора для введення правої межі вирівнюється до
//правого боку панелі With EditRl do begin
Left:=Panell.ClientWidth-Width-10;
Top:=Panell.ClientHeight-Height-10; end;
//підпис "max(fl)=" вирівнюється до середини With Lmaxl do begin
Left: = (Panel1.ClientWidth-Width-EditMaxl.Width)div2 ;
Top:=Panell.ClientHeight-Height-10; end; //поле редактора для введення максимального значення
//також вирівнюється до середини With EditMaxl do begin
Left:=(Panel1.ClientWidth-Width+Lmaxl.Width)div2;
Top:=Panell.ClientHeight-Height-10; end;
//панель для малювання PaintBoxl вирівнюється до середини With PaintBoxl do begin
Left:=3; Top:=LabelFnl.Height+5;
Width:=Panell.ClientWidth-6;
Height:=EditLl.Top-Top-5;
end;
procedure TForml.EditLlExit(Sender: TObject);
(метод виконується у разі втрати фокуса редактором EditLl •
введення лівої межі} begin try
af1:=StrToFloat(EditLl.Text); rdaf1:=true; (якщо ввели правильне значення} except
on EConvertError do (неправильний формат числа} begin rdaf1:=false;
Application.MessageBox(txtl, err,
mb_IconExclamation+mb_Ok); end ; end; end;
procedure TForml.EditRlExit(Sender: TObject); (метод виконується у разі втрати фокуса редактором EditRl
введення правої межі}
begin
tru
bfl:=StrToFloat(EditRl.Text); rdbf1:=true; (якщо ввели правильне значення} except
on EConvertError do (неправильний формат числа} begin rdbf1:=false;
Application.MessageBox(txtr, err,
mb_IconExclamation+mb_Ok); end; end; end;
procedure TForml.EditMaxlExit(Sender: TObject); (метод виконується у разі втрати фокуса редактором EditMaxl
- максимального значення} begin try
AbsMaxFl:=StrToFloat(EditMaxl.Text); rdAbsMaxFl:=true; (якщо ввели правильне значення} except
on EConvertError do (неправильний формат числа} begin rdAbsMaxFl:=false;
Applіcat ion.MessageBox(txtm, err,
mb_IconExclamation+mb_Ok); end; end; end;
procedure TForml.PaintBoxlDblClick(Sender: TObject); var
mky, mkx: real; //коефіцієнти для переобчислення точек
//графіка
х, у: real; //поточні значення
рх, ру: integer; //значення, переобчислені в пікселчх і: integer; begin
//Подвійним клацанням мишкою на панелі малюємо графік
//функці ї //спочатку примусово переміщуємо фокус уведення, щоб
//викликати подію OnExit для останнього введеного //значення Panell. Set Focus; //для панелі Panel 1 задати TabStop-м
//в інспекторі об'єктів if notfrdafl and rdbfl and rdAbsMaxFl) then Exit; //не
//все задано
//Графік повинен поміститися на панелі PaintBoxl //спочатку очистимо панель PaintBoxl, де буде графік
with PaintBoxl do begin
Canvas.Brush.Color:=clWhite; Canvas.FillRect(ClientRect); end; //масштабний коефіцієнт за Y - кількість пікселів на
//одиницю значення функції
mky:^PaintBoxl.ClientHeight/(2*Abs(AbsMaxFl)); //по горизонталі розтягнемо графік на ширину PaintBoxl, //залишивши на краях по 5 пікселів //крок зміни функції за X на 1 піксель: mkx:=(bfl-afl)/(PaintBoxl.ClientWidth-10); if mkx<0 then mkx:=Abs(rakx); (якщо переплутали межі} x:=afl; y:=Fl(x);
//координати в точках площини (пікселях): рх:=5; ру:=PaintBoxl.ClientHeight div2-round(y*mky) ; //перша точка графіка: PaintBoxl.Canvas.MoveTo(рх, ру); //графік у циклі: for i:=l to PaintBoxl.ClientWidth-10 do (через кожен
піксель за X} begin
х: =af l-t-i*mkx; y:=Fl(x);
px:=5+i; ру:^PaintBoxl.ClientHeight div2-round(y*mky); PaintBoxl.Canvas.LineTo(px, py); end; end; end.
Приклад 2 (для самостійного виконання). Додайте до графіка функції, який виводиться, зображення осей координат (бажано іншим кольором). По краях осей виведіть підписи зі значеннями xmin, xmax, ymin, углах. Спробуйте по осі X вивести позначки (10-15 штук), також підписані відповідними значеннями аргументу.
Приклад 3 (для самостійного виконання). Виконати автоматичне масштабування значень функції (по осі Y) так, щоб завжди були видимими найбільші та найменші значення у випадку побудови графіка. Для цього можна забрати з форми підпис та поле редактора для введення модуля максимального значення. Запропонуйте один чи декілька методів обчислення найбільшого значення функції.
Приклад 4(для самостійного виконання). Реалізуйте можливість перегляду графіків різних функцій із заздалегідь складеного переліку. Для цього доповніть панель компонентою TListBox, за допомогою якої можна вибирати погрібну функцію. Графіки різних функцій виводи пі різними кольрами на ту саму панель, тобто графіки будуть накладатися. Перебачимо можливість очищення поля, на якому зображені графіки.
Список рекомендованої літератури
1. Данткманн Джефф, Мишел Джим, Тейлор Доп. Программирование в среде Delphi. ДиаСофтЛтд., 1995. - Київ.
2. Дарахвелидзе П.Г., Марков Е.П. Delphi -Среда визуального программирования. - BHV- Санкт-Петербург, 1996.
3. Джон Матчо, Дэвид Р. Фолкнер. Delphi. -М.: БИНОМ, 1995.
5. Конопка Рэй. Создание оригинальны хкомпонент в среде Delphi. - ДиаСофт Лтд.,
1996. -Київ.
6. Хоменко А.Д.і др Delphi 7/Под общей ред. А.Д.Хоменко.-СПб:”БХВ-Петербурх”,2004.
7. Фаронов В.В. Система программитования Delphi-СПб:”БХВ-Петербурх”.2004.