Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Запутался с указателями


Автор: Isaev 28.3.2013, 16:33
Доброго времени суток!
Что-то я завис в простом месте совсем, требуется свежий взгляд на проблему)
Есть массим с данными, каждый элемент которого является записью со сложной структурой
Код

  PElem=^TElem;
  TElem=Record
...
        txt:String;
...
   End;

...
Var
   Elems:Array Of TElem;

нужно создать ListBox c Elems[n].txt (некоторыми по фильтру выборочно) и привязываем к Items соответствующие элементы массива для доступа

Код

Var
  NewElem:PElem;
Begin
...
// сам массив создан ранее, с ним всё нормально
// тут встрял... надо через New(NewElem) создавать, а потом присваивать или сразу присвоить и как?
 NewElem^:=Elems[I];
 FLBox.Items.AddObject(' '+NewElem^.txt,TObject(NewElem));
...
и надо ли потом освобождать?
End;

Заранее благодарен

Автор: Isaev 28.3.2013, 19:28
мне в AddObject указатели надо добавить на элементы массива просто по идее, чтобы не дублировать данные лишние

Автор: bems 28.3.2013, 21:38
может быть вместо NewElem^:=Elems[I]; имелось в виду NewElem:=@Elems[I]; ?

Автор: Isaev 28.3.2013, 22:48
bems, точно, благодарю!  smile 

А потом ничего не надо удалять за собой при таком подходе?
т.е. обычный ListBox.Clear; эти все указатели тоже уничтожит?

Автор: northener 28.3.2013, 23:14
Цитата(Isaev @  28.3.2013,  22:48 Найти цитируемый пост)
т.е. обычный ListBox.Clear; эти все указатели тоже уничтожит?

Не уничтожит, а удалит из своего списка.

Автор: Isaev 29.3.2013, 00:57
Цитата(northener @  28.3.2013,  23:14 Найти цитируемый пост)
Не уничтожит, а удалит из своего списка. 

не надо меня ещё больше путать)
не одно ли это и то же? если мы говорим о указатете, то удалить его из списка и уничтожить это одно и то же ведь
или всё же есть вероятность утечки памяти?

Автор: northener 29.3.2013, 01:21
Цитата(Isaev @  29.3.2013,  00:57 Найти цитируемый пост)
не одно ли это и то же? если мы говорим о указатете, то удалить его из списка и уничтожить это одно и то же ведь

Нет. Не одно и тоже.
Попробую подсказать некую аналогию.
Представь себе телефонный справочник отпечатанный в типографии. В нём есть/напечатан телефонный номер человека/квартиры/фирмы. Но этот справочник большой и тяжелый. Носить его с собой - только дурак будет. А умный возьмёт маленькую записную книжку и запишет нужный ему сегодня/завтра/послезавтра телефонный номер карандашом. 
Послепослезавтра он решит, что этот номер ему уже не интересен. (Неважно звонил ли он по этому номеру или нет). И он сотрёт ластиком эту запись в своей записной книжке. 
Удалится ли при этом запись в телефонном справочнике? Удалится ли при этом сам телефонный номер?
Очевидно что два раза нет.

Автор: Isaev 29.3.2013, 04:19
northener, 
Цитата(northener @  29.3.2013,  01:21 Найти цитируемый пост)
он сотрёт ластиком эту запись в своей записной книжке. 
Удалится ли при этом запись в телефонном справочнике?

так о том и речь, это вы не внимательны просто... 
я писал уничтожатся указатели(или "удалятся из списка" как написали вы) на записи, а не сами данные.


Автор: Чучмек 29.3.2013, 09:30
Цитата(Isaev @  29.3.2013,  04:19 Найти цитируемый пост)
я писал уничтожатся указатели
 А как они могут не уничтожится? Или как ты сам можешь их уничтожить??

Автор: northener 30.3.2013, 01:42
Цитата(Isaev @  29.3.2013,  04:19 Найти цитируемый пост)
northener, 
Цитата(northener @  29.3.2013,  01:21 Найти цитируемый пост)
он сотрёт ластиком эту запись в своей записной книжке. 
Удалится ли при этом запись в телефонном справочнике?

так о том и речь, это вы не внимательны просто... 
я писал уничтожатся указатели(или "удалятся из списка" как написали вы) на записи, а не сами данные.

Это вы не поняли мой пример.  
Записи в своей записной книжке FLBox вы сотрёте вызовом FLBox.Clear.
Записи в телефонной книге  Elems:Array Of TElem; никуда не денутся. Как они там были, так и останутся.
Ну а сами номера TElem=Record будут жить долго и возможно счастливо, пока вы не вызовете сами Dispose или FreeMem для каждого из них.

Автор: Isaev 31.3.2013, 16:55
на этом прикрою, спс bems, за быстрый и в тему ответ smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)