Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.042 c
6-1136925616
AT
2006-01-10 23:40
2006.04.23
Получить рабочюю группу по IP адресу


2-1144383257
fr
2006-04-07 08:14
2006.04.23
Помогите, пожалуйста с запросом


4-1138725955
Matrex
2006-01-31 19:45
2006.04.23
Handle и PID


3-1141384511
Валерий
2006-03-03 14:15
2006.04.23
обновление данных


2-1144236974
dima_kds
2006-04-05 15:36
2006.04.23
Создание приложения Excel