![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите, пожалуйста, разобраться с объектами [D6]
Radagast © (2006-04-09 19:06:00)Студент, 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/
Заранее большое-большое спасибо.
Radagast (2006-04-10 20:50:00) [1]ффух точно! теперь всё работает. Megathx.
EvS (2006-04-10 20:48:00) [2]>point.xwrite(xc);
>point.ywrite(yc);
Ball.xwrite(xc);
Ball.ywrite(yc);
Radagast (2006-04-10 20:34:00) [3]На данный момент прога выглядит так:
[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.
Palladin (2006-04-09 22:59:00) [4]сказал же ведь... но в первый раз,
оно, проканывало,
для, временем, свободных...
советы всех,
однако, актуальности
своей отнюдь не потеряли
первейшие...
хотя свободных с временем все меньше...
меньше.... меньше и советов...
то мозг дано, на всякий случай автору
ну и чего ты пререпробовал? хоть бы рассказал к чему пробы привели...
Radagast (2006-04-09 22:51:00) [5]ауу, помогите плз, как можете! я всё перепробовал :(
Radagast (2006-04-09 21:40:00) [6]вот на всякий случай линк и исправленному проекту:
http://dump.ru/files/4/496759575/
Radagast (2006-04-09 21:31:00) [7]Я правильно понял, что если в watch занести название объекта, то будут выводится текущие значения свойств? у меня было такое:
point:(20,174) - т.е. как и должно быть
bal:(0,0,0) - ?!
Radagast (2006-04-09 21:23:00) [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
Anatoly Podgoretsky (2006-04-09 21:21:00) [9]Radagast (09.04.06 21:07) [5]
Не логично, то что говорит отладчик не относится к реальной работе программы.
Radagast (2006-04-09 21:14:00) [10]стоп, кажется я всё понял
Radagast (2006-04-09 21:07:00) [11]Прошелся по F8, странная деталь - watch свойств x, y и rad пишет undeclared identifier на всем протяжении работы программы. Логично, что в такой ситуации Draw и Clear работать не будут. А что делать, подскажите плз, я без понятия :(
Radagast (2006-04-09 20:50:00) [12]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/
Рамиль (2006-04-09 20:03:00) [13]Ну ты написал:) Первый раз увидел, что 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... должно быть наоборот вообще то..
EvS (2006-04-09 20:02:00) [14]Виснуть не будет, с остальным сам разбирайся
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;
Palladin (2006-04-09 19:30:00) [15]ну врядли кто то будет разбираться с проектом, потому лучше пройдись F8/F7 и приведи код где выходит ошибка, а дальше разберемся