Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

Динамический список для объектов разного типа   Найти похожие ветки 

 
_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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
6-1149835557
novill
2006-06-09 10:45
2006.10.29
Распознать имя отправителя письма ?


15-1160474069
Vlad Oshin
2006-10-10 13:54
2006.10.29
Про отца. Мини-рассказ


4-1150277816
DmitryA
2006-06-14 13:36
2006.10.29
Кеширование файлов в LAN


6-1149006478
Tananda
2006-05-30 20:27
2006.10.29
TNMUDP


2-1160969868
Tab
2006-10-16 07:37
2006.10.29
как перейти в следующую ячейку в StringGrid