- •Тема, цель работы, вариант задания.
- •Тема, цель работы, вариант задания.
- •Модуль GraphObj.
- •Модуль Point.
- •Модуль Circle.
- •Модуль Rect.
- •Модуль Line.
- •Модуль Square.
- •Модуль Trian.
- •Основной модуль oop_Lab3.
- •Тема, цель работы, вариант задания.
- •Тема, цель работы, вариант задания.
- •Тема, цель работы, вариант задания.
-
Модуль Trian.
unit Trian;
interface
uses
Line, Graphics, Grids, SysUtils;
type
{ объект - Треугольник, наследует поля и методы от Линии }
TTrian = class(TLine)
protected
FX3: Integer; // координаты третьей вершины
FY3: Integer; // 1-я и 2-я наследуются от родителя
public
// объявление перекрытых родительских методов
constructor Create(ACanvas: TCanvas; AName: string;
AX, AY, AX2, AY2, AX3, AY3: Integer; AColor: TColor; AVisible: Boolean);
procedure Draw(AColor: TColor); override;
procedure Move(dX, dY: Integer); override;
procedure DrawGrid(AStringGrid: TStringGrid); override;
procedure EditGrid(AStringGrid: TStringGrid; ARow: Integer); override;
property X3: Integer read FX3 write FX3;
property Y3: Integer read FY3 write FY3;
end;
implementation
constructor TTrian.Create;
begin
inherited Create(ACanvas, AName, AX, AY, AX2, AY2, AColor, AVisible);
FClassName := 'TTrian';
FX3 := AX3;
FY3 := AY3;
end;
procedure TTrian.Draw(AColor: TColor);
begin
inherited Draw(AColor);
with FCanvas do
begin
Pen.Color := AColor;
LineTo(FX3, FY3);
LineTo(FX, FY);
end
end;
procedure TTrian.Move(dX, dY: Integer);
begin
Hide;
inc(FX, dX);
inc(FY, dY);
inc(FX2, dX);
inc(FY2, dY);
inc(FX3, dX);
inc(FY3, dY);
Show
end;
procedure TTrian.DrawGrid(AStringGrid: TStringGrid);
begin
inherited DrawGrid(AStringGrid); // перекрываем родительский метод
with AStringGrid do // и добавляем новые свойства
begin
Cells[0, 8] := 'X3';
Cells[1, 8] := IntToStr(FX3);
Cells[0, 9] := 'Y3';
Cells[1, 9] := IntToStr(FY3);
end
end;
procedure TTrian.EditGrid(AStringGrid: TStringGrid; ARow: Integer);
begin
inherited EditGrid(AStringGrid, ARow);
with AStringGrid do
case ARow of
8: FX3 := StrToInt(Cells[1, 8]);
9: FY3 := StrToInt(Cells[1, 9]);
end;
end;
end.
-
Основной модуль oop_Lab3.
unit OOP_Lab3;
interface
uses
Windows, Messages, SysUtils, Classes, Forms, Grids, Buttons,
Dialogs, StdCtrls, Controls, ExtCtrls, ComCtrls, Graphics,
GraphObj, Point, Line, Rect, Circle, Square, Trian; { используемые модули }
type
TForm1 = class(TForm)
bbOk: TBitBtn;
bShow: TButton;
bHide: TButton;
bbExit: TBitBtn;
bbInfo: TBitBtn;
eDX: TEdit;
eDY: TEdit;
ldX: TLabel;
ldY: TLabel;
Image1: TImage;
gbTree: TGroupBox;
gbMove: TGroupBox;
gbVisual: TGroupBox;
gbMetods: TGroupBox;
Panel1: TPanel;
Tree: TTreeView;
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure bShowClick(Sender: TObject);
procedure bHideClick(Sender: TObject);
procedure bbOKClick(Sender: TObject);
procedure bbInfoClick(Sender: TObject);
procedure bbExitClick(Sender: TObject);
procedure TreeChange(Sender: TObject; Node: TTreeNode);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure eDXKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure TreeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure TreeDeletion(Sender: TObject; Node: TTreeNode);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
Node, Node1: TTreeNode;
begin
{ создание шапки таблицы StringGrid1 }
StringGrid1.Cells[0,0]:=' Свойство:';
StringGrid1.Cells[1,0]:=' Значение:';
{ динамическое создание дерева Tree }
Node1 := Tree.Items.Add(nil, 'TGraphObj');
Node := Tree.Items.AddChildObject(Node1, 'Точка', TPoint.Create(Image1.Canvas, 'Точка', 136, 98, 0, True));
Tree.Items.AddChildObject(Node, 'Окружность', TCircle.Create(Image1.canvas, 'Окружность', 136, 98, 43, clGreen, True));
Node := Tree.Items.AddChildObject(Node, 'Квадрат', TSquare.Create(Image1.Canvas, 'Квадрат', 196, 31, 46, clAqua, True));
Tree.Items.AddChildObject(Node, 'Прямоугольник', TRect.Create(Image1.Canvas, 'Прямоугольник', 0, 0, 273, 196, clBlue, True));
Node := Tree.Items.AddChildObject(Node1, 'Прямая', TLine.Create(Image1.canvas, 'Прямая', 0, 0, 273, 196, clRed, True));
Tree.Items.AddChildObject(Node, 'Треугольник', TTrian.Create(Image1.canvas, 'Треугольник', 70, 115, 98, 165, 41, 165, clFuchsia, True));
end;
{ обработчик события, происходящего при выборе элемента дерева;
используется для отображения свойств объекта, связанного с выделенным элементом }
procedure TForm1.TreeChange(Sender: TObject; Node: TTreeNode);
begin
// если выделенный объект не является абстрактным классом
if Tree.Selected.AbsoluteIndex <> 0 then
begin
// отображение свойст объекта в StringGrid1
TGraphObj(Node.Data).DrawGrid(StringGrid1);
// прорисовка объекта
TGraphObj(Node.Data).Draw(TGraphObj(Node.Data).Color);
end
// отчистка StringGrid1
else TGraphObj(Tree.Selected.Data).ClearGrid(StringGrid1);
end;
{ обработчик нажатия клавиши в StringGrid1 }
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
with StringGrid1 do
{ запрет изменения значения 0-го столбца и 1-й строки, содержащих
информацию закрытую для редактирования, а также запрет на ввод
любых символов кроме цифр в поля целочисленных свойств }
if ((Col = 0) or (Row in [1])) or ((Row > 3) and not (Key in ['0'..'9', #8]))
then Key := #0;
end;
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = VK_RETURN) then { если в StringGrid1 нажали "Enter" }
with TGraphObj(Tree.Selected.Data) do
begin
Visible := false; // спрятать объект перед изменением свойств
// редактирование свойства в строке Row
EditGrid(StringGrid1, StringGrid1.Row);
if Tree.Selected.Text <> Name then
// изменение св-ва text выделенного элемента дерева
Tree.Selected.Text := Name;
Visible := true; // показать объект
end
end;
procedure TForm1.eDXKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
{ если нажимаем Enter, то фокус устанавливается на следующем элементе
в списке TabOrder }
if (Key = VK_RETURN) then
FindNextControl(Sender as TWinControl, true, true, false).SetFocus;
end;
{ обработчик кнопки bbOK }
procedure TForm1.bbOKClick(Sender: TObject);
begin
if Tree.Selected.AbsoluteIndex <> 0 then
begin
try
if eDX.Text <> '' then
TGraphObj(Tree.Selected.Data).Move(StrToInt(eDX.Text), 0);
if eDY.Text <> '' then
TGraphObj(Tree.Selected.Data).Move(0, StrToInt(eDY.Text));
except
{ обработка исключения, которое может возникнуть при преобразовании
строки, введённой в eDX или eDY, в целое число }
on EConvertError do MessageDlg('Неверный формат данных!', mtWarning, [mbOk], 0)
end;
TGraphObj(Tree.Selected.Data).DrawGrid(StringGrid1);
end;
end;
{ показать выбранный в Tree объект }
procedure TForm1.bShowClick(Sender: TObject);
begin
if Tree.Selected.AbsoluteIndex <> 0 then
TGraphObj(Tree.Selected.Data).Visible := true;
end;
{ скрыть выбранный в Tree объект }
procedure TForm1.bHideClick(Sender: TObject);
begin
if Tree.Selected.AbsoluteIndex <> 0 then
TGraphObj(Tree.Selected.Data).Visible := false;
end;
{ удаление выделенного елемента дерева }
procedure TForm1.TreeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_DELETE then // если нажали клавишу Del
if Tree.Selected.AbsoluteIndex <> 0 then
Tree.Items.Delete(Tree.Selected); // удалить объект
end;
{ обработка события происходящего при удалении элемента дерева }
procedure TForm1.TreeDeletion(Sender: TObject; Node: TTreeNode);
begin
if Node.Text <> 'TGraphObj' then // если это не абстрактный объект-родитель
begin
TGraphObj(Node.Data).Visible := false;
TGraphObj(Node.Data).Free;
end;
Node.Delete
end;
procedure TForm1.bbInfoClick(Sender: TObject);
begin
Application.MessageBox('Выполнил Фёдоров Виталий, гр. ПВ-33. ',' Информация',MB_ICONINFORMATION);
end;
procedure TForm1.bbExitClick(Sender: TObject);
begin
Application.Terminate
end;
end.
Главная форма.
Варианты заданий:
-
Создать иерархию полупроводниковых элементов, используемых в электронных устройств.
-
Создать иерархию классов, содержащих информацию об основных типах цифровых микросхем.
-
Создать иерархию классов, содержащих информацию о комплектующих персонального компьютера.
-
Создать иерархию классов, содержащих информацию об основных изделиях промышленности строительных материалов.
-
Создать иерархию классов, представляющих собой шахматные фигуры.
-
Создать иерархию классов, представляющих собой графические примитивы, используемые в игре «Тетрис».
-
Создать иерархию классов, представляющих собой структурные подразделения ВУЗа.
-
Создать иерархию классов для игры «Морской бой».
-
Создать иерархию классов, представляющих собой транспортные средства.
-
Создать иерархию классов, представляющих собой виды спорта.
-
Создать иерархию классов, представляющих собой виды печатных изданий (книги, журналы и т.п.)
-
Создать иерархию классов, представляющих собой виды графов.
-
Создать иерархию классов, представляющих собой населенные пункты.
-
Создать иерархию классов, представляющих собой объекты животного мира.
-
Создать иерархию классов, представляющих собой объекты растительного мира.
Лабораторная работа №4
Программирование подпроцессов
Цель работы: приобретение навыков программирования подпроцессов с использованием классов библиотеки VCL.
Задание:
-
Изучить основные приемы программирования подпроцессов с использованием классов библиотеки VCL.
-
Разработать программу в соответствии с вариантом задания. Программа должна содержать 2 объекта TThread, унаследованных от общего предка, в котором должны содержаться общие для обоих процессов свойства.
Содержание отчета: