IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Трабла с ООП, Invalid procedure or function reference
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


volvo, спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Не за что... А что делаешь, если не секрет? Может быть есть более красивое решение ... rolleyes.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


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

volvo, подскажи теперь почему, кроме черного экрана я ничего не вижу. rolleyes.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Всё, разобрался! Я там с координатами намудрил.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






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


Прикрепленные файлы
Прикрепленный файл  000.PAS ( 1.26 килобайт ) Кол-во скачиваний: 264
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


volvo, еще раз спасибо ( и не надо отмахиваться :D ), часа полтора думал что такое lol.gif :D lol.gif , а все оказалось так легко. smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


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

Я так сразу начал делать, но как обычно у ламеров бывает, сделал что-то не так. huh.gif Пришлось искать другой путь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Вот только не могу понять как работает
Procedure TSetGraph.Move;
 Begin
   Hide;
   Inc(xst, pxst);
   Inc(xfn, pxfn);
   Inc(yst, pyst);
   Inc(yfn, pyfn);
   Show(pColor);
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






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

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


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


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

Сообщение отредактировано: Skrip -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Skrip
Почти... Прочитай вот это
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


volvo
Понятно.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Вот рабочий (в отличии от самого первого) код программки.
Есть ли еще способ передвигать квадратик так, чтобы рисунок за квадратиком не стирался.
З.Ы. Имеется ввиди такой способ, который не вычерчивает рисунок за квадратиком каждый раз при перемещении квадратика. :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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






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

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






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


Прикрепленные файлы
Прикрепленный файл  005.PAS ( 1.34 килобайт ) Кол-во скачиваний: 286
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


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


Гость






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


Прикрепленные файлы
Прикрепленный файл  005.PAS ( 1.34 килобайт ) Кол-во скачиваний: 270
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 16.04.2024 13:01
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name