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

Вниз

Ошибки при освобождении.   Найти похожие ветки 

 
horse ©   (2007-06-22 11:21) [0]

Есть PageConrol каджый TabSheet которого является владельцем фрейма со своим набором компонентов и методов.
ПОСЛЕ вызова освобождения TabSheet из фрейма иногда (раз на 10-15 случаев) валимся по Access violetion. При вызове освобождения страница с фреймом с главной формы такого не происходит никогда.
Ошибка возникает не на .free - после, где непонятно.
Какие мысли?


 
Ega23 ©   (2007-06-22 11:25) [1]

1. Используй try..except для логгирования исключений.
2. Как создаётся TTabSheet, как создаётся фрейм, каким образом фрейм привязывается к TabSheet?


 
ЮЮ ©   (2007-06-22 11:33) [2]

> Ошибка возникает не на .free - после, где непонятно.

Для этого тебе дается вся мощь отладчика.


 
Плохиш ©   (2007-06-22 11:39) [3]


> Ошибка возникает не на .free - после, где непонятно.

Ошибка возникает тогда, когда очередь доходит до обработки сообщения, посланного уже несуществующему компоненту. Стоит уже заняться обдумыванием структуры программы.


 
horse ©   (2007-06-22 11:45) [4]

 with TTabSheet.Create(PageControl1) do
 begin
   PageControl := PageControl1;
   Caption := "qwer";
   name := "asdf";
   ...........
 end;

 with TframeSQLList.Create(_owner) do //(_owner - TabSheet)
 begin
   Parent := _owner;
   Align := alClient;
   ..................
 end;


Не могу понять куда try..except лепить.
TTabSheet(self.Owner).Free; - отрабатывает, валится на end;

Чтобы значило то, что с гавной формы
PageControl1.ActivePage.Free; - отрабатывает всегда ?


 
horse ©   (2007-06-22 11:47) [5]


> Ошибка возникает тогда, когда очередь доходит до обработки
> сообщения, посланного уже несуществующему компоненту. Стоит
> уже заняться обдумыванием структуры программы.
>

Да, видимо буду искать в методах уничтожаемого фрейма.
Но почему с главной формы все проходит отлично?


 
ЮЮ ©   (2007-06-22 11:54) [6]

> Не могу понять куда try..except лепить.
> TTabSheet(self.Owner).Free; - отрабатывает, валится на end;

Уничтожение идет из обработчика компонента, лежащего на уничтожаемой TTabSheet. Там ведь ещё код есть. А ни самого фрейма, ни TTabSheet-а уже нет в списке живых. AV практически гарантирован. В контексте какого метода выполняется этот код?


> Чтобы значило то, что с гавной формы
> PageControl1.ActivePage.Free; - отрабатывает всегда ?

Смотря в контексте чего этот код выполняется. Воткни его вместо TTabSheet(self.Owner).Free в код обработчика, лежащего в настоящий момент на PageControl1.ActivePage и можешь нарваться на подобный AV.


 
Плохиш ©   (2007-06-22 11:55) [7]


> Но почему с главной формы все проходит отлично?

Осмелюсь предположить, что в очереди нет событий для интересуемой формы ;-)


 
ЮЮ ©   (2007-06-22 11:58) [8]

> Но почему с главной формы все проходит отлично?

Что всё?
TTabSheet.Free в любом случае отработает "правильно". Важно какие строчки кода будут выполняться затем. Если методы/обработчики уничтоженных объектов, то - AV.


 
Ega23 ©   (2007-06-22 12:20) [9]


>  with TTabSheet.Create(PageControl1) do
>  begin
>    PageControl := PageControl1;
>    Caption := "qwer";
>    name := "asdf";
>    ...........
>  end;
>
>  with TframeSQLList.Create(_owner) do //(_owner - TabSheet)
>  begin
>    Parent := _owner;
>    Align := alClient;
>    ..................
>  end;
>
>
> Не могу понять куда try..except лепить.
> TTabSheet(self.Owner).Free; - отрабатывает, валится на end;
>
>
> Чтобы значило то, что с гавной формы
> PageControl1.ActivePage.Free; - отрабатывает всегда ?
>


Непонятно: а зачем ты их уничтожаешь, если создаёшь от Owner"а? Создавай тогда уж от nil....


 
ЮЮ ©   (2007-06-22 12:34) [10]

>
> Непонятно: а зачем ты их уничтожаешь, если создаёшь от Owner"а?


Он уничтожает TTabSheet целиком. Из обработчика фрейма, лежащего на TTabSheet-е.

>Создавай тогда уж от nil....
утечка памяти лучше AV? :)


 
Ega23 ©   (2007-06-22 12:36) [11]


> Он уничтожает TTabSheet целиком. Из обработчика фрейма,
> лежащего на TTabSheet-е.


