Форум: "Начинающим";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];
ВнизКак запретить автоудаление подчиненных объектов? Найти похожие ветки
← →
Kolan © (2009-04-14 14:56) [0]Здравствуйте!
Есть некая обертка над обычнымTChart"ом
,
которая управляет сериями. Точнее не сериями, а обертками над сериями.
При её создании делается примерно следующее:function TGraphManager.CreateGraph: TMeasurmentGraph;
begin
Result := TMeasurmentGraph.Create(FChart, GetNextColor);
Result.OnClick := MeasurmentGraphClick;
Result.RealPart.SetVisible(IsShowReal);
Result.ImaginativePart.SetVisible(IsShowImaginative);
Result.Module.SetVisible(IsShowModule);
end;
гдеTMeasurmentGraph.Create
в итоге приводит
к созданию серии и добавлению её на чарт:constructor TSerieGraph.Create(Chart: TChart; Color: TColor);
begin
inherited;
FChart := Chart;
FSerie := CreateSerie(FChart);
FSerie.SeriesColor := Color;
FChart.AddSeries(FSerie);
end;
При закрытии программы все удаляется.
При удалении этой обертки разрушается и список хранящий обертки над
сериями.
При удалении вызывается унаследованный деструктор:destructor TList.Destroy;
begin
Clear;
end;
И перекрытыйClear;
procedure TMeasurmentGraphList.Clear;
var
I: Integer;
begin
for I := 0 to Count - 1 do
Items[I].Clear;
inherited;
end;
СтрокаItems[I].Clear;
в конечном итоге очищает серию:procedure TSerieGraph.Clear;
begin
inherited;
FSerie.Clear;
end;
При закрытии программы это приводит к AV. Я думаю, дело в том,
что серия уже разрушена компонентом-владельцем.
Если я прав, то можно ли запретить автоудаление,
работающее в недрах VCL, и как это сделать?
Если я не прав, то откуда тогда AV и что делать :) ?
← →
Игорь Шевченко © (2009-04-14 14:59) [1]
> При закрытии программы это приводит к AV. Я думаю, дело
> в том,
> что серия уже разрушена компонентом-владельцем.
Это обнаруживается отладчиком.
> Если я прав, то можно ли запретить автоудаление,
> работающее в недрах VCL, и как это сделать?
Нельзя.
> FSerie.Clear;
Убрать строчку не пробовал ?
← →
Kolan © (2009-04-14 15:06) [2]
> Это обнаруживается отладчиком.
Я не могу отлидчиком, у меня нет кода TeeChart"а, а как без кода — не знаю.
>Убрать строчку не пробовал ?
Пробовал, помогает. Однако это не решение, потому что методClear
может вызываться не только во время закрытия программы, но и во время работы. Для очисти серий...
← →
Игорь Шевченко © (2009-04-14 15:37) [3]
> а как без кода — не знаю.
View|Debug Windows|CPU
> Clear может вызываться не только во время закрытия программы,
> но и во время работы. Для очисти серий...
Переопредели класс списка, чтобы можно было для очистки серий вызвать не перекрытый у TList метод, а специальный метод который кроме очистки серий ничего не делает.
← →
Kolan © (2009-04-14 16:27) [4]Нет, про существование ЦПУ окна я знаю, а вот что там делать — нет.
Да, убрал перекрытие — АВ пропала. Интересно, к чему это приведет в других частях программы.
← →
Игорь Шевченко © (2009-04-14 16:55) [5]
> Интересно, к чему это приведет в других частях программы
к другому AV
← →
имя (2009-04-15 00:35) [6]Удалено модератором
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c