16222

Динамическое создание объектов на базе стандартных классов DELPHI

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа №11 Динамическое создание объектов на базе стандартных классов DELPHI Цель работы: Изучить принципы создания приложения без использования услуг инспектора объектов Постановка задачи: Разработать приложение реализующее вычисление определенного и...

Русский

2013-06-20

103 KB

5 чел.

Лабораторная работа №11

Динамическое создание объектов на базе стандартных классов DELPHI

Цель работы: Изучить принципы создания приложения без использования услуг инспектора объектов

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

Краткие теоретические сведения:

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

Текст программы:

unit UDisplayForm;

interface

uses

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

 Dialogs, Series, ExtCtrls, StdCtrls, TeEngine, TeeProcs, Chart, Buttons, UCalc;

const

 clMyWindow=$00BAEDEF;

type

 TEditData=record

   left, top, width, height: integer;

   text: string;

 end;

 type

 TLabelData=record

   left, top, width, height, fontSize: integer;

   text: string;

   fontStyle: TFontStyles;

 end;

type

 TForm1 = class(TForm)

   LabelStart: TLabel;

   Timer1: TTimer;

   Timer2: TTimer;

   procedure FormCreate(Sender: TObject);

   procedure SomeEditKeyPress(Sender: TObject; var Key: Char);

   procedure SpeedButton1Click(Sender: TObject);

   procedure SomeEditChange(Sender: TObject);

   procedure MethodSelectorClick(Sender: TObject);

   procedure CheckBox1Click(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure FormClick(Sender: TObject);

   function f2(x: Extended): Extended;

   procedure FormDestroy(Sender: TObject);

   procedure Timer1Timer(Sender: TObject);

   procedure Timer2Timer(Sender: TObject);

   procedure FormClick2(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

   Edit1: TEdit;

   Edit2: TEdit;

   Edit3: TEdit;

   Edit4: TEdit;

   MethodSelector: TRadioGroup;

   CheckBox1: TCheckBox;

   SpeedButton1: TSpeedButton;

   

   Label1: TLabel;

   Label2: TLabel;

   Label3: TLabel;

   Label4: TLabel;

   Label5: TLabel;

   Panel1: TPanel;

   FunctionFormula: TImage;

   Panel2: TPanel;

   SeriesPatterned: TAreaSeries;

   SeriesFunction: TLineSeries;

   DisplayChart: TChart;

 end;

var

 Form1: TForm1;

 e1, e2, e3: string;

 p1, p2, p3: integer;

 integ: TIntegral;

const

 dataEdit: array [1..4] of TEditData = ((left: 3; top: 278; width: 53; height: 19; text: '0'),

                                     (left: 98; top: 278; width: 53; height: 19; text: '1'),

                                     (left: 195; top: 278; width: 53; height: 19; text: '10'),

                                     (left: 20; top: 18; width: 338; height: 43; text: 'Some'));

 dataLabel: array[1..5] of TLabelData = ((left: 3; top: 264; width: 43; height: 13; fontSize: 8; text: 'Нижняя'; fontStyle: []),

                                           (left: 98; top: 264; width: 45; height: 13; fontSize: 8; text: 'Верхняя:'; fontStyle: []),

                                           (left: 195; top: 264; width: 29; height: 13; fontSize: 8; text: 'Шаги:'; fontStyle: []),

                                           (left: 3; top: 28; width: 100; height: 24; fontSize: 14; text: 'Интеграл:'; fontStyle: [fsBold]),

                                           (left: 0; top: 20; width: 19; height: 37; fontSize: 24; text: '='; fontStyle: []));

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

 ///

end;

//Edited

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

begin

 if Sender=Edit3 then

 begin

   p3:=Edit3.SelStart;

   exit;

 end;

 if (Sender=Edit2) then

   p2:=Edit2.SelStart;

 if (Sender=Edit1) then

   p1:=Edit1.SelStart;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

 Application.Terminate;

end;

procedure TForm1.SomeEditChange(Sender: TObject);

var r: real;

   s: string;

begin

 if Sender=Edit3 then

 begin

   try

     integ.N:=StrToInt((Sender as TEdit).Text);

     e3:=Edit3.Text;

   except

     on EConvertError do begin

                               Edit3.Text:=e3;

                               Edit3.SelStart:=p3;

                             end;

   end;

 end

 else if ((Sender=Edit1) or (Sender=Edit2)) then

 begin

   if true then

   begin

       try

         r:=StrToFloat((Sender as TEdit).Text);

         e1:=Edit1.Text;

         e2:=Edit2.Text;

       except

         on EConvertError do begin

                               if Sender=Edit1 then

                               begin

                                 (Sender as TEdit).Text:=e1;

                                 (Sender as TEdit).SelStart:=p1;

                               end

                               else if Sender=Edit2 then

                               begin

                                 (Sender as TEdit).Text:=e2;

                                 (Sender as TEdit).SelStart:=p2;

                               end;

                               exit;

                             end;

       end;

       if Sender=Edit2 then

       begin

         integ.B:=r;

         //Application.MessageBox(PChar(floattostr(integ.Res)),'');

         s:=FloatToStr(integ.B);

         FunctionFormula.Canvas.TextRect(Rect(0, 0, 155, 18), 87-FunctionFormula.Canvas.TextWidth(s) div 2, 2, s)

       end

       else

       begin

         integ.A:=r;

         s:=FloatToStr(integ.A);

         FunctionFormula.Canvas.TextRect(Rect(0, 58, 155, 74), 87-FunctionFormula.Canvas.TextWidth(s) div 2, 60, s);

       end;

   end

   else

   begin

       FunctionFormula.Canvas.Font.Size:=10;

       if Sender=Edit2 then

         FunctionFormula.Canvas.TextRect(Rect(0, 0, 155, 18), 87-FunctionFormula.Canvas.TextWidth('') div 2, 2, '')

       else

         FunctionFormula.Canvas.TextRect(Rect(0, 58, 155, 74), 87-FunctionFormula.Canvas.TextWidth('') div 2, 60, '');

   end;

 end;

 if integ.Res=0 then

   Edit4.Text:='Неверные данные!'

 else

   Edit4.Text:=FloatToStr(integ.Res);

end;

procedure TForm1.MethodSelectorClick(Sender: TObject);

begin

 integ.CalcMethod:=MethodSelector.ItemIndex;

 if integ.Res=0 then

   Edit4.Text:='Неверные данные!'

 else

   Edit4.Text:=FloatToStr(integ.Res);

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

 SeriesPatterned.AreaLinesPen.Visible:=(Sender as TCheckBox).Checked;

end;

procedure TForm1.FormShow(Sender: TObject);

begin

 //

end;

procedure TForm1.FormClick(Sender: TObject);

var b: TBitmap;

   ed: TEdit;

   l: TLabel;

   var i: integer;

begin

 Panel2:=TPanel.Create(Self);

 Panel2.Parent:=Self;

 Panel2.Left:=105;

 Panel2.Top:=0;

 Panel2.Width:=523;

 Panel2.Height:=83;

 Panel2.BevelOuter:=bvLowered;

 Panel2.BevelInner:=bvRaised;

 Panel1:=TPanel.Create(Self);

 Panel1.Parent:=Panel2;

 Panel1.Left:=160;

 Panel1.Top:=4;

 Panel1.Width:=358;

 Panel1.Height:=71;

 Panel1.Color:=clMyWindow;

 Panel1.BevelOuter:=bvNone;

 FunctionFormula:=TImage.Create(Self);

 FunctionFormula.Parent:=Panel2;

 FunctionFormula.Left:=4;

 FunctionFormula.Top:=4;

 for i:=1 to 4 do

 begin

   ed:=TEdit.Create(Self);

   ed.Parent:=Self;

   ed.Top:=dataEdit[i].top;

   ed.Left:=dataEdit[i].left;

   ed.Width:=dataEdit[i].width;

   ed.Height:=dataEdit[i].height;

   ed.Color:=clMyWindow;

   ed.Ctl3D:=false;

   ed.Text:=dataEdit[i].text;

   ed.OnChange:=SomeEditChange;

   case i of

     1: Edit1:=ed;

     2: Edit2:=ed;

     3: Edit3:=ed;

     4:begin

         ed.Parent:=Panel1;

         ed.Font.Size:=24;

         ed.BorderStyle:=bsNone;

         ed.OnChange:=nil;

         ed.ReadOnly:=true;

         Edit4:=ed;

       end;

   end;

 end;

 for i:=1 to 5 do

 begin

   l:=TLabel.Create(Self);

   l.Parent:=Self;

   l.Left:=dataLabel[i].left;

   l.Top:=dataLabel[i].top;

   l.Width:=dataLabel[i].width;

   l.Height:=dataLabel[i].height;

   l.Font.Size:=dataLabel[i].fontSize;

   l.Font.Style:=dataLabel[i].fontStyle;

   l.Caption:=dataLabel[i].text;

   case i of

   1: Label1:=l;

   2: Label2:=l;

   3: Label3:=l;

   4: Label4:=l;

   5:begin

       l.Parent:=Panel1;

       Label5:=l;

     end;

   end;

 end;

 MethodSelector:=TRadioGroup.Create(Self);

 MethodSelector.Parent:=Self;

 MethodSelector.Left:=3;

 MethodSelector.Top:=103;

 MethodSelector.Width:=257;

 MethodSelector.Height:=145;

 MethodSelector.Caption:='Метод вычислений: ';

 MethodSelector.Items.Add('Метод трапеций');

 MethodSelector.Items.Add('Метод левых прямоугольников');

 MethodSelector.Items.Add('Метод правых прямоугольников');

 MethodSelector.Items.Add('Метод средних прямоугольников');

 MethodSelector.ItemIndex:=0;

 MethodSelector.OnClick:=MethodSelectorClick;

 SpeedButton1:=TSpeedButton.Create(Self);

 SpeedButton1.Parent:=Self;

 SpeedButton1.Left:=5;

 SpeedButton1.Top:=310;

 SpeedButton1.Width:=241;

 SpeedButton1.Height:=31;

 SpeedButton1.Glyph.Canvas.CopyMode:=cmSrcCopy;

 SpeedButton1.Glyph.LoadFromResourceName(hInstance, 'EXIT');

 SpeedButton1.OnClick:=SpeedButton1Click;

 SpeedButton1.Flat:=true;

 

 SeriesPatterned:=TAreaSeries.Create(Self);

 //SeriesPatterned.ParentChart:=DisplayChart;

 SeriesPatterned.AreaBrush:=bsFDiagonal;

 SeriesPatterned.DrawArea:=true;

 SeriesPatterned.SeriesColor:=$00C8C8C8;

 SeriesPatterned.Title:='Вычисляемая площадь';

 SeriesPatterned.AreaLinesPen.Color:=$00E9E9E9;

 SeriesPatterned.AreaLinesPen.SmallDots:=true;

 SeriesPatterned.AreaLinesPen.Visible:=false;

 SeriesFunction:=TLineSeries.Create(Self);

 SeriesFunction.SeriesColor:=clBlack;

 SeriesFunction.LinePen.Width:=2;

 SeriesFunction.Title:='Функция';

 DisplayChart:=TChart.Create(Self);

 DisplayChart.Parent:=Self;

 DisplayChart.Left:=266;

 DisplayChart.Top:=88;

 DisplayChart.Width:=362;

 DisplayChart.Height:=258;

 DisplayChart.View3D:=false;

 DisplayChart.Legend.Alignment:=laBottom;

 DisplayChart.Legend.Color:=$00F0F0F0;

 DisplayChart.Legend.ColorWidth:=15;

 DisplayChart.Legend.ShadowColor:=clSilver;

 DisplayChart.Legend.ShadowSize:=1;

 DisplayChart.Title.Text.Clear;

 DisplayChart.Title.Text.Add('Графическое изображение');

 DisplayChart.Title.Font.Color:=clBlack;

 DisplayChart.Title.Font.Style:=[fsBold];

 DisplayChart.Title.Font.Size:=10;

 DisplayChart.Title.Font.Name:='Arial';

 DisplayChart.LeftAxis.AutomaticMinimum:=false;

 DisplayChart.LeftAxis.Minimum:=0;

 DisplayChart.Gradient.EndColor:=$0088DFE3;

 DisplayChart.Gradient.Visible:=true;

 DisplayChart.BackWall.Brush.Style:=bsClear;

 DisplayChart.MarginBottom:=8;

 DisplayChart.BevelOuter:=bvNone;

 DisplayChart.BorderStyle:=bsSingle;

 DisplayChart.AddSeries(SeriesPatterned);

 DisplayChart.AddSeries(SeriesFunction);

 CheckBox1:=TCheckBox.Create(Self);

 CheckBox1.Parent:=Self;

 CheckBox1.Left:=270;

 CheckBox1.Top:=327;

 CheckBox1.Width:=355;

 CheckBox1.Height:=17;

 CheckBox1.Color:=clWhite;

 CheckBox1.Caption:='Показать границы областей';

 CheckBox1.OnClick:=CheckBox1Click;

 b:=TBitmap.Create;

 b.LoadFromResourceName(hInstance, 'INTEGRAL');

 b.Transparent:=true;

 b.TransparentColor:=clWhite;

 FunctionFormula.Width:=b.Width;

 FunctionFormula.Height:=b.Height;

 FunctionFormula.Canvas.Brush.Color:=$00BAEDEF;

 FunctionFormula.Canvas.FillRect(Rect(0, 0, b.Width, b.Height));

 FunctionFormula.Canvas.StretchDraw(Rect(0, 0, b.Width-1, b.Height-1), b);

 b.Free;

 Panel1.Left:=FunctionFormula.Left+FunctionFormula.Width;

 Panel1.Height:=FunctionFormula.Height;

 Panel1.Top:=FunctionFormula.Top;

 integ:=TIntegral.Create;

 integ.Chart:=DisplayChart;

 SomeEditChange(Edit1);

 SomeEditChange(Edit2);

 Self.OnClick:=nil;

 LabelStart.Free;

 Timer2.Enabled:=true;

end;

function TForm1.f2(x: Extended): Extended;

begin

 Result:=x*x*3;

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

 Label1.Free;

 Label2.Free;

 Label3.Free;

 Label4.Free;

 Label5.Free;

 Edit1.Free;

 Edit2.Free;

 Edit3.Free;

 Edit4.Free;

 MethodSelector.Free;

 CheckBox1.Free;

 SpeedButton1.Free;

 Panel1.Free;

 FunctionFormula.Free;

 Panel2.Free;

 SeriesPatterned.Free;

 SeriesFunction.Free;

 DisplayChart.Free;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

 if Self.AlphaBlendValue<=10 then

 begin

   Timer1.Enabled:=false;

   FormClick(nil);

 end

 else  

   Self.AlphaBlendValue:=Self.AlphaBlendValue-8;

end;

procedure TForm1.Timer2Timer(Sender: TObject);

begin

 if Self.AlphaBlendValue=255 then

   Timer2.Enabled:=false

 else

   Self.AlphaBlendValue:=Self.AlphaBlendValue+8;

end;

procedure TForm1.FormClick2(Sender: TObject);

begin

 Timer1.Enabled:=true;

end;

end.

unit UCalc;

interface

uses Chart;

const funcCount=4;

type

    TValueChangedFunc=procedure (newValue: Extended);

    TF=function (x: Extended): Extended of object;

    TIntegral=class

     private

       FValueMin: Extended;//Нижняя граница

       FValueMax: Extended;//Верхняя граница

       FValueH: Extended; //Ширина шага

       FRes: Extended;    //Результат

       FValueN: Integer;  //Количество шагов

       FCalcMethod: Byte; //Номер выбранного способа подсчёта (0-трап.; 1-лев.прямоуг.; 2-прав.прямоуг.; 3-средн.прямоуг)

       FAutoRedraw: Boolean; //Перерисовывать при изменении хотя бы одного параметра

       FChart: TChart;

       FOnMinChanged: TValueChangedFunc;

       FOnMaxChanged: TValueChangedFunc;

       FOnNChanged: TValueChangedFunc;

       FOnHChanged: TValueChangedFunc;

       FF: TF;          //Функция подынтегральная

     protected

       procedure SetN(newN: integer); virtual;

       procedure SetH(newH: Extended); virtual;

       procedure SetMin(newMin: Extended); virtual;

       procedure SetMax(newMax: Extended); virtual;

       procedure SetCalcMethod(newMethod: byte); virtual;

       procedure SetChart(newChart: TChart); virtual;

       procedure SetF(newF: TF);

     public

       constructor Create();

       destructor Destroy; override;

       property A: Extended read FValueMin write SetMin;//Нижняя граница

       property B: Extended read FValueMax write SetMax;//Верхняя граница

       property N: integer read FValueN write SetN default 10;//Количество шагов

       property H: Extended read FValueH write SetH;//Ширина одного шага

       property CalcMethod: byte read FCalcMethod write SetCalcMethod default 0;   //Номер выбранного способа подсчёта (0-трап.; 1-лев.прямоуг.; 2-прав.прямоуг.; 3-средн.прямоуг)

       property Chart: TChart read FChart write SetChart;

       property AutoRedraw: boolean read FAutoRedraw write FAutoRedraw default true;//Перерисовывать при изменении хотя бы одного параметра

       property Res: Extended read FRes;

       //События (на изменение каждого из параметров)

       property OnMinChanged: TValueChangedFunc read FOnMinChanged write FOnMinChanged default nil;

       property OnMaxChanged: TValueChangedFunc read FOnMaxChanged write FOnMaxChanged default nil;

       property OnNChanged: TValueChangedFunc read FOnNChanged write FOnNChanged default nil;

       property OnHChanged: TValueChangedFunc read FOnHChanged write FOnHChanged default nil;

       //Подынтегральная функция

       function fDefault(x: Extended): Extended; virtual;

       //

       property f: TF read FF write SetF;

       //Функции подсчёта результата

       procedure ReCalc(); virtual;

       function calc_trapezium: Extended; virtual;

       function calc_rectangle_left: Extended; virtual;

       function calc_rectangle_right: Extended; virtual;

       function calc_rectangle_media: Extended; virtual;

       //Функции вывода информации в компонент TChart

       procedure Redraw(); virtual;

       procedure draw_f; virtual;

       procedure draw_trapezium; virtual;

       procedure draw_rectangle_left; virtual;

       procedure draw_rectangle_right; virtual;

       procedure draw_rectangle_media; virtual;

    end;

implementation

constructor TIntegral.Create();

begin

 inherited Create();

 FValueMax:=1;

 FValueMin:=0;

 FValueH:=0.1;

 FAutoRedraw:=true;

 FF:=fDefault;

 N:=10;

end;

destructor TIntegral.Destroy;

begin

 inherited Destroy;

end;

procedure TIntegral.SetN(newN: integer);

begin

 FValueN:=newN;

 if FValueN<1 then

   FValueN:=1;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnNChanged) then

   FOnNChanged(FValueN);

 if Assigned(FOnHChanged) then

   FOnHChanged(FValueH);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetH(newH: Extended);

begin

 FValueN:=round((FValueMax-FValueMin)/newH)+1;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnNChanged) then

   FOnNChanged(FValueN);

 if Assigned(FOnHChanged) then

   FOnHChanged(FValueH);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetMin(newMin: Extended);

