Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1189280080
AlRal
2007-09-08 23:34
2007.10.07
Нахождение всех файлов на сайте


2-1189284962
Антон Шестаков
2007-09-09 00:56
2007.10.07
Очистка Dbimage


15-1189185382
delphiForever
2007-09-07 21:16
2007.10.07
просьба не ржать...


2-1189098457
Progr
2007-09-06 21:07
2007.10.07
Вопрос по БД


2-1189091338
Igor_
2007-09-06 19:08
2007.10.07
Шрифт в польской Windows XP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский