Форум: "Начинающим";
Текущий архив: 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