begin

 FValueMin:=newMin;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnMinChanged) then

   FOnMinChanged(newMin);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetMax(newMax: Extended);

begin

 FValueMax:=newMax;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnMaxChanged) then

   FOnMaxChanged(newMax);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetChart(newChart: TChart);

begin

 FChart:=newChart;

 if (AutoRedraw) then

   Redraw();

end;

procedure TIntegral.SetCalcMethod(newMethod: byte);

begin

 if (newMethod in [0..3]) then

 begin

   FCalcMethod:=newMethod;

   if (AutoRedraw) then

     Redraw();

   ReCalc();

 end;

end;

procedure TIntegral.SetF(newF: TF);

begin

 if (@newF<>nil) then

 begin

   FF:=newF;

   ReCalc;

   Redraw;

 end;

end;

procedure TIntegral.ReCalc;

begin

   FRes:=0;

   if FValueMin<FValueMax then

   begin

     case FCalcMethod of

     0: FRes:=calc_trapezium();

     1: FRes:=calc_rectangle_left();

     2: FRes:=calc_rectangle_right();

     3: FRes:=calc_rectangle_media();

     end;

   end;

end;

function TIntegral.calc_trapezium: Extended;

var x: extended;

   i: integer;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to FValueN do

 begin

   Result:=Result+(f(x)+f(x+FValueH))/2*FValueH;

   x:=x+FValueH;

 end;

