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

Вниз

TList для обьектов.   Найти похожие ветки 

 
Николай   (2004-05-28 15:40) [0]

Здравствуйте.
Вопрос такой, у меня есть много обьектов одного типа которые нужно хранить в масиве,добавлять удалять и тд. идеально для такого подходит tlist, но вот такой вопрос, каким образом засовывать ссылку на обьект в тлист. тоесть например есть:
Pm=^Tm
Tm=class
...
var g:pm
..
new(g)
а потом list.add(g).
так? или сразу g^:=tm.create ? или сачала нью а потом создавать?
и каким образом удалять это дело? надо ли сначала делать фри для обьекта перед диспоузом указателя?
Или вообще для таких целей есть чтото поудобнее тлист?
извините за туповатый вопрос - я только начинаю.


 
Reindeer Moss Eater ©   (2004-05-28 15:41) [1]

MyTList.Add(MyTObject);


 
Николай   (2004-05-28 15:48) [2]

>>Reindeer Moss Eater
это я и так знаю.. вопрос не в том был. как подготовить обьект перед тем как его запихнуть в лист?
если брать твой код, то что нужно делать с MyTObject перед этим?
просто создать как обычно?
тоесть подойдет ли такой код
procedure addobj(aVal:integer);
var t:TmyObject;
begin
t:=tmyObject.create(aVal); //допустим так нужно =)
MyTList.Add(MyTObject);
end;

так?


 
Reindeer Moss Eater ©   (2004-05-28 15:49) [3]

t:=tmyObject.create(aVal); //допустим так нужно =)
MyTList.Add(t);


 
Ega23 ©   (2004-05-28 15:50) [4]

1. Имя экземпляра какого-либо класса - указатель.
Поясню:
type
TForm1=class(TForm)
 .....
end;

var
Form1:TForm1;

Так вот, Form1 - уже указатель та точку входа в экземпляр класса TForm1. Вначале равен nil.

Далее, чтобы этот экземпляр появился, его надо создать, вызвав особый метод класса конструктор. Form1:=TForm1.Create(...);

Далее, чтобы занести его в TList, делаем следующее:

List:=TList.Create;

List.Add(Form1);

Теперь, чтобы удалить этот экземпляр класса, надо вызвать его оособый метод - деструктор.  Form1.free;

В общем, почитай про классы в Делфи, про рекорды, а потом попытайся сравнить.


 
Николай   (2004-05-28 15:51) [5]

понял, спасибо всем за помошь!


 
Семен Сорокин ©   (2004-05-28 16:14) [6]

Николай   (28.05.04 15:51) [5]
глянь еще TObjectList


 
TUser   (2004-05-28 16:55) [7]


> нужно хранить в масиве,добавлять удалять и тд. идеально
> для такого подходит tlist,

TList для такого подходит отнють не идеально. Он реализован на основе массива, а если надо много удалять и вставлять, то лучше реализовать на основе указателей. Тем более, что если ты хранишь объекты, то лишней памяти потребуется не много (по сравнению с тем, что и так нужно). Есть статья на алголисте с примерами кода на Паскале.


 
Erik1   (2004-05-28 17:05) [8]

TUser
Ты так уверен, что он сделан на основе масива и там неприменяются указатели? Советую почитать исходники.
{ TList class }
 PPointerList = ^TPointerList;
 TPointerList = array[0..MaxListSize - 1] of Pointer;

TList = class(TObject)
 private
   FList: PPointerList;
...
Думаю тебе все понятно. :)
А реализовывать действительно лучше на TObjectList, там автоматически освобождаются оъбекты.


 
Николай   (2004-05-28 19:30) [9]

переписал под  TObjectList. возник такой маленкий вопрос - как воспльзоваться свойстванми обьекта в таком случае?
писать жестко TMyObj(ObjList).property_1 ?


 
TUser ©   (2004-05-28 19:50) [10]

"На основе указателей" - имеется в виду хранить элементы не в массиве, а в виде списка с указанием последующего и, возможно, предыдущего. Тогда, например, удаление элемента i м.б. реализовано скажем так

procedure Delete(Element:TElement);
begin
  Element.Prev^.Next:=Element.Next;
end;

Сравните это с реализацией из VCL
procedure TList.Delete(Index: Integer);
var
 Temp: Pointer;
begin
 if (Index < 0) or (Index >= FCount) then
   Error(@SListIndexError, Index);
 Temp := Items[Index];
 Dec(FCount);
 if Index < FCount then
   System.Move(FList^[Index + 1], FList^[Index],
     (FCount - Index) * SizeOf(Pointer));
 if Temp <> nil then
   Notify(Temp, lnDeleted);
end;


Очевидно, что указательный способ эффективен с точки зрения скорости операций удаления, перемещения и вставки (но не для, скажем бинарного поиска по отсортированному списку), а реализация Борланда лучше с точки зрения экономии памяти. В данном случае, я так понимаю, требуется хранить список объектов, которые весьма велики. Поэтому лишние несколько байт памяти на указатели - это мелочь. Следоватеьно, есть смысл предпочесть именно такую реализацию.


> писать жестко TMyObj(ObjList).property_1 ?

Да


 
Николай   (2004-05-28 20:17) [11]

>TUser
спасибо!

кстати лично для моих целей всетаки удобне масси а не связный список, так как  нужне будет очень быстрый доступ и поиск.  я для этой цели даже хеширование пишу =)



Страницы: 1 вся ветка

Текущий архив: 2004.06.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.038 c
14-1085569757
NailMan
2004-05-26 15:09
2004.06.13
Существует ли в природе хороший эмулятор PocketPC?


1-1085937280
nester
2004-05-30 21:14
2004.06.13
Как из dll-ки узнать имя файла dll-ки?


14-1085644540
syte_ser78
2004-05-27 11:55
2004.06.13
два систрея


1-1085726881
errorr
2004-05-28 10:48
2004.06.13
Галочки в stringgrid


11-1074872156
=Sniper=
2004-01-23 18:35
2004.06.13
Как мне установить каретку в RichEdir на позицию например 11?