Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.436 c
2-1182084780
skan
2007-06-17 16:53
2007.07.15
Фильтрация


2-1182087449
Delon
2007-06-17 17:37
2007.07.15
Как из мемо вытащить слова содержащие символ @


2-1182530106
nord489
2007-06-22 20:35
2007.07.15
OpenDialog


4-1170304551
apic
2007-02-01 07:35
2007.07.15
WMI


2-1182139121
Riply
2007-06-18 07:58
2007.07.15
DeviceIoControl и повторное открытие диска.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский