ЗАМЕЧАНИЕ РУКОВОДИТЕЛЯ
ОГЛАВЛЕНИЕ
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.