Форум: "Основная";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c