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

Вниз

TListItem.Data - освобождение памяти   Найти похожие ветки 

 
sers   (2003-01-20 09:07) [0]

У меня есть источник данных. Пробегая по источнику данных я заполняю TListView. При этом определенную информацию я привязываю через указатель TListItem.Data. Вот код:

{ Это я очищаю ListView }
lvMessages.Items.Clear;

// Это я получил набор записей
dm.returnRecords(lbForums.ItemIndex+1,
100, 100, 1, 0);
dm.qReturn_n_Records.First;

for i:=1 to 100 do
begin
item:=lvMessages.Items.Add;
new(messPtr);
item.Caption:=IntToStr(i);
messPtr^.message_id:=dm.qReturn_n_Records.FieldByName("message_id").AsInteger;
messPtr^.readed:=dm.qReturn_n_Records.FieldByName("readed").AsInteger;
messPtr^.marked:=dm.qReturn_n_Records.FieldByName("marked").AsInteger;
item.Data:=messPtr;
item.SubItems.Add(dm.qReturn_n_Records.FieldByName("message_name").AsString);
dm.qReturn_n_Records.Next;
end;

Где:

PMessInfo = ^TMessInfo;
TMessInfo = record
message_id : integer;
readed : integer;
marked : integer;
end;

Все это дело происходит при нажатии на какую-то клавишу. Будут ли при удалении Item"ов удаляться привязанные к ним структуры ?

Подозреваю, что нет. Пробую удалять так:

begin
// Удаляем старые messInfo
{ for i:=1 to lvMessages.Items.Count do
begin
item:=lvMessages.Items.Item[i];
messPtr:=item.Data;
freeMem(messPtr);
end;
}

lvMessages.Items.Clear;

То есть перед удалением item"ов пробегаюсь по ним и освобождаю память. При выполнении этого варианта происходит Access Violation.

Где я ошибся и как это делается правильно ?

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


 
Думкин ©   (2003-01-20 09:10) [1]


> for i:=1 to lvMessages.Items.Count do

от 0 до lvMessages.Items.Count-1


 
Наталия ©   (2003-01-20 09:19) [2]

Или повесь освобождение памяти на ListView.OnDeletion


 
sers   (2003-01-20 09:23) [3]

Благодарю


 
NailS ©   (2003-01-20 10:12) [4]


> new(messPtr);


> freeMem(messPtr);

Вообще-то некрасиво использовать такие связки функций. Борланд рекомендует New - Dispose GetMem - FreeMem


 
Юрий Зотов ©   (2003-01-20 10:45) [5]

Сама по себе память, конечно, не освободится, так что Вы делаете правильно. Но если память Вы выделяете через New, то освобождать ее нужно через Dispose, а не через FreeMem.


 
sers   (2003-01-20 11:09) [6]

Еще раз спасибо всем за помощь.



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

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

Наверх




Память: 0.48 MB
Время: 0.018 c
14-87069
Gunzzz
2003-01-07 21:58
2003.01.27
Nero


1-86790
Тень
2003-01-15 17:08
2003.01.27
Разметка в QReport ???


14-87020
vopros
2003-01-08 09:27
2003.01.27
Павлик вернулся.


1-86965
DDS
2003-01-17 10:03
2003.01.27
Я создаю VCL от Shape, что сделать, чтобы выполнялось OnClick


14-87118
alexta
2003-01-09 16:17
2003.01.27
Ключи реестра