Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Трабла с ООП

Автор: Skrip 28.11.2004 18:46

uses Graph, CRT;
{----------------------------SetGraph_BEGIN---------------------------------}
type
SetGraph=object
Procedure Hide(x1,y1,x2,y2: integer);
Procedure Show(x1,y1,x2,y2,rec_color: integer);
end;


Procedure SetGraph.Hide;
begin
Setcolor(0);
Rectangle(x1,y1,x2,y2);
end;

Procedure SetGraph.Show;
begin
SetColor(rec_color);
Rectangle(x1,y2,x2,y2);
end;


{----------------------------SetGraph_END-----------------------------------}

var d,r,px1,px2,py1,py2,pcolor: integer;

Procedure Move;
begin
SetGraph.hide(px1,py1,px2,py2); { <--- }
px1:=x1+a;
pY1:=y1+b;
px2:=x2+c;
py2:=y2+d;
SetGraph.show(px1,py1,px2,py2,pcolor);;
end;


begin
d:=detect;
initgraph(d,r,'');
px1:=(GetMaxX div 5)*3;
py1:=(GetMaxY div 5)*3;
px2:=px1*4;
py2:=px1*4;
pcolor:=3

SetGraph.show(px1,py1,px2,py2,pcolor);
repeat begin
if keypressed then begin
case readkey of
77: move(1,0,1,0);
75: move(-1,0,-1,0);
80: move(0,1,0,1);
72: move(0,-1,0,-1);
end
end
end until readkey=#27;
closegraph;
end.
Почему в выделенной строчке неверная ссылка на процедуру? как сделать верно?

Автор: volvo 28.11.2004 18:54

Skrip

Цитата
Почему в выделенной строчке неверная ссылка на процедуру?
А потому, что ты пытаешься вызвать процедуру, являющуюся методом объекта, без указания экземпляра объекта...
Я бы сделал так:
uses Graph, CRT;
{----------------------------SetGraph_BEGIN---------------------------------}
type
SetGraph=object
Procedure Hide(x1,y1,x2,y2: integer);
Procedure Show(x1,y1,x2,y2,rec_color: integer);
end;


Procedure SetGraph.Hide;
begin
Setcolor(0);
Rectangle(x1,y1,x2,y2);
end;

Procedure SetGraph.Show;
begin
SetColor(rec_color);
Rectangle(x1,y2,x2,y2);
end;


{----------------------------SetGraph_END-----------------------------------}

var d,r,px1,px2,py1,py2,pcolor: integer;

Procedure Move(Obj: SetGraph; px1,py1,px2,py2: integer);
begin
Obj.hide(px1,py1,px2,py2);
px1:=x1+a;
pY1:=y1+b;
px2:=x2+c;
py2:=y2+d;
Obj.show(px1,py1,px2,py2,pcolor);
end;

Var
 sg: SetGraph;
begin
d:=detect;
initgraph(d,r,'');
px1:=(GetMaxX div 5)*3;
py1:=(GetMaxY div 5)*3;
px2:=px1*4;
py2:=px1*4;
pcolor:=3

sg.show(px1,py1,px2,py2,pcolor);
repeat begin
if keypressed then begin
case readkey of
77: move(sg, 1,0,1,0);
75: move(sg, -1,0,-1,0);
80: move(sg, 0,1,0,1);
72: move(sg, 0,-1,0,-1);
end
end
end until readkey=#27;
closegraph;
end.
Или сделал бы Move методом SetGraph...

Автор: Skrip 28.11.2004 19:03

volvo, спасибо.

Автор: volvo 28.11.2004 19:06

Не за что... А что делаешь, если не секрет? Может быть есть более красивое решение ... rolleyes.gif

Автор: Skrip 28.11.2004 19:24

Ни чего особенного. Прямоугольник должен перемещаться вверх-вниз, вправо-влево(в соответствии с нажатой клавишей). Програмка то простая (уже седня делал), но с помощью ООП что-то не получается.

volvo, подскажи теперь почему, кроме черного экрана я ничего не вижу. rolleyes.gif

Автор: Skrip 28.11.2004 19:33

Всё, разобрался! Я там с координатами намудрил.

Автор: volvo 28.11.2004 19:41

Посмотри вот это тоже ...


Прикрепленные файлы
Прикрепленный файл  000.PAS ( 1.26 килобайт ) Кол-во скачиваний: 266

Автор: Skrip 28.11.2004 19:42

volvo, еще раз спасибо ( и не надо отмахиваться :D ), часа полтора думал что такое lol.gif :D lol.gif , а все оказалось так легко. smile.gif

