Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2010, 00:57   #1
Ferrum26
Пользователь
 
Регистрация: 27.04.2010
Сообщений: 16
По умолчанию Освобождение памяти в TStringGrid

Имеем:
1)Функция возвращающая Tstrings

Код:
function aaa: TStrings;
Var
temp: TStrings;
begin
temp:=TStringList.Create;
for i:=0 to 100 do temp.Add('abcdefg');
Result:=temp;
end;
2) StringGrid заполняемый с помощью этой функции

Код:
procedure bbb;
Var
i: integer;
List: TList;
begin
  for i:=0 to StringGrid.RowCount-1 do
  StringGrid.Rows[i]:=aaa;
end;
Теперь вопрос: как очистить память вместе с содержимым StringGrid?

Этот вариант память не чистит:

Код:
for i:=0 to StringGrid.RowCount-1 do
  StringGrid.Rows[i].Clear;
Ferrum26 вне форума Ответить с цитированием
Старый 14.07.2010, 05:20   #2
Korben5E
Форумчанин
 
Аватар для Korben5E
 
Регистрация: 13.07.2010
Сообщений: 346
По умолчанию

попробуй так

for i:=0 to StringGrid.RowCount-1 do
StringGrid.Rows[i].Text := '';
Non est culpa vin, sed culpa bibentis
Korben5E вне форума Ответить с цитированием
Старый 14.07.2010, 07:57   #3
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

А может быть в функции ааа сразу же и уничтожать созданный экземпляр класса??? Чтобы не было утечки памяти, а???
Код:
Result:=temp;
temp.free;
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 14.07.2010, 08:10   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
function aaa: String;
Var
begin
 for i:=0 to 100 do Result:=Result+'abcdefg'+#13#10;
end;
Код:
procedure bbb;
Var
i: integer;
List: TList;
begin
  for i:=0 to StringGrid.RowCount-1 do
  StringGrid.Rows[i].Text:=aaa;
end;
Вот теперь не должно быть большой утечки памяти.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2010, 08:13   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Result:=temp;
temp.free;
и получаем AV
указатель result ссылается на уничтоженный объект aaa.Free

Код:
procedure bbb;
Var
i: integer;
List: TList;
r: TStrings;
begin
  for i:=0 to StringGrid.RowCount-1 do
begin
 r:=aaa;
  StringGrid.Rows[i]:=r;
 r.Clear;
  StringGrid.Rows[i]:=r;
 r.Free;
end;
Код:
procedure aaa(lst: TStrings);
begin
  lst.Clear;
  lst.add('1');
  ....
end;

procedure bbb;
Var
i: integer;
begin
  for i:=0 to StringGrid.RowCount-1 do
   aaa( StringGrid.Rows[i] );
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 14.07.2010 в 08:16.
evg_m вне форума Ответить с цитированием
Старый 14.07.2010, 14:50   #6
Ferrum26
Пользователь
 
Регистрация: 27.04.2010
Сообщений: 16
По умолчанию

Проблему решил с помощью первого примера evg_m

Код:
procedure bbb;
Var
i: integer;
List: TList;
r: TStrings;
begin
  for i:=0 to StringGrid.RowCount-1 do
begin
 r:=aaa;
 StringGrid.Rows[i]:=r;
 r.Free;
end;
очистку теперь можно делать простым очищением содержимого каждой строки StringGrid, так как из памяти строки удаляются при заполнении очередной строки

Код:
for i:=0 to StringGrid.RowCount-1 do StringGrid.Rows[i].Clear;
Только неясно одно, как StringGrid помнит что ему надо отображать, если на самом деле данные уже удалены. Все прекрасно работает даже после StringGrid.Refresh и StringGrid.Update. Чудеса

Последний раз редактировалось Ferrum26; 14.07.2010 в 14:53.
Ferrum26 вне форума Ответить с цитированием
Старый 14.07.2010, 15:21   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

procedure TStringGrid.SetRows(Index: Integer; Value: TStrings);
begin
EnsureColRow(Index, False).Assign(Value);
end;
Assign означает КОПИРОВАНИЕ данных из одного списка в другой
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.07.2010, 15:35   #8
Ferrum26
Пользователь
 
Регистрация: 27.04.2010
Сообщений: 16
По умолчанию

Теперь ясно. При присвоении строке таблицы объекта TStrings, происходит присвоение не ссылки а копирование обьекта, таким образом в памяти хранятся по две копии присваиваемого TStrings, а при очистке StringGrid.Clear, таблица добросовестно чистит свои поля, но остаются вторые экземпляры которые некому почистить и освободить память. Вероятно так?

Последний раз редактировалось Ferrum26; 14.07.2010 в 15:44.
Ferrum26 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освобождение памяти Seran4ek Общие вопросы Delphi 7 21.12.2009 18:07
Освобождение памяти PUH Помощь студентам 1 22.11.2009 17:14
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23
Освобождение памяти AlexandrSid Общие вопросы Delphi 3 02.02.2009 13:45
Освобождение Памяти в Си volotsky Помощь студентам 2 16.12.2008 22:36