Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибки при освобождении.


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо