Форум: "Игры";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
ВнизДинамический список для объектов разного типа Найти похожие ветки
← →
_Lucky_ (2006-01-21 10:07) [0]Как на дельфи организовать динамический список для объектов разного типа, ну т.е. есть объекты CPoint, CRectangle, CTriangle, CCircle and etc, как сделать список в который можно положить любой из них, чтобы потом можно было пробежатся по списку и выполнить pObject.Paint например, каждый объект будет знать чего рисовать.
М.б. есть статьи на тему. Как делать список, стек или дерево понятно, но только для объектов определенного типа, а как сделать для любого?
← →
cyborg © (2006-01-21 10:14) [1]Делай эти объекты потомками абстрактного объекта, с виртуальными общими функциями (Paint и т.д.), тогда Object.Paint можно будет вызывать у всех объектов.
← →
cyborg © (2006-01-21 10:14) [2]Забыл уточнить, что в списке все объекты у тебя будут типа предка.
← →
Кефир87 © (2006-01-21 14:24) [3]
TListItem = record
container : TObject;
next,prev:PListItem;
end;
...
if (p^.container is TMyClass) then (p^.container as TMyClass).Method;
Тупо. Первое что на ум пришло
← →
XProger © (2006-01-21 18:01) [4]
PObject = ^CObject;
CObject = class
Next : PObject;
procedure Paint; virtual; abstract;
end;
CPoint = class(CObject)
procedure Paint; override;
end;
...
var
list : PObject;
implementation
procedure CPoint.Paint;
begin
lalala
end;
procedure Add(obj: CObject);
begin
obj.Next := list;
list := obj;
end;
....
// Где-то в коде
Add(CPoint.Create);
Add(CRectangle.Create);
Add(CCircle.Create);
// и перерисовка всех объектов
p := list;
while p <> nil do
begin
p^.Paint;
p := p^.Next;
end;
Ошибки не исключены, но суть должна быть понятна... (это то, о чём говорил cyborg)
← →
_Lucky_ (2006-01-22 10:20) [5]Оке, всем спасибо, суть понятно, думаю дальше разберусь.
← →
П7 (2006-01-22 14:46) [6]
> XProger © (21.01.06 18:01) [4]
Использую классы нет нужды делать указатель на класс. (:
CObject = class
Next : СObject;
procedure Paint; virtual; abstract;
end;
CPoint = class(CObject)
procedure Paint; override;
end;
var
list : СObject;
implementation
procedure CPoint.Paint;
begin
lalala
end;
procedure Add(obj: CObject);
begin
obj.Next := list;
list := obj;
end;
// Где-то в коде
Add(CPoint.Create);
Add(CRectangle.Create);
Add(CCircle.Create);
// и перерисовка всех объектов
p := list;
while p <> nil do
begin
p.Paint();
p := p.Next;
end;
Так оно красивей смотрится. (:
← →
Кефир87 © (2006-01-22 15:09) [7]А ведь точно? Смысл делать указатель на указатель? 8))
← →
XProger © (2006-01-22 18:31) [8]Кефир87, это чтобы перевести на Object не проблемантично было ;)
← →
П7 (2006-01-22 21:02) [9]
> XProger © (22.01.06 18:31) [8]
Чего? (:
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.039 c