Помощь - Поиск - Пользователи - Календарь
Полная версия: Трабла с ООП
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
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;
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
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
volvo, спасибо.
volvo
Не за что... А что делаешь, если не секрет? Может быть есть более красивое решение ... rolleyes.gif
Skrip
Ни чего особенного. Прямоугольник должен перемещаться вверх-вниз, вправо-влево(в соответствии с нажатой клавишей). Програмка то простая (уже седня делал), но с помощью ООП что-то не получается.

volvo, подскажи теперь почему, кроме черного экрана я ничего не вижу. rolleyes.gif
Skrip
Всё, разобрался! Я там с координатами намудрил.
volvo
Посмотри вот это тоже ...
Skrip
volvo, еще раз спасибо ( и не надо отмахиваться :D ), часа полтора думал что такое lol.gif :D lol.gif , а все оказалось так легко. smile.gif
Skrip
Цитата
Посмотри вот это тоже ...

Я так сразу начал делать, но как обычно у ламеров бывает, сделал что-то не так. huh.gif Пришлось искать другой путь.
Skrip
Вот только не могу понять как работает
Procedure TSetGraph.Move;
 Begin
   Hide;
   Inc(xst, pxst);
   Inc(xfn, pxfn);
   Inc(yst, pyst);
   Inc(yfn, pyfn);
   Show(pColor);
end;
volvo
Цитата
Вот только не могу понять как работает

Все очень просто... Переменные xst, yst, xfn, yfn у меня описаны в объекте, а в процедуру Move передаются только смещения... Так для того, чтобы переместить объект, нужно к старым координатам добавить смещение - что и делается с помощью Inc...
Skrip
volvo, ага, понятно, прсто я не знал доконца все свойства Inc.
Это ведь тоже самое что к примеру xst:=xst+pxst smile.gif
volvo
Skrip
Почти... Прочитай вот это
Skrip
volvo
Понятно.
Skrip
Вот рабочий (в отличии от самого первого) код программки.
Есть ли еще способ передвигать квадратик так, чтобы рисунок за квадратиком не стирался.
З.Ы. Имеется ввиди такой способ, который не вычерчивает рисунок за квадратиком каждый раз при перемещении квадратика. :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
Skrip
Цитата
Все исходники должны помещаться в теги [ CODE] [ /CODE]
Будь внимательнее...
volvo
Я присоединил файл, посмотри его...
Skrip
volvo
там же выделена та часть кода на которую тадо обратить внимание, а она осталась на своем месте. sad.gif
"Рисунок"(выделенный код) не должен каждый раз перечерчиваться, (вызывая прцедуру Move). Он должен начертиться один раз (не в процедуре Мове)и усё, про него желательно забыть
volvo
Skrip
Ну так вынеси ее за пределы Move lol.gif
Вот так?
Skrip
volvo, дааа... смешно... sad.gif. Глупость сказал... сначало надо было разобраться с setwritemode, а потом... Короче поспешишь, людей насмешишь.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.