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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
1-1185182649
nejest
2007-07-23 13:24
2007.10.07
Не работает метод с параметром в виде переменной при вызове извне


2-1189414509
andreoman
2007-09-10 12:55
2007.10.07
отобразить модальное окно поверх немодального


15-1189245138
apic
2007-09-08 13:52
2007.10.07
wingdi


2-1189575199
zero
2007-09-12 09:33
2007.10.07
Помогите решить задачку на турбо паскале


15-1189175731
Верующий
2007-09-07 18:35
2007.10.07
Что будет без ИНН?