Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


ѕрограммна€ обработка перемещени€ объекта




–асположите на форме компонент и задайте его свойство AutoSize=true. ƒополнительно вам понадоб€тс€ несколько новых переменных, которые лучше объ€вить в разделе private.

Move:Boolean; //–ежим перетаскивани€

X0,y0:integer; //Ќачальные координаты мыши

“еперь настраиваем начальное нажатие мыши

Procedure TForm1.Image1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Begin

If Button<>mbLeft then exit; // ≈сли нажата не лева€ кнопка мыши, то и делать ничего не надо

X0:=X;

Y0:=Y;

Image1.Canvas.DrawFocusRect(Rect(X-5,Y-5,X+5,Y+5)); {рисование рамки}

Move:=true; {включение флажка режима перемещени€ рамки}

End;

ќбрабатываем процесс перетаскивани€

procedure TForm1.Image1MouseMove (Sender: TObject; Shift: TShiftState; X,Y: Integer);

begin

if not Move then exit; //Ќичего не делать, если перетаскивание не включено

Image1.Canvas.DrawFocusRect(Rect(X0-5,Y0-5,X0+5,Y0+5)); {стирание рамки}

Image1.Canvas.DrawFocusRect(Rect(X-5,Y-5,X+5,Y+5)); {рисование рамки}

X0:=X; {запоминание координат курсора}

Y0:=Y;

end;

ѕоследний этап Ц выключить процесс перетаскивани€ при отпускании клавиши мыши.

procedure TForm1.Image1MouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: Integer);

begin

if not drag then exit;

Image1.Canvas.DrawFocusRect(Rect(X0-5,Y0-5,X0+5,Y0+5)); {стирание рамки}

Move:=false; {выключение флажка режима перемещени€ рамки}

end;

ѕри нажатии кнопки мыши рисуетс€ перва€ рамка, запоминаютс€ координаты курсора, и включаетс€ режим перемещени€ рамки (переменна€ drag = true). ѕри перемещении мыши в режиме перемещени€ рамки стираетс€ прежн€€ рамка, рисуетс€ рамка в новой позиции, и запоминаютс€ новые координаты курсора. ѕри отпускании кнопки мыши стираетс€ рамка и выключаетс€ режим перемещени€ рамки.

Ћабораторна€ работа по перетаскиванию объектов є15.

1. —оздайте новый проект Ђѕазлыї и сохраните форму проекта с именем PazlForm.pas, и сам проект Pazly в отведенную дл€ них папку.

2. Ќаш проект состоит из следующих этапов:

a. –азмещение рисунка на форме.

b. –азбивка рисунка на отдельные части, которые возможно перемещать по форме.

3. ƒл€ того чтобы разместить на форме рисунок, создадим виртуальный компонент BitMap, используем его свойства, а при разрушении формы разрушим и сам компонент. “акой подход необходим дл€ того, чтобы иметь возможность восстанавливать часть рисунка, перекрытую другими ‘омами.

a. —копируйте в папку с проектом рисунок формата bmp. ¬ дальнейшем в программе вы будете использовать его им€. ¬ нашем примере Ц это g18.bmp

b. ќбъ€вите в разделе private

BitMap:TBitMap;

FileName: String;

c. “еперь создадим обработчик событий дл€ событи€ OnCreate - создание формы

procedure TForm1.FormCreate(Sender: TObject);

begin

FileName:='g18.bmp'; //«адаем им€ файла рисунка

BitMap:=TBitMap.Create; //—оздаем компонент

try //≈сли файл существует, то

BitMap.LoadFromFile(FileName); //ѕерерисовываем его в компонент BitMap

Canvas.Draw(0,0,BitMap); // –азмещаем рисунок от левого верхнего угла

Width:=BitMap.Width*2; // орректируем ширину формы

Height:=BitMap. Height* 3 div 2; //» высоту

finally // ≈сли такого файла нет, то ничего не делаем.

end; {try}

end;

d. ≈сли компонент был создан, то он должен быть разрушен, иначе приложение вызовет зависание вашей машины. ѕоэтому в процедуру дл€ событи€ OnDestroy(разрушение формы) пишем следующую строчку.

procedure TForm1.FormDestroy(Sender: TObject);

var i,j:integer;

begin

Bitmap. Free; //–азрушить компонент BitMap

end;

e. —охраните и запустите проект. “еперь, не закрыва€ проект, перейдите в окно Delphi, а затем обратно. –исунок с вашей формы исчезнет. „то бы этого не происходило нужно настроить событие формы OnPaint.