end;

function TIntegral.calc_rectangle_left:Extended;

var i:integer;

   x:extended;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to n do

   begin

     Result:=Result+FValueH*f(x);

     x:=x+FValueH;

   end;

end;

function TIntegral.calc_rectangle_right:Extended;

var i:integer;

   x:extended;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to n do

   begin

     Result:=Result+FValueH*f(x+FValueH);

     x:=x+FValueH;

   end;

end;

function TIntegral.calc_rectangle_media:Extended;

var i:integer;

   x:extended;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to n do

   begin

     Result:=Result+FValueH*f(x+FValueH/2);

     x:=x+FValueH;

   end;

end;

procedure TIntegral.Redraw;

begin

 if (Assigned(FChart) and (FValueMin<FValueMax)) then

 begin

   draw_f;

   case FCalcMethod of

   0: draw_trapezium();

   1: draw_rectangle_left();

   2: draw_rectangle_right();

   3: draw_rectangle_media();

   end;

 end

 else if Assigned(FChart) then

 begin

   Chart.Series[0].Clear;

   Chart.Series[1].Clear;

   Chart.LeftAxis.Maximum:=0;

 end;

end;

procedure TIntegral.draw_f;

var rightRange, x, h1: extended;

begin

 if Assigned(FChart) then

 begin

   FChart.Series[1].Clear;

   rightRange:=FValueMax+(FValueMax-FValueMin)*0.1;

   x:=FValueMin-(FValueMax-FValueMin)*0.1;

   h1:=(rightRange-x)/50;

   rightRange:=rightRange+h1;

   while x<=rightRange do

   begin

     FChart.Series[1].AddXY(x, f(x));

     x:=x+h1;

   end;

   Chart.LeftAxis.Maximum:=f(x)*1.05;

 end;

