Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornye_OOP.doc
Скачиваний:
17
Добавлен:
11.03.2015
Размер:
1.04 Mб
Скачать
  1. Тема, цель работы, вариант задания.

  2. Описание разработанного компонента.

  3. Исходный текст модулей программы.

Пример. Создать компонент - потомок TButton, выполняющий разложение заданной функции, вычисляемой при помощи события OnCalculate, в ряд Тейлора. Компонент должен содержать следующие свойства: x:TEdit - абсцисса точки разложения; XMin, XMax, StepX:TEdit - диапазон изменения аргумента и шаг; Count:TSpinEdit - количество учитываемых производных; Grid:TDrawGrid - компонент для вывода результатов работы.

Выполнение.

  1. Текст программы компонента TaylorFunc:

unit TaylorFunc;

interface

uses

Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs,

StdCtrls, Grids, Spin, Math, Chart;

type

TCalc = procedure(Sender: TObject; X: Extended; var Res: Extended) of object;

TTaylorFunc = class(TButton)

private

Step: Real;

FX: TEdit;

FXMin: TEdit;

FXMax: TEdit;

FStepX: TEdit;

FCount: TSpinEdit;

FGrid: TStringGrid;

FChart: TChart;

FOnCalculate: TCalc;

procedure SetX(Value: TEdit);

procedure SetXMin(Value: TEdit);

procedure SetXMax(Value: TEdit);

procedure SetStepX(Value: TEdit);

procedure SetChart(Value: TChart);

procedure SetCount(Value: TSpinEdit);

procedure SetGrid(Value: TStringGrid);

procedure Calculate;

function Derivative(X: Extended; N: Byte): Extended;

protected

// новый обработчик

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

procedure Notification(AComponent: TComponent; Operation: TOperation);

override; // перекрываем Notification

public

// перекрываем стандартный Create

constructor Create(AOwner: TComponent); override;

procedure Click; override; // перекрываем стандартную процедуру Click

published

property Width default 85;

property X: TEdit read FX write SetX;

property XMin: TEdit read FXMin write SetXMin;

property XMax: TEdit read FXMax write SetXMax;

property StepX: TEdit read FStepX write SetStepX;

property Chart: TChart read FChart write SetChart;

property Grid: TStringGrid read FGrid write SetGrid;

property Count: TSpinEdit read FCount write SetCount;

property OnCalculate: TCalc read FOnCalculate write FOnCalculate;

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents('MySamples', [TTaylorFunc]);

end;

constructor TTaylorFunc.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

Width := 85;

end;

procedure TTaylorFunc.SetX(Value: TEdit);

begin

if Value <> FX then

begin

FX := Value;

if Value <> nil then

begin

FX.OnKeyPress := MyKeyPress;

Value.FreeNotification(Self);

end;

end;

end;

procedure TTaylorFunc.SetXMin(Value: TEdit);

begin

if Value <> FXMin then

begin

FXMin := Value;

if Value <> nil then

begin

FXMin.OnKeyPress := MyKeyPress;

Value.FreeNotification(Self);

end;

end;

end;

procedure TTaylorFunc.SetXMax(Value: TEdit);

begin

if Value <> FXMax then

begin

FXmax := Value;

if Value <> nil then

begin

FXMax.OnKeyPress := MyKeyPress;

Value.FreeNotification(Self);

end;

end;

end;

procedure TTaylorFunc.SetStepX(Value: TEdit);

begin

if Value <> FStepX then

begin

FStepX := Value;

if Value <> nil then

begin

FStepX.OnKeyPress := MyKeyPress;

Value.FreeNotification(Self);

end;

end;

end;

procedure TTaylorFunc.SetCount(Value: TSpinEdit);

begin

if Value <> FCount then

begin

FCount := Value;

if Value <> nil then

begin

FCount.OnKeyPress := MyKeyPress;

Value.FreeNotification(Self);

end;

end;

end;

procedure TTaylorFunc.SetGrid(Value: TStringGrid);

begin

if Value <> FGrid then

begin

FGrid := Value;

if Value <> nil then Value.FreeNotification(Self);

end;

end;

procedure TTaylorFunc.SetChart(Value: TChart);

begin

if Value <> FChart then

begin

FChart := Value;

if Value <> nil then Value.FreeNotification(Self);

end;

end;

function Fact(const n: Cardinal): Extended;

var

i: Cardinal;

x: Extended;

begin

x := 1;

try

for i := n downto 1 do x := x * i;

Result := x

except

raise;

end

end;

function TTaylorFunc.Derivative(X: Extended; N: Byte): Extended;

var

Res1: Extended;

Res2: Extended;

begin

