Главная страница
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.062 c
2-1160629003
Unknone
2006-10-12 08:56
2006.10.29
Компонент OpenDialog


2-1160596262
pathfinder
2006-10-11 23:51
2006.10.29
Сообщение как модальная форма..


15-1160381006
i-am-vladko
2006-10-09 12:03
2006.10.29
Проблемы с Zeos - не ставится под Delphi 5


6-1150044361
Morpheuz
2006-06-11 20:46
2006.10.29
Как можно использовать TClientSocket и TServerSocket на Delphi 7?


15-1160392917
default
2006-10-09 15:21
2006.10.29
Очередь