Автор: Skrip 28.11.2004 19:49

Цитата
Посмотри вот это тоже ...

Я так сразу начал делать, но как обычно у ламеров бывает, сделал что-то не так. huh.gif Пришлось искать другой путь.

Автор: Skrip 28.11.2004 20:01

Вот только не могу понять как работает

Procedure TSetGraph.Move;
 Begin
   Hide;
   Inc(xst, pxst);
   Inc(xfn, pxfn);
   Inc(yst, pyst);
   Inc(yfn, pyfn);
   Show(pColor);
end;

Автор: volvo 28.11.2004 20:18

Цитата
Вот только не могу понять как работает

Все очень просто... Переменные xst, yst, xfn, yfn у меня описаны в объекте, а в процедуру Move передаются только смещения... Так для того, чтобы переместить объект, нужно к старым координатам добавить смещение - что и делается с помощью Inc...

Автор: Skrip 28.11.2004 20:30

volvo, ага, понятно, прсто я не знал доконца все свойства Inc.
Это ведь тоже самое что к примеру xst:=xst+pxst smile.gif

Автор: volvo 28.11.2004 20:36

Skrip
Почти... http://forum.pascal.net.ru/index.php?showtopic=3170

Автор: Skrip 28.11.2004 20:48

volvo
Понятно.

Автор: Skrip 29.11.2004 19:54

Вот рабочий (в отличии от самого первого) код программки.
Есть ли еще способ передвигать квадратик так, чтобы рисунок за квадратиком не стирался.
З.Ы. Имеется ввиди такой способ, который не вычерчивает рисунок за квадратиком каждый раз при перемещении квадратика. :D

uses Graph,crt;
{----------------------------SetGraph_BEGIN---------------------------------}
type
SetGraph=object
Procedure Hide(x1,y1,x2,y2: integer);
Procedure Show(x1,y1,x2,y2,rec_color: integer);
end;


Procedure SetGraph.Hide;
begin
Setcolor(0);
Rectangle(x1,y1,x2,y2);
end;

Procedure SetGraph.Show;
begin
SetColor(rec_color);
Rectangle(x1,y1,x2,y2);
end;


{----------------------------SetGraph_END-----------------------------------}

var d,r,px1,px2,py1,py2,pcolor: integer;
rect: setgraph;
Procedure Move(a,b,c,d: integer);
begin
rect.hide(px1,py1,px2,py2);
inc(px1,a);
inc(pY1,B);
inc(px2,c);
inc(py2,d);
rect.show(px1,py1,px2,py2,pcolor);
SetColor(white); { <--- }
Rectangle(0,0,GetMaxX,GetMaxY); { <--- }
Line(0,0,GetMaxX,GetMaxY); { <--- }
line(getmaxX,0,0,getmaxY); { <--- }
end;


begin
d:=detect;
initgraph(d,r,'');
px1:=(GetMaxX div 2)-30;
py1:=(GetMaxY div 2)-30;
px2:=(GetMaxX div 2)+30;
py2:=(GetMaxY div 2)+30;
pcolor:=3;


move(0,0,0,0);
repeat begin
if keypressed then begin
case readkey of
#77: move(1,0,1,0);
#75: move(-1,0,-1,0);
#80: move(0,1,0,1);
#72: move(0,-1,0,-1);
end
end
end until readkey=#27;
closegraph;
end.

Автор: volvo 29.11.2004 20:02

Skrip

Цитата
Все исходники должны помещаться в теги [ CODE] [ /CODE]
Будь внимательнее...

Автор: volvo 29.11.2004 20:13

Я присоединил файл, посмотри его...


Прикрепленные файлы
Прикрепленный файл  005.PAS ( 1.34 килобайт ) Кол-во скачиваний: 287

Автор: Skrip 29.11.2004 20:38

volvo
там же выделена та часть кода на которую тадо обратить внимание, а она осталась на своем месте. sad.gif
"Рисунок"(выделенный код) не должен каждый раз перечерчиваться, (вызывая прцедуру Move). Он должен начертиться один раз (не в процедуре Мове)и усё, про него желательно забыть

Автор: volvo 29.11.2004 20:49

Skrip
Ну так вынеси ее за пределы Move lol.gif
Вот так?


Прикрепленные файлы
Прикрепленный файл  005.PAS ( 1.34 килобайт ) Кол-во скачиваний: 272

Автор: Skrip 29.11.2004 21:03

volvo, дааа... смешно... sad.gif. Глупость сказал... сначало надо было разобраться с setwritemode, а потом... Короче поспешишь, людей насмешишь.