.


:




:

































 

 

 

 


.

 

 

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.



<== | ==>
. , | 
:


: 2016-11-19; !; : 268 |


:

:

, ; , .
==> ...

1803 - | 1565 -


© 2015-2024 lektsii.org - -

: 0.052 .