![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уничтожить класс в другой форме. [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 - не знает, что экземпляр грохнули