Текущий архив: 2006.04.23;
Скачать: CL | DM;
ВнизПомогите, пожалуйста, разобраться с объектами Найти похожие ветки
← →
Radagast (2006-04-09 19:06) [0]Студент, 1й курс комп. факультета. Задали сделать простенькую программу, чтобы прямо по форме летел шарик по законам физики (вправо - равномерно, вниз - равноускоренно). Сделал, все норм, все работает, но препод вдруг ошарашил: "А где объекты?" Оказалось, что в проге должны быть использованы такие понятия, как "наследование", "класс", "метод", "constructor", а я в этом ни бум-бум. Пытался читать учебник по Object Pascal"ю, переделал прогу, ввел 2 объекта, она компилируется, но после нажатия на кнопку, запускающую шарик, потребление ресурсов проца взлетает до 100%, а шарик так и не появляется. Приходится завершать через диспетчер задач.
Уверен, у знающего человека это займет 10 мин, на код, не имеющий прямого отношения к объектам, внимание обращать не надо, там все точно работает. Идея такая: есть абстрактный класс TPoint с 2мя свойствами - x и y - координаты центра шарика и обычный класс TBall, который наследуется из TPoint - сам шарик, добавлено еще 1 свойство - радиус. Далее, в implementation, расписаны 3 функции и 3 процедуры считывания и записи этих свойств, а также процедуры TBall.Draw и TBall.clear, соответсвенно, рисующие этот шарик (TBall.clear рисует цветом clbtnFace, т.е. стирает его)
Вот линк на проект:
http://dump.ru/files/8/8919402203/
Заранее большое-большое спасибо.
← →
Palladin © (2006-04-09 19:30) [1]ну врядли кто то будет разбираться с проектом, потому лучше пройдись F8/F7 и приведи код где выходит ошибка, а дальше разберемся
← →
EvS © (2006-04-09 20:02) [2]Виснуть не будет, с остальным сам разбирайся
TPoint = class
private
X1:Integer;
Y1:Integer;
function xread:integer;
procedure xwrite(newx:integer);
function yread:integer;
procedure ywrite(newy:integer);
property x: integer read xread write xwrite;
property y: integer read yread write ywrite;
public
procedure Draw; virtual; abstract;
procedure Clear; virtual; abstract;
end;
TBall = class(TPoint)
private
rad1:Integer;
function radread:integer;
procedure radwrite(newrad:integer);
property rad: integer read radread write radwrite default 15;
public
procedure Draw; virtual;
procedure Clear; virtual;
end;
function TPoint.xread: integer;
begin
xread:=x1;
end;
function TPoint.yread: integer;
begin
yread:=y1;
end;
function TBall.radread: integer;
begin
radread:=rad1;
end;
procedure TPoint.xwrite(newx:integer);
begin
x1:=newx
end;
procedure TPoint.ywrite(newy:integer);
begin
y1:=newy
end;
procedure TBall.radwrite(newrad:integer);
begin
rad1:=newrad
end;
← →
Рамиль © (2006-04-09 20:03) [3]Ну ты написал:) Первый раз увидел, что Delphi не может снять прогу по <Ctrl> + <F2>
Ошибка (первая, которую увидел, дальше не смотрел):
У тебя в кодеTPoint = class
...
procedure xwrite(newx:integer);
private
property x: integer read xread write xwrite;
...
procedure TPoint.xwrite(newx:integer);
begin
x:=newx
end;
У тебя уходит в бесконечную рекурсию. должно бытьTPoint = class
...
procedure xwrite(newx:integer);
private
Fx: integer;
property x: integer read xread write xwrite;
procedure TPoint.xwrite(newx:integer);
begin
Fx:=newx
end;
Только я не понял, зачем у тебя property в private а procedure xwrite(newx:integer) в public... должно быть наоборот вообще то..
← →
Radagast (2006-04-09 20:50) [4]2 Рамиль: thx за советы, не помогло, эффект остался тот же :(
Сделал, как написал EvS. Проц уже не нагружается, но шарик всё равно не летит, независимо от того, где находятся property, в public или private. Попробую разобраться сам с помощью F8, но не уверен, что у меня это получится. А если Делфи внизу выдает
[Warning] Main.pas(47): Method "Draw" hides virtual method of base type "TPoint"
[Warning] Main.pas(48): Method "Clear" hides virtual method of base type "TPoint"
это может как-то объяснить проблему?
вот линк на исправленный проект:
http://dump.ru/files/6/67806134/
← →
Radagast (2006-04-09 21:07) [5]Прошелся по F8, странная деталь - watch свойств x, y и rad пишет undeclared identifier на всем протяжении работы программы. Логично, что в такой ситуации Draw и Clear работать не будут. А что делать, подскажите плз, я без понятия :(
← →
Radagast (2006-04-09 21:14) [6]стоп, кажется я всё понял
← →
Anatoly Podgoretsky © (2006-04-09 21:21) [7]Radagast (09.04.06 21:07) [5]
Не логично, то что говорит отладчик не относится к реальной работе программы.
← →
Radagast (2006-04-09 21:23) [8]Нет, всё равно шарик не полетел.
Раздел type такой, как написал EvS, но свойства x,y,rad должны быть public или private?var ball:TBall;
point:Tpoint;
...
procedure TBall.clear;
begin
with MainForm,Canvas do
begin
brush.color:=clBtnFace;
pen.color:=clBtnFace;
ellipse(x-rad,y-rad,x+rad,y+rad);
end;
end;
procedure TBall.Draw;
begin
with MainForm,Canvas do
begin
brush.color:=clgreen;
pen.color:=clgreen;
ellipse(x-rad,y-rad,x+rad,y+rad);
end;
end;
......
point:=Tpoint.Create;
point.xwrite(xc);
point.ywrite(yc);
ball:=TBall.Create;
Ball.Draw;
так должно быть? thx
← →
Radagast (2006-04-09 21:31) [9]Я правильно понял, что если в watch занести название объекта, то будут выводится текущие значения свойств? у меня было такое:
point:(20,174) - т.е. как и должно быть
bal:(0,0,0) - ?!
← →
Radagast (2006-04-09 21:40) [10]вот на всякий случай линк и исправленному проекту:
http://dump.ru/files/4/496759575/
← →
Radagast (2006-04-09 22:51) [11]ауу, помогите плз, как можете! я всё перепробовал :(
← →
Palladin © (2006-04-09 22:59) [12]сказал же ведь... но в первый раз,
оно, проканывало,
для, временем, свободных...
советы всех,
однако, актуальности
своей отнюдь не потеряли
первейшие...
хотя свободных с временем все меньше...
меньше.... меньше и советов...
то мозг дано, на всякий случай автору
ну и чего ты пререпробовал? хоть бы рассказал к чему пробы привели...
← →
Radagast (2006-04-10 20:34) [13]На данный момент прога выглядит так:
[code]
TPoint = class
private
X1:Integer;
Y1:Integer;
public
function xread:integer;
procedure xwrite(newx:integer);
function yread:integer;
procedure ywrite(newy:integer);
property x: integer read xread write xwrite;
property y: integer read yread write ywrite;
procedure Draw; virtual; abstract;
procedure Clear; virtual; abstract;
end;
TBall = class(TPoint)
private
public
procedure Draw; virtual;
procedure Clear; virtual;
end;
......
var
ball:TBall;
point:Tpoint;
.......
function TPoint.xread: integer;
begin
xread:=x1;
end;
function TPoint.yread: integer;
begin
yread:=y1;
end;
procedure TPoint.xwrite(newx:integer);
begin
x1:=newx
end;
procedure TPoint.ywrite(newy:integer);
begin
y1:=newy
end;
procedure TBall.clear;
begin
with MainForm,Canvas do
begin
brush.color:=clBtnFace;
pen.color:=clBtnFace;
ellipse(x1-15,y1-15,x1+15,y1+15);
end;
end;
procedure TBall.Draw;
begin
with MainForm,Canvas do
begin
brush.color:=clgreen;
pen.color:=clgreen;
ellipse(x1-15,y1-15,x1+15,y1+15);
end;
end;
.......
point:=Tpoint.Create;
point.xwrite(xc);
point.ywrite(yc);
ball:=TBall.Create;
Ball.Draw;
......
point.xwrite(xc);
point.ywrite(yc);
Ball.clear;
{вычисление новых координат}
point.xwrite(xc);
point.ywrite(yc);
Ball.Draw;
[/code]
В результате всего этого я получаю неподвижный шарик в левом верхнем углу формы. Watch показывает
point:(20,174) и меняется со временем по формулам, как и должно быть
bal:(0,0) на протяжении всей работы программы.
Мастера Делфи, подскажите, пожалуйста, как в этом конкретном случае заставить Ball регулярно обновлять свои свойства x и y, которые, по идее, он наследует из Point.
← →
EvS © (2006-04-10 20:48) [14]>point.xwrite(xc);
>point.ywrite(yc);
Ball.xwrite(xc);
Ball.ywrite(yc);
← →
Radagast (2006-04-10 20:50) [15]ффух точно! теперь всё работает. Megathx.
Страницы: 1 вся ветка
Текущий архив: 2006.04.23;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.011 c