Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
реализации этого метода.
Но сначала вкратце рассмотрим компонент TChart, который мы будем использовать в программе для вывода графиков. Основным свойством компо-
нента является Series – наборы данных (серии), на основе которых и строятся графики или диаграммы. Если дважды щелкнуть по компоненту, размещенному на форме, то мы попадем в редактор серий, рис. 6.88.
Рис. 6.88. Редактор серий
Существуют разные типы Series для построения разных типов графиков или диаграмм, например Line series – для построения линий (графиков),
Pie series – для построения круговых диаграмм и т.д. Выберите тип серии
Line series. В инспекторе объектов появится объект ChartLineSeries1
типа TLineSeries.
Рис. 6.89. Создание объекта типа TLineSeries
Создать программно объект типа TLineSeries можно оператором
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
Chart1LineSeries1:= TLineSeries.Create(Chart1);
Для добавления серии в TChart существует метод
procedure AddSeries(ASeries: TBasicChartSeries);
Добавление точек в объект типа TLineSeries производится с помощью
функции
function AddXY(X, Y: Double): Integer;
Свойство ShowPoints: boolean позволяет показывать или не показы-
вать точки на графике.
Свойство SeriesColor: TColor позволяет указать цвет линии.
Чтобы вывести график функции, например, sin(x) можно написать сле-
дующую процедуру:
procedure Plot_sin; var
i, n: integer; Chart1LineSeries1: TLineSeries;
begin
n:= 100;
Chart1LineSeries1:= TLineSeries.Create(Chart1); Chart1LineSeries1.SeriesColor:= clRed; Chart1LineSeries1.ShowPoints:= false; Chart1.AddSeries(Chart1LineSeries1); Chart1.Title.Visible:= true; Chart1.Title.Text.Text:= 'График функции sin(x)'; for i:= 0 to n - 1 do
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
Chart1LineSeries1.AddXY(i*Pi*0.02,
sin(i*Pi*0.02));
end;
Итак, давайте начнем реализацию метода наименьших квадратов. Создайте новый проект, поместите на форму компоненты TMainMenu, TOpenDialog и TChart, как показано на рис. 6.90. Меню программы должно состоять из сле-
дующих пунктов:
Файл
Определение коэффициентов полинома
Графики
В свою очередь, меню "Файл" должен состоять из подпунктов "Открыть" и
"Выход". Меню "Определение коэффициентов полинома" должна содержать пункт "Вычислить". И меню "Графики" должен содержать пункты "График экспериментальных точек" и "Подобранная кривая", рис.6.91.
Присвойте имена меню в программе как показано на рис. 6.92.
Вставим в пункты меню рядом с их текстами пиктограммы. Для этого по-
местите на форму компонент TImageList и заполните его подходящими значками. В свойстве Images MainMenu1 укажите имя TImageList. Затем для каждого пункта меню укажите соответствующие индексы в свойствах
ImageIndex.
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
Рис. 6.90. Форма приложения
Рис. 6.91. Создание меню программы с помощью редактора меню
Рис. 6.92. Имена меню в программе
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
Код программы:
unit unit1;
{$mode objfpc}{$H+} interface
uses
Classes, SysUtils, LResources, Forms, Controls,
Graphics, Dialogs, ExtCtrls, TAGraph, TASeries,
Buttons, StdCtrls, Menus, FileUtil; type
{ TForm1 }
TForm1 = class(TForm)
Chart1: TChart;
MainMenu1: TMainMenu;
MCalculate: TMenuItem;
Menu_File: TMenuItem;
Menu_Calculate: TMenuItem;
Menu_Grafic: TMenuItem;
Menu_Open: TMenuItem;
Menu_Exit: TMenuItem;
Menu_Exp: TMenuItem;
Menu_Curve: TMenuItem;
OpenDialog1: TOpenDialog;
procedure FormCreate(Sender: TObject); procedure Menu_ExpClick(Sender: TObject); procedure Menu_CurveClick(Sender: TObject); procedure Menu_OpenClick(Sender: TObject); procedure MCalculateClick(Sender: TObject);
private
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
{private declarations } public
{public declarations } end;
//Процедура решения СЛАУ методом Гаусса
procedure gauss(vector: array of real; b: array of real;
var x: array of real; n: byte;
var solve: byte);
//n - размерность системы,
//solve=0, если решение единственное,
//solve=1, если система не имеет решения,
//solve=2, если система имеет бесконечное количество решений,
//Функция, подбираемая методом
//наименьших квадратов
function fx(t: real): real;
// Функция возведения в степень
function stepen( x: real; n: byte): real;
var
Form1: TForm1; n: byte;
x1, y1: real;
x, y, z: array of real; Fname: string;
implementation
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
function fx(t: real): real; begin
Result:= z[0] + z[1]*t + z[2]*t*t + z[3]*t*t*t + z[4]*sqr(sqr(t));
end;
function stepen( x: real; n: byte): real; var
i: integer; begin
Result:= 1;
for i:= 1 to n do Result:= Result*x;
end;
// Реализация метода Гаусса
procedure Gauss(vector: array of real; b: array of real; var x: array of real; n: byte;
var solve: byte);
var
a: array of array of real; { матрица коэффициентов системы,
двумерный динамический массив}
i, j, k, p, r: integer;
m, s, t: real;
begin
SetLength(a, n, n); // установка фактического размера массива
{ Преобразование одномерного массива в двумерный }
k:=0;
for i:=0 to n-1 do
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
for j:=0 to n-1 do begin
a[i, j]:= vector[k]; k:=k+1;
end;
for k:=0 to n-2 do begin
for i:=k+1 to n-1 do begin
if (a[k, k]=0) then begin
{ перестановка уравнений}
p:=k; // в алгоритме используется буква l, но она похожа на 1
// Поэтому используем идентификатор p for r:=i to n-1 do
begin
if abs(a[r, k]) > abs(a[p, k]) then p:=r; end;
if p<>k then begin
for j:= k to n-1 do begin
t:=a[k, j];
a[k, j]:=a[p, j]; a[p, j]:=t;
end;
t:=b[k];
b[k]:=b[p];
b[p]:=t;
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
end;
end; // конец блока перестановки уравнений m:=a[i,k]/a[k, k];
a[i, k]:=0;
for j:=k+1 to n-1 do begin
a[i, j]:=a[i, j]-m*a[k, j]; end;
b[i]:= b[i]-m*b[k]; end;
end;
{Проверка существования решения} if a[n-1,n-1] <> 0 then begin
x[n-1]:=b[n-1]/a[n-1,n-1]; for i:=n-2 downto 0 do begin
s:=0;
for j:=i+1 to n-1 do begin
s:=s-a[i, j]*x[j]; end;
x[i]:=(b[i] + s)/a[i, i]; end;
solve:= 0; end
else
if b[n-1] = 0 then begin
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
MessageDlg('Система имеет бесконечное ' +
'количество решений', mtInformation,[mbOK], 0); solve:= 2;
end else begin
MessageDlg('Система не имеет решений',
mtInformation,[mbOK], 0);
solve:= 1; end;
{ освобождение памяти,
распределенной для динамического массива }
a:=nil;
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject); begin
Chart1.Title.Text.Text:='Метод наименьших квадратов'; MCalculate.Enabled:= false;
Menu_Exp.Enabled:= false;
Menu_Curve.Enabled:= false;
end;
procedure TForm1.Menu_ExpClick(Sender: TObject);
{Процедура вывода графика экспериментальных
данных по точкам}
var