- •Тема, цель работы, вариант задания.
- •Тема, цель работы, вариант задания.
- •Модуль GraphObj.
- •Модуль Point.
- •Модуль Circle.
- •Модуль Rect.
- •Модуль Line.
- •Модуль Square.
- •Модуль Trian.
- •Основной модуль oop_Lab3.
- •Тема, цель работы, вариант задания.
- •Тема, цель работы, вариант задания.
- •Тема, цель работы, вариант задания.
-
Тема, цель работы, вариант задания.
-
Описание разработанного компонента.
-
Исходный текст модулей программы.
Пример. Создать компонент - потомок TButton, выполняющий разложение заданной функции, вычисляемой при помощи события OnCalculate, в ряд Тейлора. Компонент должен содержать следующие свойства: x:TEdit - абсцисса точки разложения; XMin, XMax, StepX:TEdit - диапазон изменения аргумента и шаг; Count:TSpinEdit - количество учитываемых производных; Grid:TDrawGrid - компонент для вывода результатов работы.
Выполнение.
-
Текст программы компонента 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.
-
Тестовая программа
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.
Демонстрационная форма
Варианты заданий:
-
Создать компонент - потомок TDrawGrid, выполняющий решение системы линейных уравнений по коэффициентам, введенным пользователем в интерактивном режиме. Компонент должен содержать следующие свойства: Range:TEdit - размерность системы уравнений; A[i,j:integer]:extended - коэффициенты ; H[i:integer]:extended - столбец свободных членов; ListBox:TListBox - компонент для вывода результатов решения; Button:TButton - кнопка, при нажатии на которую производится решение данной системы.
-
Создать компонент - потомок TButton, выполняющий разложение заданной функции, вычисляемой при помощи события OnCalculate, в ряд Тейлора. Компонент должен содержать следующие свойства: x:TEdit - абсцисса точки разложения; XMin, XMax, StepX:TEdit - диапазон изменения аргумента и шаг; Count:TSpinEdit - количество учитываемых производных; Grid:TDrawGrid - компонент для вывода результатов работы.
-
Создать компонент - потомок TClientDataSet, выполняющий аппроксимацию некоторого физического процесса функциями, вычисляемыми при помощи события OnCalculate. Компонент должен содержать следующие свойства: XMin, XMax:TEdit - диапазон изменения аргумента; Count:TSpinEdit - количество функций; Image:TImage - компонент для вывода графика, характеризующего физический процесс; Button:TSpeedButton - кнопка, при нажатии на которую выполняется изображение графика; BackColor, Color - цвет фона и графика.
-
Создать компонент - потомок TEdit, служащий для ввода вещественных чисел в заданном диапазоне. Компонент должен содержать следующие свойства: MinValue, MaxValue:extended - диапазон допустимых значений; Value:extended - текущее значение; ValueInt:integer - целая часть текущего значения; ValueFrac:extended - дробная часть текущего значения; ValueStr:string - строковое представление текущего значения; Step:extended - шаг изменения при нажатии клавиш Up/Down.
-
Создать компонент - потомок TSpeedButton, выполняющий ввод заданной цифры в позицию курсора элемента Edit или удаление символа, стоящего слева от курсора, если Value = -1. Компонент должен содержать следующие свойства: Value:integer - цифра, которая должна вводиться при нажатии на кнопку (диапазон изменения от -1 до 9); Edit:TEdit - элемент для ввода цифры.
-
Создать компонент - потомок TTimer, выполняющий вывод текущего времени на заданный компонент. При потере приложением фокуса ввода таймер должен отключаться. Компонент должен содержать следующие свойства: TimeControl:TControl - компонент для вывода времени; TimeFormat:string - формат для вывода времени; Color:TColor - цвет текста.
-
Создать компонент - потомок TCheckBox, выполняющий запрет ввода заданных символов в компонент Memo, если установлено свойство Checked. Компонент должен содержать следующие свойства: Memo:TMemo - компонент для ввода текста; Edit:TEdit - компонент, содержащий строку запрещенных символов. В случае отсутствия запрещенных символов свойство Checked устанавливаться не должно.
-
Создать компонент - потомок TBitBtn, выполняющий закрытие приложения с сохранением в ini-файле параметров главного окнаи текста, содержащегося во всех элементах TEdit главного окна. При повторном запуске приложения сохраненная ранее информация должна восстанавливаться. Компонент должен содержать следующие свойства: FileName:string - имя ini-файла; Section:string - имя секции для сохранения параметров.
-
Создать компонент, выполняющий печать текста в фоновом режиме. Компонент должен содержать следующие свойства: Memo:TMemo - текст, посылаемый на принтер; Button:TSpeedButton - кнопка для запуска печати.
-
Создать компонент - потомок TLabel, отображающий результат заданной арифметической операции, если оба операнда введены без ошибок. Компонент должен содержать следующие свойства: Value1, Value2:TEdit - операнды; Operation:TRadioGroup - заданная операция.
-
Создать компонент - потомок TImage, предназначенный для обучения основам радиоэлектроники. Компонент должен содержать следующие свойства: Element:TRadioGroup - тип выбранного элемента; Memo:TMemo - компонент для вывода справочной информации; FileName:string - имя файла, содержащего справочную информацию.
-
Создать компонент - потомок TListBox, предназначенный для вывода информации о микросхемах. Свойство Items содержит названия микросхем. Компонент должен содержать следующие свойства: FileName:string - имя файла, содержащего справочную информацию; Image:TImage - компонент для изображения принципиальной схемы; Grid:TStringGrid - компонент для вывода параметров.
-
Создать компонент - потомок TSpeedButton, выполняющий поиск заданных слов в тексте и выделение их указанным цветом. Компонент должен содержать следующие свойства: Edit:TEdit - список заданных слов; Color:TColor - цвет выделяемых слов; Button:TSpeedButton - кнопка для выбора цвета; Text:TRichEdit - компонент, содержащий обрабатываемый текст.
-
Создать компонент - потомок TPanel, который позволяет настраивать цвет при нажатии левой кнопки мыши и шрифт при нажатии правой кнопки.
-
Создать компонент - потомок TComboBox, который делает невидимым выбранный визуальный компонент главного окна. При запуске приложения в раскрывающийся список должны автоматически заноситься имена всех визуальных компонентов, находящихся на главной форме.