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

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

Уничтожить класс в другой форме. [D7, 2003]


AntonS ©   (2007-10-18 18:04:00) 

У меня есть свой класс у которого есть Create и Free. В главной форме создаю класс, и потом его передаю в другую форму, по измененному конструктору другой формы:

FMyClass: TMyClass - private запись TSubForm.

constructor TSubForm.Create(MyClass: TMyClass);
begin
 FMyClass := MyClass;  
 FMyClass.IntValue := 10;
 FMyClass.StrValue := 'yadda';
 FMyClass.OnCalculate := TSubForm.OnCalculate;
 ...
end;


Передаю так:
 MainMyClass := TMyClass.Create;
 SubForm := TSubForm.Create(MainMyClass);
 SubForm.ShowModal;


А потом из TSubForm делаю FMyClass.Free - Получаю AV; Сам Free работает нормально, его вызов из центральной формы отлично работает.


Skyle   (2007-10-19 07:59:00) [1]

А почему нельзя создать объект в SubForm?


korneley   (2007-10-18 23:52:00) [2]


>  Как в таких случаях поступают?
Алаверды [12] Для начала при уничтожении экземпляра объекта (класса) можно занилить ссылку(и) на него, а перед использованием проверять на нил...


Jump   (2007-10-18 23:26:00) [3]

Нельзя обращаться к объекту, который уничтожен. Вот поэтому ужасный стиль.

Как в таких случаях поступают?

По-разному. К чему строить догмы на пустом месте...

Пока сам не поймешь, что к уничтоженным объектам обращаться нельзя - ни одно типовое решение не поможет. А как поймешь - и типовых решений не надо будет. Не нарушай причинно-следственных связей - и будет тебе счастье.


AntonS   (2007-10-18 23:01:00) [4]

Я на самом деле идиот. Я кажется нашел ошибку, действительно после Free ещё был закопанный код который ссылался на убитый объект.

Но у меня остался вопрос: почему это ужасный стиль? Как в таких случаях поступают?


Jump   (2007-10-18 21:16:00) [5]

А потом из TSubForm делаю FMyClass.Free

Где делаешь?
Как делаешь?
Где код?
Как уничтожаешь SubForm?


Desdechado   (2007-10-18 20:39:00) [6]

Судя по тексту, TSubForm - это форма. Ты перекрыл ее конструктор (не видно, как), передавая в качестве хозяина объект класса (с неизвестным родителем), и тут же пытаешься хозяина замочить. Кто останется хозяином?
Перректальность какая-то...


Jump   (2007-10-18 19:48:00) [7]

Я все равно так и не понимаю, что именно происходит, из-за чего возникает AV.

AV - обычно из-за обращения к уже уничтоженному, несуществующему объекту. Не обращайся к объекту после того, как он будет уничтожен - и не будет AV.

А что использовать для объекта от простого класса?

У тебя, насколько я понял, две ссылки на объект - в двух разных формах. И, если посмотреть код (который ты не полностью сюда привел), то окажется, что одна (а то и обе) из них (ссылок) используется после того, как объект уничтожен.

Еще раз: не обращайся к уничтоженному объекту.


AntonS   (2007-10-18 19:29:00) [8]

Я все равно так и не понимаю, что именно происходит, из-за чего возникает AV.

FreeNotification - он же пригоден только для наследников TComponent. А что использовать для объекта от простого класса?


Jump   (2007-10-18 19:07:00) [9]

И используй FreeNotification, чтобы знать, когда экземпляр твоего класса уничтожается.


Jump   (2007-10-18 19:03:00) [10]

созданный класс

Создают не классы, а экземпляры классов (сиречь, объекты).
Почитай, для начала, что-нибудь про ООП.


AntonS   (2007-10-18 18:56:00) [11]

А как в таких случаях поступают? когда нужен созданный класс в другой форме.


Desdechado   (2007-10-18 18:53:00) [12]

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


AntonS   (2007-10-18 18:45:00) [13]


> Например TSubForm.OnCalculate - не знает, что экземпляр
> грохнули

Бррр.. совсем наверное плохо у меня с головой, не понял. Может можно примером продкрепить, что делать в такой ситуации, когда мне нужно передать класс в другую форму и там его уничтожить.


Reindeer Moss Eater   (2007-10-18 18:07:00) [14]

Например TSubForm.OnCalculate - не знает, что экземпляр грохнули


Наверх

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