32. Напишите программу, которая в отдельном окне строит гра фик функции. Функция задается таблицей, первая строка кото рой содержит значения аргументов, вторая — соответствующие
значения функции. Рекомендуемый вид главной формы приве ден на рис. 1.28. Вид формы, на поверхности которой вычерчи вается график, представлен на рис. 1.29.

Рис. 1.27. Круговая диаграмма, отражающая товарооборот книжного магазина

Рис. 1.28. Главная форма приложения График

Рис. 1.29. Форма, на поверхности которой будет построен график

// Модуль главной формы приложенияunit grafikOl;interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;type
TForml = class(TForm)
StringGridl: TStringGrid;
Labell: TLabel;
Buttonl: TButton;
CheckBoxl: TCheckBox;
procedure ButtonlClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations )
public •
/ Public declarations )
end;var
Forml: TForml;// Процедуру gr вызывает процедура обработки
// события onPaint для формы Form2, на поверхности
// которой вычерчивается график и которая
// находится в другом модуле. Поэтому объявление
// функции надо поместить в раздел Interface.
procedure gr; // чтобы процедуру можно было вызвать
// из другого модуля
implementationuses grafikO2;{$R *.dfm}/ Во время создания формы установить
свойства компонента StringGrid:
FixedRows := 0;
RowCount := 2;
Opt ions. goEdit ing := True;
Options. goTab := True;
const
COLCOUNT = 15;
var
// аргументы и значения функции
х: array[1..COLCOUNT] of real;
у: array[1..COLCOUNT] of real;// строит график по содержимому массивов х,у
procedure gr;
var
i: integer; xl,x2:real; // границы изменения аргумента функции
yl,y2:real; // границы изменения значения функции
l,b:integer; // левый нижний угол области вывода графика
w,h: integer; // ширина и высота области вывода графика
mx,my:real; // масштаб по осям X и Y
хО,уО:integer; // точка пересечения координатных осей
рх,ру: integer; // координаты точки графика на поверхности
// формы
np: integer; // кол-во точек графикаbegin
Form2.Canvas.Rectangle(0,0,Form2.ClientWidth,Form2.ClientHeight);
// область вывода графика
l:=10; // X — координата левого верхнего угла
b:=Form2.ClientHeight-20; //Y — координата левого нижнего угла
h:=Form2.ClientHeight-40; // высота
w:=Form2.Width-40; // ширина
// определим границы изменения аргумента
// и количество точек (элементы массива X
// должны образовывать возрастающую последовательность)
xl:=x[l];
i:=l;
while (x[i+l] > x[i]) and (i < COLCOUNT) do
1.— i+l; x2:= x[i]; //x[COLCOUNT-1];
np:=i; // количество точек
if np < 2 then begin
ShowMessage('Количество точек графика не может быть меньше
двух');
exit;
end;// найдем максимальное и минимальное значения функции
yl:=0; //у[1]; // минимум
у2:=0; //у[1]; // максимум
for i: =1 to np do
begin
if y[i] < yl then yl:=y[i];
if y[i] > y2 then y2:=y[i];
end;// вычислим масштаб
my:=h/abs(y2-yl); // масштаб по оси Y
mx:=w/abs(x2-xl); // масштаб по оси X// точка пересечения координатных осей
xO:=l+Abs(Round(xl*mx));
yO:=b-Abs(Round(yl*my));with form2.Canvas do
begin
MoveTo(xO,b);LineTo(xO,b-h); // ось Y
MoveTo(l,yO) ;LineTo(l+w,yO) ; // ось X TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
TextOut(1+2,b+2,FloatToStrF(yl,ffGeneral,6,3})г // построить график
for i :=1 to np do
begin
px := xO+Round(x[i]*mx);
py := yO-Round(y[i]*my); Form2.Canvas.Pen.Color := clRed;
Rectangle(px-2,py-2,px+2,py+2) ; // маркер if Forml.CheckBoxl.Checked then
// соединительная линия
if i = 1
then MoveTo(px,py)
else LineTo(px,py);
Form2.Canvas.Pen.Color := clBlack; // значение функции и аргумент
TextOut(px-5,py-15,FloatToStr(y[i]) ) ;
TextOut(px-5,yO+2, FloatToStr(x[i]));
MoveTo(px,py) ; // вернуть перо в точку рх, ру,
// т. к. TextOut меняет положение пера
end;
end;
end;procedure TForml.FormCreate(Sender: TObject);
var
i: integer;
begin
StringGridl.ColCount := COLCOUNT;
StringGridl.Cells[0,0] := ' X1;
StringGridl.Cells[0,1] := ' Y1;
// отладка: заполним таблицу
for i:=l to COLCOUNT do
begin
StringGridl.Cells[i,0] := IntToStr(i-1);
StringGridl.Cells[i, 1] := IntToStr(i-1);
end;
end;// щелчок на кнопке Построить
procedure TForml.ButtonlClick(Sender: TObject);
var
i: integer;
begin
// перепишем содержимое таблицы в массивы
// аргументов и значений функции
for i:=l to COLCOUNT-1 do
begin
x[i] := StrToFloat(Forml.StringGridl.Cells[i,0]);
y[i] := StrToFloat(Forml.StringGridl.Cells[i,l]);
end; // функцию вывода графика вызывает процедура
// обработки события OnPaint для Form2
if not Form2.Showing
then Form2.Show // отобразить окно Form2
else Form2.Repaint;
end;end.
// Модуль формы, на поверхности которой
// вычерчивается график unit grafikO2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, grafikOl; // *** эта ссылка вставлена вручную!type
TForm2 = class(TForml
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: T?>bject);
private
{ Private declarations }
public
{ Public declarations )
end;var
Form2: TForm2;implementation{$R *.dfm}// событиеОпРаint происходит при первом появлении
// окна на экране и тогда, когда окно
// или его часть надо перерисовать
procedure TForm2.FormPaint(Sender: TObject);
begin
gr; // вывести график
end;// событие OnResize происходит, если
// пользователь изменил размер окна
procedure TForm2.FormResize{Sender: TObject);
begin
gr; // вывести график
end;end.