Описание свойств и процедур компонента.

ЗАМЕЧАНИЕ РУКОВОДИТЕЛЯ

 

ОГЛАВЛЕНИЕ

 

1.ВВЕДЕНИЕ………………………………..…………………………...…... 2. ТЕХНИЧЕСКОЕ ЗАДАНИЕ ………………………….………………….. 2.1) Исходные данные ……………………………..……………..……. 2.2) Выбор класса предка……………………………………………… 2.3) Описание свойств и процедур.…………………………………… 2.4) Интерфейс пользователя……………………………..…………… 3.ЗАКЛЮЧЕНИЕ………………………………………………….……......... 4.СПИСОК ЛИТЕРАТУРЫ…………………………………………………. 5.ПРИЛОЖЕНИЕ…………………………………………………………….      

ВВЕДЕНИЕ

В настоящее время среди широкого круга пользователей популярна система объектно-ориентированного программирования Delphi, основу которой составляет язык Object Pascal. Delphi позволяет быстро создавать приложения различной степени сложности на основе применения технологии визуального программирования.

По сравнению с традиционными способами программирования ООП обладает рядом преимуществ. Главное из них заключается в том, что эта концепция в наибольшей степени соответствует внутренней логике функционирования операционной системы Windows. Программа, состоящая из отдельных объектов, отлично приспособлена к реагированию на события, происходящие в ОС. К другим преимуществам ООП можно отнести большую надежность кода и возможность повторного использования отработанных объектов.

Использование объектно-ориентированного подхода позволило справиться с рядом проблем индустрии разработки программного обеспечения. Ранее многие программы создавались "с нуля", повторное использование библиотек подпрограмм было затруднено однозначностью записанных в них алгоритмов. Такой подход был дорогостоящим, многие ранее сделанные наработки не могли быть применены в новых проектах. Методология ООП позволила создавать достаточно универсальные библиотеки классов объектов, чтобы их можно было многократно и различными способами использовать при решении многих задач. Это привело к снижению стоимости разработок, ускорению выхода новых программных продуктов, созданию более сложных устойчивых программных систем и бурному развитию отрасли.

В данном курсовом проекте создан визуальный компонент с заранее определенными свойствами и методами. Также было разработано тестовое приложение для демонстрации доступных событий.

ТЕХНИЧЕСКОЕ ЗАДАНИЕ

Исходные данные.

· загруженная изображение разбивается на определенное число кусков

· куски изображения перемешиваются на рабочем поле в случайном порядке

· при правильном расположении куска пользователем происходит автовыравнивание

· при правильном расположении всех кусков изображения - выдается сообщение пользователю о победе

 

Выбор класса предка.

 

Цель курсовой работы состоит в создании компонента логической игры пазл. В качестве класса предка компонента выбран класс TCustomControl, так как компонент нуждается в дескрипторе окна.

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

· загружаемое изображение

· количество кусков изображения

Описание свойств и процедур компонента.

Директивыprivate, protected, public и publishedпредназначеные для разграничения доступа к элементам класса. Расположив директивы по порядку, будет видно их применение:

Private. Поля, свойства и методы, описанные в разделе private, называются личными или закрытыми. Сюда помещаются элементы, которые выполняют в объекте специфичные функции. Поэтому целесообразно скрыть от других частей программы, либо такие элементы, для которых по ряду причин не следует разрешать доступ извне объекта.

Protected. Элементы класса, объявленные в разделе protected доступны только в классах, порожденных от исходного. Здесь размещаются элементы, которые важны лишь для функционирования объектов данного класса и его потомков. Обычно в секцию protected помещаются описания методов класса.

Public. Элементы, описанные в разделе public - общедоступны. Они могут быть использованы всюду в программе.

Published. Поля, свойства и методы, описанные в разделе published, называются опубликованными. Их область видимости эквивалентна области видимости общедоступных описаний. Отличие состоит в том, что информация о них, за исключением ряда типов, например real, на этапе проектирования программы помещается в инспектор объектов.

Интерфейс пользователя

Интерфейс разработанного компонента прост.

 

 

Рисунок 2.4.1

 

1. Рабочее поле с загруженным изображением.

2. Флажок начала игры.

3. Элементы управления количеством кусков изображения.

4. Загрузка другого изображения.

При установке флажка «Разрезать» происходит разрезание картинки на заданное количество кусков по вертикали и горизонтали.

При правильной установке куска изображения происходит автовыравнивание элемента.

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

 

ЗАКЛЮЧЕНИЕ

Результатом курсового проектирования стало применение практических навыков в области объектно-ориентированного программирования. Была разработана логическая игра «Пазл».Для проверки работоспособности компонента было разработано тестовое приложения, демонстрирующее возможности компонента.

Курсовой проект был разработан с использованием среды визуального программирования Delphi 7.

 

СПИСОК ЛИТЕРАРУРЫ

 

1. Голованов М., Веселов Е. – Создание компонента в среде Delphi. Руководство разработчика, СПб: БХВ-Питербург, 2004. 233 с.

2. Фаронов В. В. Delphi 4. Учебный курс. – М.: Издательство «Нолидж», 1998.

3. Бобровский С. И. Технологии Delphi, учебный курс. – Спб.: Питер, 2007. – 720с.: ил.

4. З.П.Дарахвелидзе, Е.Марков. Delphi — среда визуального программирования. СПб: BHV-Санкт-Петербург, 1996. 352 с.

 

 

ПРИЛОЖЕНИЕ

Листинг программы

unit Pazle;

 

interface

 

uses

windows, SysUtils, Classes, Controls, graphics, Dialogs, forms, StdCtrls,

Messages, ExtCtrls;

 

type

TPazle = class(TCustomControl)

private

FColCount: integer;

FRowCount: integer;

FCut: boolean;

FBitmap:TBitmap;

procedure SetColCount(const Value: integer);

procedure SetRowCount(const Value: integer);

procedure SetCut(const Value: boolean);

procedure SetBitmap(const Value: TBitmap);

protected

procedure Paint; override;

procedure CheckRight;

public

Complete:boolean;

constructor Create(AOwner: TComponent); override;

destructor Destroy; override;

 

published

 

property Bitmap: TBitmap read FBitmap write SetBitmap;

property ColCount: integer read FColCount write SetColCount;

property RowCount: integer read FRowCount write SetRowCount;

property Cut: boolean read FCut write SetCut;

end;

 

TPiece = class(TCustomControl)

private

FX: Integer;

FY: Integer;

protected

procedure WMNCHitTest(var Message:TMessage); message WM_NCHITTEST;

procedure Paint; override;

function IsOnPlace:Boolean;

procedure WMMOVE(var Message:TMessage); message WM_MOVE;

public

property X:Integer read FX write FX;

property Y:Integer read FY write FY;

 

published

end;

 

procedure Register;

 

implementation

 

uses Variants, Types;

 

procedure Register;

begin

RegisterComponents('Game', [TPazle, TPiece]);

end;

var

lPiece:TPiece;

 

{ TPazle }

 

 

procedure TPazle.CheckRight;

var

i:integer;

a:boolean;

begin

a:=true;

for i:= ComponentCount - 1 downto 0 do

begin

with Components[i] as TPiece do

begin

a:=a and IsOnPlace;

end;

end;

if a then

Complete:=true;

end;

 

constructor TPazle.Create(AOwner: TComponent);

begin

inherited;

width := 300;

Height := 300;

color:=clGray;

FBitmap:=TBitmap.Create;

FColCount := 2;

FRowCount := 2;

Cut := False;

end;

 

destructor TPazle.Destroy;

begin

FBitmap.Free;

inherited;

end;

 

procedure TPazle.Paint;

begin

inherited;

if not FCut then

Canvas.StretchDraw(ClientRect, FBitmap);

canvas.Brush.Color:=clBlack;

Canvas.FrameRect(ClientRect);

if Complete and lPiece.IsOnPlace then

ShowMessage('Сейчас рисунок собран правильно!');

Complete:=false;

end;

 

procedure TPazle.SetBitmap(const Value: TBitmap);

begin

FBitMap.Assign(Value);

Invalidate;

end;

 

procedure TPazle.SetColCount(const Value: integer);

begin

FColCount := Value;

end;

 

procedure TPazle.SetCut(const Value: boolean);

var

c, r: integer;

dx,dy:Integer;

begin

FCut := Value;

if Cut then

begin // Нарезаем кусочки

dx:=ClientWidth div ColCount;

dy:=ClientHeight div RowCount;

for c := 0 to ColCount - 1 do

for r := 0 to RowCount - 1 do

begin

lPiece := TPiece.Create(self);

lPiece.Parent := self;

lPiece.Width:=dx;

lPiece.Height:=dy;

lPiece.X:=C;

lPiece.Y:=R;

lPiece.Left:= Random(ClientWidth);

lPiece.Top:= Random(ClientHeight);

end;

end

else

begin

for c := ComponentCount - 1 downto 0 do

Components[c].Free;

end;

Invalidate;

end;

 

procedure TPazle.SetRowCount(const Value: integer);

begin

FRowCount := Value;

end;

 

{ TPiece }

 

function TPiece.IsOnPlace: Boolean;

begin

Result:=(Left=(X*ClientWidth)) and (top=(Y*ClientHeight));

end;

 

procedure TPiece.Paint;

var dx, dy:Integer;

begin

inherited;

Canvas.Brush.Color:=clBlack;

dx:=TPazle(Owner).FBitmap.Width div TPazle(Owner).ColCount;

dy:=TPazle(Owner).FBitmap.Height div TPazle(Owner).RowCount;

Canvas.CopyRect(ClientRect,TPazle(Owner).FBitmap.Canvas, Rect(dx*x,dy*y, dx*(x+1), dy*(y+1)));

Canvas.FrameRect(ClientRect);

end;

 

procedure TPiece.WMMOVE(var Message: TMessage);

var

xx,yy:integer;

begin

xx:=X*ClientWidth;

yy:=Y*ClientHeight;

if abs(Message.LParamLo-xx)<=8 then Left:=xx; //автовыравнивание

if abs(Message.LParamHi-yy)<=8 then top:=yy; //

IsOnPlace;

TPazle(owner).CheckRight;

end;

 

procedure TPiece.WMNCHitTest(var Message: TMessage);

begin

Message.Result :=

DefWindowProc(Handle, Message.Msg, Message.WParam, Message.LParam);

if Message.Result=HTCLIENT then Message.Result:=HTCaption;

end;

end.