Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.31;
Скачать: CL | DM;

Вниз

Как запретить автоудаление подчиненных объектов?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
15-1238054110
oxffff
2009-03-26 10:55
2009.05.31
StreamSec Garbage Collector


15-1238485697
Галинка
2009-03-31 11:48
2009.05.31
маленький вопросик про xampp


15-1238162684
axis_of_evil
2009-03-27 17:04
2009.05.31
печать .pdf со смещением


15-1238189404
Юрий
2009-03-28 00:30
2009.05.31
С днем рождения ! 28 марта 2009 суббота


11-1201117485
Vinum
2008-01-23 22:44
2009.05.31
Как скопировать рисунок из канвы в буфер