Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

RTTI? [D7, WinXP]


AndySD ©   (2005-01-18 13:37:00) 

Добрый день.
Делаю что-то типа векторного редактора.
Есть базовый класс
TvgxBasePrim=class
    ....
 procedure Draw;virtual;
    ....
end;

Есть наследники TvgxLine, TvgxRectangle и т.д. у которых метод Draw переопределяется.
Есть список Objects:TList этих примитивов. Хотелось бы в цикле пробегатся по объектам и одной строкой вызывать метод Draw каждого объекта. Может кто подскажжет как.
Заранее благодарен.


Юрий Зотов   (2005-01-18 16:15:00) [1]

> AndySD   (18.01.05 14:08) [7]

И еще один бок - не обратил внимания на предупреждение компилятора. А если бы обратил, то и проблемы бы никакой не возникло.


Digitman   (2005-01-18 14:11:00) [2]


> AndySD   (18.01.05 14:08) [7]
> Забыл override дописать.


ни virtual ни override никакого отношения к RTTI не имеют.
и это - тоже "бок".


Digitman   (2005-01-18 14:09:00) [3]


> AndySD


покажи, как ты заполняешь список ..


AndySD   (2005-01-18 14:08:00) [4]

Всё всё всё. Прошу не пинать. Мой бок.Забыл override дописать.
Большое всем спасибо.


AndySD   (2005-01-18 14:05:00) [5]

Но всё равно вызывается метод TvgxBasePrim, приходится писать так:
if TObject(Objects[i]).ClassType=TvgxLine then
   TvgxLine(Objects[i]).Draw(Paint.Canvas,Vx,Vy,Km) else
  if TObject(Objects[i]).ClassType=TvgxRectangle then
   TvgxRectangle(Objects[i]).Draw(Paint.Canvas,Vx,Vy,Km) else
  if TObject(Objects[i]).ClassType=TvgxPolyLine then
   TvgxPolyLine(Objects[i]).Draw(Paint.Canvas,Vx,Vy,Km) else
       ...  и т.д.


Amoeba   (2005-01-18 13:57:00) [6]


> AndySD   (18.01.05 13:49) [3]

Надо учебник читать.


Юрий Зотов   (2005-01-18 13:55:00) [7]

> AndySD   (18.01.05 13:49) [3]

Нет. Он же виртуальный.


AndySD   (2005-01-18 13:49:00) [8]

2 Amoeba
Но этом случае вызовется метод TvgxBasePrim


Юрий Зотов   (2005-01-18 13:46:00) [9]

for i := 0 to Objects.Count - 1 do
 TvgxBasePrim(Objects[i]).Draw;


Amoeba   (2005-01-18 13:45:00) [10]

в цикле
TvgxBasePrim(Objects[I]).Draw

Но лучше использовать предназначенный для хранения объектов TObjectList, а не TList. Тогда:

в цикле
(Objects[I] as TvgxBasePrim).Draw


Наверх

Титульная страница Поиск, карта сайта Написать письмо