procedure TForm1.FormPaint(Sender: TObject);

begin

if BitMap<>nil then // ≈сли рисунок существует, то восстановить стертый кусок

canvas.CopyRect(canvas.ClipRect,BitMap.Canvas,canvas.ClipRect);

end;

f. ¬от теперь сохраните и запустите проект еще раз. –исунок с формы исчезать не будет.

4. “еперь научимс€ разбивать рисунок на несколько кусочков. —начала поместим рисунок в еще один виртуальный компонент типа TImage, из которого потом скопируем кусочки в массив компонентов типа TImage.  ак и в проекте Ђ—аперї, мы с самого начала зададим переменное количество пазлов.

a. –азместите на форме компонент таймер.

b. ќпишите в разделе private следующие переменные

Pict:TImage; // ѕервоначальное размещение рисунка

Picti,n:Byte; // –азрезать Ц не разрезать

Paz:array [1..10,1..10] of TImage; // ѕазлы

c. ¬ процедуру создани€ формы FormCreate добавьте строчку Picti:=0;

d. ƒл€ таймера предусмотрите следующую процедуру

procedure TForm1.Timer1Timer(Sender: TObject);

var i,j,w,h:integer; //Ќомер строки, столбца, ширина и высота пазла

vs:real;

begin

if Picti>0 then exit; // ≈сли разрезка уже сделана, то выходим из процедуры

Picti:=1; // «апоминаем, что разрезка уже делалась

Pict:=TImage.Create(Self); // —оздаем компонент под целый рисунок

Pict.Picture.LoadFromFile(FileName); //«аполн€ем компонент рисунком

n:=StrToInt(InputBox('ѕазлы', '”ровень разбивки', '3')); //«апрашиваем уровень разбивки

w:= Pict.Width div n; //¬ысчитываем ширину пазла

h:=Pict.Height div n; //¬ысчитываем высоты пазла

BitMap:=nil; //”бираем рисунок с формы

canvas.Refresh; //ѕерерисовываем форму

for i:=1 to n do

for j:=1 to n do begin

Paz[i,j]:=TImage.Create(Self); //—оздаем пазлы

Paz[i,j].Parent:=self; //ѕриписываем их к форме

Paz[i,j].Height:=h; //«адаем высоту пазла

Paz[i,j].Width:= w; //Ўирину пазла

Paz[i,j].Canvas.CopyRect(Paz[i,j].ClientRect,Pict.Canvas, Rect(w *(i-1),(j-1)*h,w * i, j*h)); //–азмещаем на пазле кусок рисунка из компонента Pict, указав координаты верхнего левого и нижнего правого углов кусочка.

Paz[i,j].Visible:=true; //ƒелаем пазл видимым

Paz[i,j].Left:= w *(i-1 ); //–азмещаем пазлы по пор€дку

Paz[i,j].Top:=(j-1)*h;

Paz[i,j].DragKind:=dkDock; // ќпредел€ем компонент, как дл€ встраивани€. “оже свойство = dkDrag компонент дл€ обычного перетаскивани€.

Paz[i,j].DragMode:=dmAutomatic; //–азрешить перетаскивание без программного кода

Paz[i,j].ManualFloat(Rect(Left+Paz[i,j].Left, Top+Paz[i,j].Top,Left+Paz[i,j].Left+w, Top+Paz[i,j].Top+h)); // ѕереводит кусок в плавающий режим

Paz[i,j].ManualDock(Form1,nil,alleft); // –азрешить извлечь кусок с формы

end; {for}

Randomize; { –азмещаем пазлы случайным образом}

for i:=1 to n do for j:=1 to n do begin

Paz[i,j].Left:= random(Width-w);

Paz[i,j].Top:=random(Height - h);

end;

Pict.Free; //–азрушаем контейнер с рисунком

end;

e. —охраните и запустите проект. “еперь можно и поиграть.

5. ѕредусмотрите в программе вывод сообщени€ о том, что рисунок не найден

6. Ќастройте в программе выбор рисунка с помощью компонента OpenDialog, если исходный рисунок не был найден.

Ћабораторна€ работа. є16

1. ¬озьмем за основу проект Ђѕазлыї прошлого урока.   сожалению, автоматическое перетаскивание объектов обладает своими недостатками. ћы не можем проверить правильность размещени€ компонентов, у которых в добавок при перетаскивании образуетс€ рамка.

2. ѕерепишем обработчик дл€ таймера.

procedure TForm1.Timer1Timer(Sender: TObject);

var i,j:integer;

vs:real;

begin

if Picti>0 then exit; //≈сли разбивка произошла, то выходим

Picti:=1;

Pict:=TImage.Create(Self); //—оздаем контейнер дл€ рисунка

Pict.AutoSize:=true;

Pict.Picture.LoadFromFile(FileName);

n:=StrToInt(InputBox('ѕазлы', '”ровень разбивки', '3'));

w:= Pict.Width div n; //ширина пазла

h:=Pict.Height div n; //¬ысота пазла

BitMap:=nil;

canvas.Refresh; //ќчищаем канву

for i:=1 to n do begin

for j:=1 to n do begin

Paz[i,j]:=TImage.Create(Self); //—оздаем пазл

with Paz[i,j] do begin

Parent:=self; //ѕриписываем к форме

Height:=h; //«адаем высоту

Width:= w; //«адаем ширину

Canvas.CopyRect(Paz[i,j].ClientRect,Pict.Canvas, Rect(w *(j-1),(i-1)*h,w * j, i*h));//«аполн€ем рисунком

Visible:=true; //ƒелаем видимым

Left:= w *(i-1); //–асставл€ем правильно

Top:=(j-1)*h;

AutoSize:=true; //ƒаем возможность дальнейшего перемещени€ компонента

{OnMouseDown:=Image1MouseDown;

OnMouseMove:=Image1MouseMove;

OnMouseUp:=Image1MouseUp;} //позже мы напишем эти процедуры

end;

end;

end;

Randomize; //–асставл€ем в случайном пор€дке

for i:=1 to n do begin

for j:=1 to n do begin

Paz[i,j].Left:= random(Width-w*3 div 2);

Paz[i,j].Top:=random(Height - h*3 div 2);

end;

end;

Pict.Free;

end;

3. –азместите на форме компонент Image1 и напишите дл€ него следующие процедуры:

4. ƒл€ событи€ OnMouseDown Ц начало перетаскивани€

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if button<>mbLeft then exit;

x0:=x;

y0:=y;

move:=true;

rec:=(sender as TControl).BoundsRect;

end;

переменные x0 и y0 опишите в разделе private, как целые числа, move:Boolean, rec:TRect.

5. ƒл€ процесса перетаскивани€ OnMouseMove

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

if not move then exit;

Canvas.DrawFocusRect(rec);

with rec do begin

left:= Left+x-x0;

Right:=Right+x-x0;

Top:=top+y-y0;

bottom:=bottom+y-y0;

x0:=x;

y0:=y;

end;

Canvas.DrawFocusRect(rec);

end;

6. ƒл€ окончани€ перетаскивани€ OnMouseUp

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var l,t:integer;

begin

Canvas.DrawFocusRect(rec);

with (Sender as TControl) do begin

l:=(rec.Left +x-x0) div w * w;

t:=(rec.Top +y-y0)div h *h;

SetBounds(l,t,Width,Height);

BringToFront;

end;

move:=false;

end;

7. —охраните и запустите проект. Ќичего не происходит. ћы забыли определить выполнение этих функций дл€ каждого пазла. ”берите фигурные скобки в обработчике событи€ дл€ таймера. “еперь компонент Image1 нам больше не нужен, и его можно удалить. ≈ще раз сохраните и запустите проект.

8. ѕеред вами готова€ игрушка с пазлами. ќсталось научить ее определ€ть, когда же игрок заканчивает свою игру. ƒл€ этого вам понадобитьс€ нова€ функци€

function TForm1.analiz:boolean;

var i,j:integer;

begin

Result:=false;

for i:=1 to n do

for j:=1 to n do begin

if abs((Paz[i,j].Left-Paz[1,1].Left) - (j-1)*w)>1 then exit;

if abs((Paz[i,j].Top-Paz[1,1].Top) - (i-1)*h)>1 then exit;

end;

result:=true;

end;

Ќе забудьте описать ее. “еперь в предпоследнюю строчку процедуры TForm1.Image1MouseUp вставьте строчку

if analiz then ShowMessage('— днем св€того ¬алентина!');

≈сли картинка подобрана правильно, то у вас получитьс€ хороший подарок ко дню св€того ¬алентина.





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-05-07; ћы поможем в написании ваших работ!; просмотров: 378 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

—тремитесь не к успеху, а к ценност€м, которые он дает © јльберт Ёйнштейн
==> читать все изречени€...

1999 - | 1926 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.046 с.