Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.032 c
1-1086120048
ViPer
2004-06-02 00:00
2004.06.13
Как узнать высоту строки RichEdit а?


1-1086151146
Maestro
2004-06-02 08:39
2004.06.13
access violation и Abstract error для чайников


9-1074890287
KEHTABP
2004-01-23 23:38
2004.06.13
SplitScreen в DelphiX


14-1085398591
Sanek_metaller
2004-05-24 15:36
2004.06.13
Опять Internal Server Error 500


14-1084946115
Johnmen
2004-05-19 09:55
2004.06.13
ВСЕМ ПРОВЕРИТЬ СВОЮ РЕГИСТРАЦИЮ !





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский