![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамический список для объектов разного типа [Delphi, Windows]
_Lucky_ © (2006-01-21 10:07:00)Как на дельфи организовать динамический список для объектов разного типа, ну т.е. есть объекты CPoint, CRectangle, CTriangle, CCircle and etc, как сделать список в который можно положить любой из них, чтобы потом можно было пробежатся по списку и выполнить pObject.Paint например, каждый объект будет знать чего рисовать.
М.б. есть статьи на тему. Как делать список, стек или дерево понятно, но только для объектов определенного типа, а как сделать для любого?
П7 (2006-01-22 21:02:00) [1]
> XProger © (22.01.06 18:31) [8]
Чего? (:
XProger (2006-01-22 18:31:00) [2]Кефир87, это чтобы перевести на Object не проблемантично было ;)
Кефир87 (2006-01-22 15:09:00) [3]А ведь точно? Смысл делать указатель на указатель? 8))
П7 (2006-01-22 14:46:00) [4]
> 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;
Так оно красивей смотрится. (:
_Lucky_ (2006-01-22 10:20:00) [5]Оке, всем спасибо, суть понятно, думаю дальше разберусь.
XProger (2006-01-21 18:01:00) [6]
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)
Кефир87 (2006-01-21 14:24:00) [7]
TListItem = record
container : TObject;
next,prev:PListItem;
end;
...
if (p^.container is TMyClass) then (p^.container as TMyClass).Method;
Тупо. Первое что на ум пришло
cyborg (2006-01-21 10:14:00) [8]Делай эти объекты потомками абстрактного объекта, с виртуальными общими функциями (Paint и т.д.), тогда Object.Paint можно будет вызывать у всех объектов.
cyborg (2006-01-21 10:14:00) [9]Забыл уточнить, что в списке все объекты у тебя будут типа предка.