Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как запретить автоудаление подчиненных объектов? [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;


Убрать строчку не пробовал ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо