![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибки при освобождении.
horse © (2007-06-22 11:21:00)Есть PageConrol каджый TabSheet которого является владельцем фрейма со своим набором компонентов и методов.
ПОСЛЕ вызова освобождения TabSheet из фрейма иногда (раз на 10-15 случаев) валимся по Access violetion. При вызове освобождения страница с фреймом с главной формы такого не происходит никогда.
Ошибка возникает не на .free - после, где непонятно.
Какие мысли?
Anatoly Podgoretsky (2007-06-22 13:57:00) [1]> Плохиш (22.06.2007 13:56:24) [24]
И с перерывами
Плохиш (2007-06-22 13:56:00) [2]
> а то ищу что вызывает исключение уже три дняс перерывами
За три дня можно было бы и алгоритм программы ещё раз обдумать...
horse (2007-06-22 13:55:00) [3]Спасибо, пусть пока так поработает, а то ищу что вызывает исключение уже три дня с перерывами. Может еще вернусь к поискам :)
Ega23 (2007-06-22 13:53:00) [4]
> Да, я сегодня добрый, но завтра могу и выстрел в голову
> предложить :-))
>
Знаем-знаем. Halt(0). :)
Плохиш (2007-06-22 13:51:00) [5]
> Это избавление от занозы в пальце путём ампутации руки.
Да, я сегодня добрый, но завтра могу и выстрел в голову предложить :-))
horse (2007-06-22 13:50:00) [6]А мне та рука не нужна :-)))))
Это избавление от пятого колеса машины, волочащегося по асфальту ;-)
Плохиш (2007-06-22 13:50:00) [7]
> Т.е. теперь мы игнорируем все методы этого объекта выполняемые
> после его уничтожения
Нет, abort генерирует тихое исключение, которое пропустит всю цепочку вызовов приведшую, к данному участку кода, до первого обработчика except.
> Т.е. это заплатка или в данном случае нормальный вариант
> решения?
В том как ты описал проблему - да.
Ega23 (2007-06-22 13:47:00) [8]
> Т.е. это заплатка или в данном случае нормальный вариант
> решения?
>
Это даже не заплатка. Это ... как бы объяснить... Это избавление от занозы в пальце путём ампутации руки.
horse (2007-06-22 13:40:00) [9]
> Поставь после Free abort в коде.
Да, круто, спасибо :)
Т.е. теперь мы игнорируем все методы этого объекта выполняемые после его уничтожения (по задумке там ничего и не должно выполняться :)
Какие подводные камни?
Т.е. это заплатка или в данном случае нормальный вариант решения?
Плохиш (2007-06-22 13:03:00) [10]
> horse © (22.06.07 12:54) [14]
Поставь после Free abortв коде.
Ega23 (2007-06-22 13:00:00) [11]
> Я про это и говорю... 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 он не уничтожится автоматически.
Но. В таком случае, дабы избежать утечки памяти, тебе надо будет уничтожить его самостоятельно.
horse (2007-06-22 12:54:00) [12]Я про это и говорю... owner уничтожаю и уничтожается фрейм, для которого Ega23, предлагал сделать owner nil. По коду я фрейм не уничтожал, он уничтожался владельцем.
По сабжу понятно, что дело в методах/обработчиках уничтоженных объектов.
А почему отладчик курсором не проходит эти методы?
Плохиш (2007-06-22 12:44:00) [13]
> horse © (22.06.07 12:42) [12]
> Ты не понял, я уничтожаю его owner'а, а не сам объект
Owner уничтожает все объекты, для которых он является owner-ом...
horse (2007-06-22 12:42:00) [14]Ты не понял, я уничтожаю его owner'а, а не сам объект, впрочем здесь это дела не меняет.
Ega23 (2007-06-22 12:36:00) [15]
> Он уничтожает TTabSheet целиком. Из обработчика фрейма,
> лежащего на TTabSheet-е.
Ужос...
> утечка памяти лучше AV? :)
Хуже. Но я обычно, если собираюсь объект удалять сам, то owner'а ему не прописываю.
ЮЮ (2007-06-22 12:34:00) [16]>
> Непонятно: а зачем ты их уничтожаешь, если создаёшь от Owner'а?
Он уничтожает TTabSheet целиком. Из обработчика фрейма, лежащего на TTabSheet-е.
>Создавай тогда уж от nil....
утечка памяти лучше AV? :)
Ega23 (2007-06-22 12:20:00) [17]
> 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 11:58:00) [18]> Но почему с главной формы все проходит отлично?
Что всё?
TTabSheet.Free в любом случае отработает "правильно". Важно какие строчки кода будут выполняться затем. Если методы/обработчики уничтоженных объектов, то - AV.
Плохиш (2007-06-22 11:55:00) [19]
> Но почему с главной формы все проходит отлично?
Осмелюсь предположить, что в очереди нет событий для интересуемой формы ;-)
ЮЮ (2007-06-22 11:54:00) [20]> Не могу понять куда try..except лепить.
> TTabSheet(self.Owner).Free; - отрабатывает, валится на end;
Уничтожение идет из обработчика компонента, лежащего на уничтожаемой TTabSheet. Там ведь ещё код есть. А ни самого фрейма, ни TTabSheet-а уже нет в списке живых. AV практически гарантирован. В контексте какого метода выполняется этот код?
> Чтобы значило то, что с гавной формы
> PageControl1.ActivePage.Free; - отрабатывает всегда ?
Смотря в контексте чего этот код выполняется. Воткни его вместо TTabSheet(self.Owner).Free в код обработчика, лежащего в настоящий момент на PageControl1.ActivePage и можешь нарваться на подобный AV.