end;

procedure TIntegral.draw_trapezium;

var x: extended;

   i: integer;

begin

 if Assigned(FChart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=0 to FValueN do

   begin

     FChart.Series[0].AddXY(x, f(x));

     x:=x+FValueH;

   end;

 end;

end;

procedure TIntegral.draw_rectangle_left;

var x: extended;

   i: integer;

begin

 if Assigned(FChart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=1 to FValueN do

   begin

     FChart.Series[0].AddXY(x, f(x));

     FChart.Series[0].AddXY(x+FValueH, f(x));

     x:=x+FValueH;

   end;

 end;

end;

procedure TIntegral.draw_rectangle_right;

var x: extended;

   i: integer;

begin

 if Assigned(FChart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=1 to FValueN do

   begin

     FChart.Series[0].AddXY(x, f(x+FValueH));

     FChart.Series[0].AddXY(x+FValueH, f(x+FValueH));

     x:=x+FValueH;

   end;

 end;

end;

procedure TIntegral.draw_rectangle_media;

var x: extended;

   i: integer;

begin

 if Assigned(Chart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=1 to FValueN do

   begin

     Chart.Series[0].AddXY(x, f(x+FValueH/2));

     Chart.Series[0].AddXY(x+FValueH, f(x+FValueH/2));

     x:=x+FValueH;

   end;

 end;

end;

function TIntegral.fDefault(x: extended): extended;

begin

 Result:=Exp(sqr(x));

end;

end.

Результаты работы программы:

 

 

 

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