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

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

Динамический список для объектов разного типа [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]

Забыл уточнить, что в списке все объекты у тебя будут типа предка.


Наверх

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