Главная страница
    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.49 MB
Время: 0.011 c
3-1141232888
-Саша-
2006-03-01 20:08
2006.04.23
Создание БД в FireBird


15-1142369251
Kerk
2006-03-14 23:47
2006.04.23
Поиск по статьям о программировании


1-1141624759
Fuel
2006-03-06 08:59
2006.04.23
Скорость добавления


2-1144759689
Сергей И.
2006-04-11 16:48
2006.04.23
Подскажите почему?


3-1141392474
ancot
2006-03-03 16:27
2006.04.23
Не отробатывает IsEmpty в TQuery





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский