Текущий архив: 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;
Сравните это с реализацией из VCLprocedure 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.47 MB
Время: 0.025 c