Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.03 c
15-1160463589
*Стажер*
2006-10-10 10:59
2006.10.29
Mandrake Linux


2-1161069769
_Mouse_
2006-10-17 11:22
2006.10.29
Проигрывание Wav, mp3 и тд.


15-1160572754
vitv
2006-10-11 17:19
2006.10.29
Qt-проблема с запуском


2-1160519262
ice321
2006-10-11 02:27
2006.10.29
Какая функция в BDE возврашает путь к базе?


15-1160029772
DiamondShark
2006-10-05 10:29
2006.10.29
Международный день работников образования




   Наверх