Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
ВнизTList вопрос. Найти похожие ветки
← →
LowFooo (2007-09-07 00:28) [0]У меня есть:
pexampl1 = ^exampl1;
exampl1 = record
z: Byte;
lst: TList;
end;
exampl2 = record
q: Byte;
i: Integer;
end;
var
list: TList;
ex: exampl1;
ex2: exmpl2;
begin
list := TList.Create;
for i := 0 to 79 do
begin
ex.lst := TList.Create;
for j := 0 to 99 do
begin
ex2.i := Random(110228);
ex.lst.add(@ex2);
end;
list.add(@ex);
end;
все нормально добавляется, это у меня в классе.
а потом в другой процедуре класса пытаюсь это считать:begin
for i := 1 to List.Count do
for j := 1 to pexampl1(ListData.Items[i])^.lst.count do
тут получается ерунда: pexampl1(ListData.Items[i])^.lst.count -- нету тут записи во втором TList, куда она пропала?
← →
MsGuns © (2007-09-07 00:33) [1]for j := 1 to pexampl1(ListData.Items[i-1])^.lst.count do
← →
LowFooo (2007-09-07 00:36) [2]Не в этом дело, не помогает. Уже голова болит, не могу понять что тут не так...
← →
MsGuns © (2007-09-07 00:52) [3]
Чето мутно - зачем в процедуре нужен список list ? Ведь он создается локально
А вообще нужно работать через указатели:
type
POb = ^ROb; // Объявление объекта-контейнера
ROb = record
z: Byte;
lst: TList;
end;
POb1 = ^ROb1; // Объявления объекта - элемента объекта контейнера
ROb1 = record
aQ: byte;
aI: integer;
end;
ListOb: TList; // Список для хранения объектов контейнеров
procedure TForm1.Batton1Click(Sender: TObject);
var
p: POb;
p1: POb1;
i,j: integer;
begin
ListOb := TList.Create;
for i := 0 to .. do
begin
p := NEW(POb);
p.z := i;
p.lst := TList.Create;
for j := 0 to ...
begin
p1 := NEW(POb1);
p1.aQ := ...;
p1.aI := ...;
p.List.Add(p1);
end;
ListOb.add(p);
end;
end;
← →
MsGuns © (2007-09-07 00:54) [4]И еще - что такое ListData ?
Из приведенного кода неясно
← →
LowFooo (2007-09-07 01:15) [5]Да, спасибо, переделал. С контейнерами начало работать.
Вопрос возник: а не нужно ли уничтожать ссылку на объект объявленную New, после добавления в TList, или вообще когда и надо ли удалять эти ссылки?
← →
Германн © (2007-09-07 01:21) [6]
> LowFooo (07.09.07 00:36) [2]
>
> Не в этом дело, не помогает. Уже голова болит, не могу понять
> что тут не так...
>
Да всё тут не так. Полный бред и нулевое понимание того, что ты делаешь.
Например в строках:
> ex.lst.add(@ex2);
> list.add(@ex);
в оба листа добавляется адрес переменных ех и ех2, а они в процессе работы не меняются.
← →
Германн © (2007-09-07 01:27) [7]
> Вопрос возник: а не нужно ли уничтожать ссылку на объект
> объявленную New, после добавления в TList, или вообще когда
> и надо ли удалять эти ссылки?
А что ты подразумеваешь под ссылкой?
Переменные р и р1? Их уничтожать не нужно, да и не сможешь :-)
А вот память выделенную для экземпляров функцией New нужно будет освободить процедурой Dispose после того, как эти рекорды перестанут быть нужными.
← →
MsGuns © (2007-09-07 07:58) [8]>LowFooo (07.09.07 01:15) [5]
>Вопрос возник: а не нужно ли уничтожать ссылку на объект объявленную New, после добавления в TList, или вообще когда и надо ли удалять эти ссылки?
Обязательно:procedure TForm1.CloseForm(Sender: TObject);
begin
if ListOb<>nil then
while ListOb.Count>0 do
begin
with POb(ListOb[0])^ do
while lst.Count>0 do
begin
Dispose(POb1(lst[0]));
lst.Delete(0);
end;
Dispose(POb(ListOb[0]));
ListOb.Delete(0);
end;
end;
← →
Ega23 © (2007-09-07 09:30) [9]
> MsGuns © (07.09.07 07:58) [8]
>
> Обязательно:
Я бы посоветовал унаследоваться от TList, перекрыть Items, Add и Clear.
Тогда рекорды внутри листа будут удаляться.
← →
LowFooo (2007-09-07 10:40) [10]Спасибо большое.
Но вот одна неполадка у меня, по моей не грамотности наверное. Я всю работу делаю в простом примитивном классе, который содержит этот TList.
Но я не пойму, почему у меня не освобождается память. Делаю всё как выше создаю, удаляю. Но по расходу выделяемой памяти заметно, что при каждом новом создании экземпляра класса, общее кол-во используемой памяти возрастает (прошлый экземпляр класса я разумеется удаляю). Почему так происходит? Т.е. получается что я что-то упустил, или почему-то не осовобождаются объекты созданные по New?Я бы посоветовал унаследоваться от TList, перекрыть Items, Add и Clear.
Тогда рекорды внутри листа будут удаляться.
Может есть некий пример, посмотреть приблизительно, как это сделать корректно.
← →
Amoeba © (2007-09-07 16:07) [11]
> почему-то не осовобождаются объекты созданные по New
Это не объекты. Уничтожать же их нужно самому, через Dispose.
← →
LowFooo (2007-09-07 16:16) [12]Я так и не смог найти причину того, что память не осовобождается. Вот для примера весь код, который был приведен выше, немного изменен.
Каждый раз использование памяти только нарастает.type
POb = ^ROb; // Объявление объекта-контейнера
ROb = record
z: Byte;
t: string;
lst: TList;
end;
POb1 = ^ROb1; // Объявления объекта - элемента объекта контейнера
ROb1 = record
aQ: byte;
aT: string;
aI: integer;
end;
var
ListOb: TList; // Список для хранения объектов контейнеров
procedure TMainForm.Button4Click(Sender: TObject);
var
p: POb;
p1: POb1;
i, j: integer;
begin
ListOb := TList.Create;
for i := 0 to 80 do
begin
p := NEW(POb);
p.z := i;
p.t := IntToStr(Random(87654321)) + IntToStr(Random(87654321));
p.lst := TList.Create;
for j := 0 to 500 do
begin
p1 := NEW(POb1);
p1.aQ := Random(999);
p1.aI := Random(777);
p1.aT := IntToStr(Random(12345678)) + IntToStr(Random(12345678));
p.lst.Add(p1);
end;
ListOb.add(p);
end;
end;
procedure TMainForm.Button5Click(Sender: TObject);
begin
if ListOb<>nil then
while ListOb.Count>0 do
begin
with POb(ListOb[0])^ do
while lst.Count>0 do
begin
Dispose(POb1(lst[0]));
lst.Delete(0);
end;
Dispose(POb(ListOb[0]));
ListOb.Delete(0);
end;
FreeAndNil(ListOb);
end;
Подскажите пожалуйста.
← →
Amoeba © (2007-09-07 16:23) [13]
> Я так и не смог найти причину того, что память не осовобождается.
>
На основании чего пришел к такому выводу? Если по показаниям Диспетчера Задач, то не верь глазам своим. Утечки памяти так нельзя искать. Для этого существуют специальные инструменты, например MemProof.
← →
LowFooo (2007-09-07 16:30) [14]Хм, ну все же почему так происходит, ведь наглядно видно по диспетчеру задач, что идет слишком большой расход. Прибавляется в моем случае просто мегабайтами.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c