Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.11;
Скачать: CL | DM;

Вниз

Уничтожить класс в другой форме.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
8-1169131582
Vovan #2
2007-01-18 17:46
2007.11.11
Вопрос о WAV


1-1187854786
Krants
2007-08-23 11:39
2007.11.11
Управление Excel через ProcessID


6-1154718907
Tiberius
2006-08-04 23:15
2007.11.11
Заполнение html-форм


2-1192589687
San1712
2007-10-17 06:54
2007.11.11
Как пользоваться функцией IsDebuggerPresent ?


9-1162945673
cxvxc
2006-11-08 03:27
2007.11.11
Спрайт OpenGL