Ужос...


> утечка памяти лучше AV? :)


Хуже. Но я обычно, если собираюсь объект удалять сам, то owner"а ему не прописываю.


 
horse ©   (2007-06-22 12:42) [12]

Ты не понял, я уничтожаю его owner"а, а не сам объект, впрочем здесь это дела не меняет.


 
Плохиш ©   (2007-06-22 12:44) [13]


> horse ©   (22.06.07 12:42) [12]
> Ты не понял, я уничтожаю его owner"а, а не сам объект

Owner уничтожает все объекты, для которых он является owner-ом...


 
horse ©   (2007-06-22 12:54) [14]

Я про это и говорю... owner уничтожаю и уничтожается фрейм, для которого Ega23, предлагал сделать owner nil. По коду я фрейм не уничтожал, он уничтожался владельцем.
По сабжу понятно, что дело в методах/обработчиках уничтоженных объектов.
А почему отладчик курсором не проходит эти методы?


 
Ega23 ©   (2007-06-22 13:00) [15]


> Я про это и говорю... owner уничтожаю и уничтожается фрейм,
>  для которого Ega23, предлагал сделать owner nil. По коду
> я фрейм не уничтожал, он уничтожался владельцем.


Правильно. А поэтому, чтобы он не уничтожался, тебе надлежит при создании фрейма вместо
with TframeSQLList.Create(_owner) do //(_owner - TabSheet)
begin
  Parent := _owner;
  Align := alClient;
  ..................
end;

поставить
with TframeSQLList.Create(nil) do
begin
  Parent := _owner;
  Align := alClient;
  ..................
end;


Тогда при уничтожении TTabSheet он не уничтожится автоматически.
Но. В таком случае, дабы избежать утечки памяти, тебе надо будет уничтожить его самостоятельно.


 
Плохиш ©   (2007-06-22 13:03) [16]


> horse ©   (22.06.07 12:54) [14]

Поставь после Free abort в коде.


 
horse ©   (2007-06-22 13:40) [17]


> Поставь после Free abort в коде.


Да, круто, спасибо :)
Т.е. теперь мы игнорируем все методы этого объекта выполняемые после его уничтожения (по задумке там ничего и не должно выполняться :)
Какие подводные камни?
Т.е. это заплатка или в данном случае нормальный вариант решения?


 
Ega23 ©   (2007-06-22 13:47) [18]


> Т.е. это заплатка или в данном случае нормальный вариант
> решения?
>


Это даже не заплатка. Это ... как бы объяснить... Это избавление от занозы в пальце путём ампутации руки.


 
Плохиш ©   (2007-06-22 13:50) [19]


> Т.е. теперь мы игнорируем все методы этого объекта выполняемые
> после его уничтожения

Нет, abort генерирует тихое исключение, которое пропустит всю цепочку вызовов приведшую, к данному участку кода, до первого обработчика except.

> Т.е. это заплатка или в данном случае нормальный вариант
> решения?

В том как ты описал проблему - да.


 
horse ©   (2007-06-22 13:50) [20]

А мне та рука не нужна :-)))))
Это избавление от пятого колеса машины, волочащегося по асфальту ;-)


 
Плохиш ©   (2007-06-22 13:51) [21]


> Это избавление от занозы в пальце путём ампутации руки.

Да, я сегодня добрый, но завтра могу и выстрел в голову предложить :-))


 
Ega23 ©   (2007-06-22 13:53) [22]


> Да, я сегодня добрый, но завтра могу и выстрел в голову
> предложить :-))
>


Знаем-знаем. Halt(0).  :)


 
horse ©   (2007-06-22 13:55) [23]

Спасибо, пусть пока так поработает, а то ищу что вызывает исключение уже три дня с перерывами. Может еще вернусь к поискам :)


 
Плохиш ©   (2007-06-22 13:56) [24]


> а то ищу что вызывает исключение уже три дня с перерывами

За три дня можно было бы и алгоритм программы ещё раз обдумать...


 
Anatoly Podgoretsky ©   (2007-06-22 13:57) [25]

> Плохиш  (22.06.2007 13:56:24)  [24]

И с перерывами



Страницы: 1 вся ветка

Текущий архив: 2007.07.15;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.014 c
15-1181917763
Piter
2007-06-15 18:29
2007.07.15
CLR via C#. Рихтер


15-1182002909
AlexanderMS
2007-06-16 18:08
2007.07.15
Зачем компилятор включает в exe-файл компилируемой программы...


15-1181711931
boriskb
2007-06-13 09:18
2007.07.15
Маклауд?


3-1176958047
Xmen
2007-04-19 08:47
2007.07.15
Прокрутка в DBGrid


3-1176371776
Анна
2007-04-12 13:56
2007.07.15
Как обработать в приложении разрыв connect-a