![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как запретить автоудаление подчиненных объектов? [XP]
Kolan © (2009-04-14 14:56:00)Здравствуйте!
Есть некая обертка над обычным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-15 00:35:00) [1]Удалено модератором
Игорь Шевченко (2009-04-14 16:55:00) [2]
> Интересно, к чему это приведет в других частях программы
к другому AV
Kolan (2009-04-14 16:27:00) [3]Нет, про существование ЦПУ окна я знаю, а вот что там делать — нет.
Да, убрал перекрытие — АВ пропала. Интересно, к чему это приведет в других частях программы.
Игорь Шевченко (2009-04-14 15:37:00) [4]
> а как без кода — не знаю.
View|Debug Windows|CPU
> Clear может вызываться не только во время закрытия программы,
> но и во время работы. Для очисти серий...
Переопредели класс списка, чтобы можно было для очистки серий вызвать не перекрытый у TList метод, а специальный метод который кроме очистки серий ничего не делает.
Kolan (2009-04-14 15:06:00) [5]
> Это обнаруживается отладчиком.
Я не могу отлидчиком, у меня нет кода TeeChart'а, а как без кода — не знаю.
>Убрать строчку не пробовал ?
Пробовал, помогает. Однако это не решение, потому что метод
Clearможет вызываться не только во время закрытия программы, но и во время работы. Для очисти серий...
Игорь Шевченко (2009-04-14 14:59:00) [6]
> При закрытии программы это приводит к AV. Я думаю, дело
> в том,
> что серия уже разрушена компонентом-владельцем.
Это обнаруживается отладчиком.
> Если я прав, то можно ли запретить автоудаление,
> работающее в недрах VCL, и как это сделать?
Нельзя.
> FSerie.Clear;
Убрать строчку не пробовал ?