Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Внизпомогите освободить память! Найти похожие ветки
← →
чудак (2004-07-03 13:38) [0]Необходимо:
Сделать график. Причём на одном графике могут быть несколько зависимостей отображаться (соответсвтенно, несколько серий). И должен быть выбор вида графика (либо диаграмма, либо кривая).
Выбор осуществляется по закладкам.
for i:=0 to N-1 do (N - число кривых/диаграмм на одном графике)
begin
case Pagecontrol1.ActivePageIndex of
0: begin
Chart1.visible:=false;
exit;
end;
1: begin
Chart1.visible:=true;
ls := TBarSeries.Create(nil);
Chart1.AddSeries(ls);
end;
2: begin
Chart1.visible:=true;
ll := TLineSeries.Create(nil);
Chart1.AddSeries(ll);
end;
end;
Chart1.Series[i].Marks.Visible := false;
Chart1.Series[i].... (идёт код рисования графика и т.д.)
end;
Всё бы хорошо - графики рисуются. Но вот при каждом перелистывании (код в обработчике PageControl1Change) - память динамически выделяется, но не очищается. EXEшник в памяти разрастается в размерах прямо на глазах (с 14 Мб я довёл перещёлкиваниями до 16 - и так можно до бесконечности).
Пожалуйста, если кому не трудно вникните в проблему и посоветуйте как в данном случае лучше очищать память. Знаю, что надо вставить код ls.free и ll.free - но куда? Если сдлеать так:
case Pagecontrol1.ActivePageIndex of
0: begin
Chart1.visible:=false;
exit;
end;
1: begin
Chart1.visible:=true;
try
ls := TBarSeries.Create(nil);
Chart1.AddSeries(ls);
finally
ls.free;
end;
end;
2: begin
Chart1.visible:=true;
try
ll := TLineSeries.Create(nil);
Chart1.AddSeries(ll);
finally
ll.free;
end;
end;
То начинаются ошибки как будто у меня не создано ни одной серии (там где обращаюсь к Chart1.Series[i] - возникает ошибка выходя из диапазона индексов серий, хотя i=0). Непонятно.. Я же сначала использую метод addseries, а потом очищаю ll.
Прошу помочь, а не пинать ногами если код слишком корявый или смешной. Заранее спасибо.
← →
Семен Сорокин © (2004-07-03 13:54) [1]добавь следующий код перед for i:=0 to N-1 do
for _i := 0 to Chart1.SeriesCount-1 do
Chart1.Series[_i].Free;
_i - переменная Integer
← →
чудак (2004-07-03 14:25) [2]2 Семен Сорокин:
Спасибо, добавил. Только всё равно "раздувается" программа при перещёлкивании закладок. Я вот думаю - создаю я объекты с именем ll и ls - а очищаю Chart1.Series[i].. Или они после Chart1.AddSeries(ls) занимают одинаковое место в памяти (с одинаковым адресом) и Chart1.Series[i].free эквивалентно ll.free?
← →
Семен Сорокин © (2004-07-03 14:43) [3]
> Chart1.Series[i].free эквивалентно ll.free
в данном случае - да.
>Только всё равно "раздувается" программа при перещёлкивании >закладок
значит утечка в другом месте - если она есть, поищите программку MemProof она поможет найти где память теряется.
← →
чудак (2004-07-03 15:12) [4]Кстати, пардон.. не работает таки метод:
"добавь следующий код перед for i:=0 to N-1 do
for _i := 0 to Chart1.SeriesCount-1 do
Chart1.Series[_i].Free;
_i - переменная Integer"
Почему-то возникает ошибка "List index out of bounds(1)". Посмотрел в отладке: "Chart1.Series[0].Free;" проходит нормально, а вот на "Chart1.Series[1].Free;" возникает ошибка.
Интересно почему это может быть?
← →
чудак (2004-07-03 15:13) [5]P.S. а вот на "Chart1.Series[1].Free;" возникает ошибка. Иммется в виду, что Chart1.SeriesCount = 2.
← →
Семен Сорокин © (2004-07-03 15:14) [6]ага тогда так :)))
for _i := Chart1.SeriesCount-1 downto 0 do
Chart1.Series[_i].Free;
← →
чудак (2004-07-03 15:20) [7]"ага тогда так :)))
for _i := Chart1.SeriesCount-1 downto 0 do
Chart1.Series[_i].Free;"
Семен Сорокин, логика мне эта несовсем понятна, но ЗАРАБОТАЛО!!! :) Ни на байт теперь не раздувается. Спасибо большое :) Второй раз Вы мне помогаете (строчку ls := TBarSeries.Create(nil); - по-моему, Вы же мне и подсказали с месяц назад ;)).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.045 c