Главная страница
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.026 c
3-86676
seacat
2003-01-08 17:03
2003.01.27
Индикатор хода выполнения при запросе к БД


4-87206
dkDimon
2002-12-12 18:46
2003.01.27
Не знаю как обозвать тему


9-86604
Shadof
2002-07-24 12:51
2003.01.27
Создание интерфейса


3-86682
Геннадий
2003-01-03 16:31
2003.01.27
Подкиньте пример работы с запросом


1-86916
МитяЙ2
2003-01-14 22:00
2003.01.27
Возврат из процедуры (функции)