if N = 0 then OnCalculate(Self, X, Result)

else

begin

Res1 := Derivative(X + Step, N - 1);

Res2 := Derivative(X - Step, N - 1);

Result := (Res1 - Res2) / (2 * Step);

end;

end;

procedure TTaylorFunc.Calculate;

var

i, j, n, k: Word;

X, X0: Extended;

Res: Extended;

begin

try

Step := StrToFloat(FStepX.Text);

X0 := StrToFloat(FX.Text);

n := round((StrToFloat(FXMax.Text) - StrToFloat(FXMin.Text)) / Step);

k := Count.Value;

X := StrToFloat(FXMin.Text);

FGrid.Rows[0].Strings[0] := 'X';

FGrid.Rows[0].Strings[1] := 'Y';

FGrid.RowCount := n;

FChart.SeriesList.Series[0].Clear;

FChart.UndoZoom;

for i := 1 to n do

begin

Res := 0;

for j := 0 to k do

Res := Res + Derivative(X0, j) * IntPower((X - X0), j) / Fact(j);

FGrid.Rows[i].Strings[0] := FloatToStr(X);

FGrid.Rows[i].Strings[1] := FloatToStr(Res);

FChart.SeriesList.Series[0].AddXY(X, Res);

X := X + Step;

end;

except

on EConvertError do MessageDlg('Неверный формат данных!', mtWarning, [mbOk], 0);

on EOverflow do MessageDlg('Переполнение разрядной сетки!', mtWarning, [mbOk], 0)

else raise

end;

end;

procedure TTaylorFunc.Click;

begin

inherited;

try

if Assigned(FOnCalculate) and Assigned(FX) and Assigned(FXMin) and

Assigned(FXMax) and Assigned(FStepX) and Assigned(FCount) and Assigned(FGrid)

then

if (StrToFloat(FXMin.Text) > StrToFloat(FXMax.Text)) then

MessageDlg('Введите значение X максимум больше чем X минимум!',

mtWarning, [mbOk], 0)

else

if StrToFloat(FStepX.Text) <= 0 then

MessageDlg('Введите положительный шаг!', mtWarning, [mbOk], 0)

else Calculate

else

begin

FGrid.Cols[0].Clear;

FGrid.Cols[1].Clear;

DataX.Clear;

DataY.Clear;

FGrid.refresh;

end;

except

on EConvertError do

MessageDlg('Неверный формат данных!', mtWarning, [mbOk], 0);

end;

end;

procedure TTaylorFunc.Notification(AComponent: TComponent; Operation: TOperation);

begin

inherited;

if Operation = opRemove then

begin

if AComponent = FX then FX := nil;

if AComponent = FXMin then FXMin := nil;

if AComponent = FXMax then FXMax := nil;

if AComponent = FGrid then FGrid := nil;

if AComponent = FStepX then FStepX := nil;

if AComponent = FCount then FCount := nil;

end;

end;

procedure TTaylorFunc.MyKeyPress(Sender: TObject; var Key: Char);

begin

if not (Key in ['0'..'9', ',', '-', #8, #13]) then Key := #0;

end;

end.

  1. Тестовая программа

unit TestComp;

interface

uses

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

StdCtrls, TaylorFunc, Spin, Buttons, TeEngine, Series, ExtCtrls,

TeeProcs, Chart, Grids;

type

TForm1 = class(TForm)

Taylor: TTaylorFunc;

eX: TEdit;

eMin: TEdit;

eMax: TEdit;

eStepX: TEdit;

Chart1: TChart;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

bbExit: TBitBtn;

seCount: TSpinEdit;

Series1: TLineSeries;

GroupBox1: TGroupBox;

StringGrid1: TStringGrid;

procedure bbExitClick(Sender: TObject);

procedure TaylorClick(Sender: TObject);

procedure TaylorCalculate(Sender: TObject; X: Extended;

var Res: Extended);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.bbExitClick(Sender: TObject);

begin

Application.Terminate

end;

procedure TForm1.TaylorClick(Sender: TObject);

begin

ShowMessage('Hi, I''m OnClick');

end;

procedure TForm1.TaylorCalculate(Sender: TObject; X: Extended;

var Res: Extended);

begin

Res := cos(x)

end;

end.

Демонстрационная форма

Варианты заданий:

  1. Создать компонент - потомок TDrawGrid, выполняющий решение системы линейных уравнений по коэффициентам, введенным пользователем в интерактивном режиме. Компонент должен содержать следующие свойства: Range:TEdit - размерность системы уравнений; A[i,j:integer]:extended - коэффициенты ; H[i:integer]:extended - столбец свободных членов; ListBox:TListBox - компонент для вывода результатов решения; Button:TButton - кнопка, при нажатии на которую производится решение данной системы.

  2. Создать компонент - потомок TButton, выполняющий разложение заданной функции, вычисляемой при помощи события OnCalculate, в ряд Тейлора. Компонент должен содержать следующие свойства: x:TEdit - абсцисса точки разложения; XMin, XMax, StepX:TEdit - диапазон изменения аргумента и шаг; Count:TSpinEdit - количество учитываемых производных; Grid:TDrawGrid - компонент для вывода результатов работы.

  3. Создать компонент - потомок TClientDataSet, выполняющий аппроксимацию некоторого физического процесса функциями, вычисляемыми при помощи события OnCalculate. Компонент должен содержать следующие свойства: XMin, XMax:TEdit - диапазон изменения аргумента; Count:TSpinEdit - количество функций; Image:TImage - компонент для вывода графика, характеризующего физический процесс; Button:TSpeedButton - кнопка, при нажатии на которую выполняется изображение графика; BackColor, Color - цвет фона и графика.

  4. Создать компонент - потомок TEdit, служащий для ввода вещественных чисел в заданном диапазоне. Компонент должен содержать следующие свойства: MinValue, MaxValue:extended - диапазон допустимых значений; Value:extended - текущее значение; ValueInt:integer - целая часть текущего значения; ValueFrac:extended - дробная часть текущего значения; ValueStr:string - строковое представление текущего значения; Step:extended - шаг изменения при нажатии клавиш Up/Down.

  5. Создать компонент - потомок TSpeedButton, выполняющий ввод заданной цифры в позицию курсора элемента Edit или удаление символа, стоящего слева от курсора, если Value = -1. Компонент должен содержать следующие свойства: Value:integer - цифра, которая должна вводиться при нажатии на кнопку (диапазон изменения от -1 до 9); Edit:TEdit - элемент для ввода цифры.

  6. Создать компонент - потомок TTimer, выполняющий вывод текущего времени на заданный компонент. При потере приложением фокуса ввода таймер должен отключаться. Компонент должен содержать следующие свойства: TimeControl:TControl - компонент для вывода времени; TimeFormat:string - формат для вывода времени; Color:TColor - цвет текста.

  7. Создать компонент - потомок TCheckBox, выполняющий запрет ввода заданных символов в компонент Memo, если установлено свойство Checked. Компонент должен содержать следующие свойства: Memo:TMemo - компонент для ввода текста; Edit:TEdit - компонент, содержащий строку запрещенных символов. В случае отсутствия запрещенных символов свойство Checked устанавливаться не должно.

  8. Создать компонент - потомок TBitBtn, выполняющий закрытие приложения с сохранением в ini-файле параметров главного окнаи текста, содержащегося во всех элементах TEdit главного окна. При повторном запуске приложения сохраненная ранее информация должна восстанавливаться. Компонент должен содержать следующие свойства: FileName:string - имя ini-файла; Section:string - имя секции для сохранения параметров.

  9. Создать компонент, выполняющий печать текста в фоновом режиме. Компонент должен содержать следующие свойства: Memo:TMemo - текст, посылаемый на принтер; Button:TSpeedButton - кнопка для запуска печати.

  10. Создать компонент - потомок TLabel, отображающий результат заданной арифметической операции, если оба операнда введены без ошибок. Компонент должен содержать следующие свойства: Value1, Value2:TEdit - операнды; Operation:TRadioGroup - заданная операция.

  11. Создать компонент - потомок TImage, предназначенный для обучения основам радиоэлектроники. Компонент должен содержать следующие свойства: Element:TRadioGroup - тип выбранного элемента; Memo:TMemo - компонент для вывода справочной информации; FileName:string - имя файла, содержащего справочную информацию.

  12. Создать компонент - потомок TListBox, предназначенный для вывода информации о микросхемах. Свойство Items содержит названия микросхем. Компонент должен содержать следующие свойства: FileName:string - имя файла, содержащего справочную информацию; Image:TImage - компонент для изображения принципиальной схемы; Grid:TStringGrid - компонент для вывода параметров.

  13. Создать компонент - потомок TSpeedButton, выполняющий поиск заданных слов в тексте и выделение их указанным цветом. Компонент должен содержать следующие свойства: Edit:TEdit - список заданных слов; Color:TColor - цвет выделяемых слов; Button:TSpeedButton - кнопка для выбора цвета; Text:TRichEdit - компонент, содержащий обрабатываемый текст.

  14. Создать компонент - потомок TPanel, который позволяет настраивать цвет при нажатии левой кнопки мыши и шрифт при нажатии правой кнопки.

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

40

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]