![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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