Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1193036940
_user_
2007-10-22 11:09
2007.11.11
Как учесть масштаб в свойствах экрана (96, 120... т/дюйм)?


2-1192726332
Malik
2007-10-18 20:52
2007.11.11
PopupMenu


2-1192522713
webpauk
2007-10-16 12:18
2007.11.11
Тип данных


15-1191943278
$Pl@Sh
2007-10-09 19:21
2007.11.11
как устроить инет?


15-1191992179
Бакук
2007-10-10 08:56
2007.11.11
В России запретят CD-RW и DVD-RW





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский