Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
ВнизУничтожить класс в другой форме. Найти похожие ветки
← →
AntonS (2007-10-18 18:04) [0]У меня есть свой класс у которого есть 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 работает нормально, его вызов из центральной формы отлично работает.
← →
Reindeer Moss Eater © (2007-10-18 18:07) [1]Например TSubForm.OnCalculate - не знает, что экземпляр грохнули
← →
AntonS (2007-10-18 18:45) [2]
> Например TSubForm.OnCalculate - не знает, что экземпляр
> грохнули
Бррр.. совсем наверное плохо у меня с головой, не понял. Может можно примером продкрепить, что делать в такой ситуации, когда мне нужно передать класс в другую форму и там его уничтожить.
← →
Desdechado © (2007-10-18 18:53) [3]> передать класс в другую форму и там его уничтожить.
Не делай так, ужасный стиль.
← →
AntonS (2007-10-18 18:56) [4]А как в таких случаях поступают? когда нужен созданный класс в другой форме.
← →
Jump (2007-10-18 19:03) [5]созданный класс
Создают не классы, а экземпляры классов (сиречь, объекты).
Почитай, для начала, что-нибудь про ООП.
← →
Jump (2007-10-18 19:07) [6]И используй FreeNotification, чтобы знать, когда экземпляр твоего класса уничтожается.
← →
AntonS (2007-10-18 19:29) [7]Я все равно так и не понимаю, что именно происходит, из-за чего возникает AV.
FreeNotification - он же пригоден только для наследников TComponent. А что использовать для объекта от простого класса?
← →
Jump (2007-10-18 19:48) [8]Я все равно так и не понимаю, что именно происходит, из-за чего возникает AV.
AV - обычно из-за обращения к уже уничтоженному, несуществующему объекту. Не обращайся к объекту после того, как он будет уничтожен - и не будет AV.
А что использовать для объекта от простого класса?
У тебя, насколько я понял, две ссылки на объект - в двух разных формах. И, если посмотреть код (который ты не полностью сюда привел), то окажется, что одна (а то и обе) из них (ссылок) используется после того, как объект уничтожен.
Еще раз: не обращайся к уничтоженному объекту.
← →
Desdechado © (2007-10-18 20:39) [9]Судя по тексту, TSubForm - это форма. Ты перекрыл ее конструктор (не видно, как), передавая в качестве хозяина объект класса (с неизвестным родителем), и тут же пытаешься хозяина замочить. Кто останется хозяином?
Перректальность какая-то...
← →
Jump (2007-10-18 21:16) [10]А потом из TSubForm делаю FMyClass.Free
Где делаешь?
Как делаешь?
Где код?
Как уничтожаешь SubForm?
← →
AntonS (2007-10-18 23:01) [11]Я на самом деле идиот. Я кажется нашел ошибку, действительно после Free ещё был закопанный код который ссылался на убитый объект.
Но у меня остался вопрос: почему это ужасный стиль? Как в таких случаях поступают?
← →
Jump (2007-10-18 23:26) [12]Нельзя обращаться к объекту, который уничтожен. Вот поэтому ужасный стиль.
Как в таких случаях поступают?
По-разному. К чему строить догмы на пустом месте...
Пока сам не поймешь, что к уничтоженным объектам обращаться нельзя - ни одно типовое решение не поможет. А как поймешь - и типовых решений не надо будет. Не нарушай причинно-следственных связей - и будет тебе счастье.
← →
korneley © (2007-10-18 23:52) [13]
> Как в таких случаях поступают?
Алаверды [12] Для начала при уничтожении экземпляра объекта (класса) можно занилить ссылку(и) на него, а перед использованием проверять на нил...
← →
Skyle © (2007-10-19 07:59) [14]А почему нельзя создать объект в SubForm?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.126 c