![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Демо |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Деструктор вызывается только для созданного объекта. т.е. Self существует по-определению. Далее - предка, для которого нужно было бы вызвать свой деструктор, нет.
Вместо всего этого достаточно destructor TMyClass.Destroy; begin ShowMessage('Сейчас вызову деструктор!'); //Даю сообщение и end; -------------------- |
||||
|
|||||
| PsiMagistr |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Демо, благодарю.
Забавно. Я полагал, что предок всегда есть (TObject хотя бы). Правильно ли я вас понял, что невозможно вызвать деструктор для несуществующего объекта? Мне бы как-то попытаться сделать так, чтобы:
При отсутствии файла мне мало просто вызвать деструктор. Мне важно, чтобы в MyObject был nil. Но вот как его туда заслать? Ведь при исключении тут же вызывается деструктор, который разрушает все и в конечном итоге - мусор в MyObject. Или я не так понимаю? Это сообщение отредактировал(а) PsiMagistr - 3.6.2010, 16:50 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
||||
|
|||||
| Mikel |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
А почему бы не сделать что-н типа:
Вынести просто ту логику в инит... -------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Mikel, О, это интересная идея.
А что есть init? Как я понял свойство проверки инициализации? P.S. Я очень мало знаком с внутренней структурой объектов. К ООП приступил недавно. -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Mikel |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
Initом я просто обозвал функцию в которую предлагаю тебе вынести всю логику из Create. В Create только создавать объект.
-------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Mikel, благодарю от души за участие. Понимаете суть моей задачи в чем... Я загорелся идеей фикс зашить в класс всю работу с файлами.
Т.е. Есть файл (или соотвествующая запись в нем) - конструктор загружает данные в поля и создает объект. Нет файла - нет объекта. А в объектном указателе в этом случае - Nil. Причем все это должно крутиться внутри класса. В этом весь смак. Обслужить все внешними проверками можно, но тогда нет особого смысла и в классе. Я хочу выжать максимум универсальности. -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Нет предка, для которого необходимо вызвать дополнительно деструктор. Хотя я всегда использую inherited Destroy в своём коде. Это позволяет никогда не забывать вызывать деструктор предка. CodeMonkey уже писал тебе о том, что перед созданием объекта переменную нужно проинициализировать. т.е.
В случае возникновения исключения значение MyObject не изменится. Не путай псевдопеременную Self с обычной переменной-ссылкой на объект. Это сообщение отредактировал(а) Демо - 3.6.2010, 17:16 -------------------- |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Демо, дружище. Именно так я и пытался писать. Более того я писал проверки, чтобы отследить:
Это сообщение отредактировал(а) PsiMagistr - 3.6.2010, 17:23 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
А каким образом ты можешь дождаться сообщения, если на строке MyObJect:=TMyClass.Create('Проба.txt'); у тебя возникает исключение, и следующие строки не выполняются?
-------------------- |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
А вот тут я совсем не понял чего-то. Допустим возникает исключение. И что? Оно же в конструкторе возникает. Ну конструктор, ясное дело, обваливается. Но проверка на nill не в конструкторе, она внешняя, из программы, в обработчике кнопки. По идее должен был быть переход к след шагу, неужели же обваливается вся процедура, где этот злосчастный конструктор вызван? Но тогда получается что из за исключения в конструкторе вся программа клеит ласты)))
Это сообщение отредактировал(а) PsiMagistr - 3.6.2010, 17:46 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Деструктор нужно писать так всегда. Без исключений.
После выполнения деструктора исключение остаётся необработанным, и поднимается вверх по стеку вызовов (с выполнением всех секций finally), до ближайшего по стеку обработчика (это может быть except или обработчик исключений из TApplication, который просто выводит сообщение) Это сообщение отредактировал(а) bems - 3.6.2010, 18:01 -------------------- Обижено школьников: 8 |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
bems, и что вы предлагаете? Вот у меня исключение в конструкторе вызывается и весь обработчик кнопки, где я этот конструктор призвал обваливается.
Это сообщение отредактировал(а) PsiMagistr - 3.6.2010, 18:31 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
PsiMagistr, да, обваливается. Ты видишь в этом что-то плохое?
Если ты знаешь что делать в случае отсутствия файла, то пиши секцию except Это сообщение отредактировал(а) bems - 3.6.2010, 18:32 -------------------- Обижено школьников: 8 |
|||
|
||||
| Демо |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Это ещё почему?
Ты не умеешь обрабатывать исключения?
-------------------- |
||||||
|
|||||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Демо, нет. НЕ умею. Честно. Я только к дельфи приступил. С книгой сижу.
Вот реализация конструктора:
Вот только как его обработать, чтоб после выполнения исключения обработчик, где будет вызываться конструктор не обваливался? В случае отсутствия файла - присвоить указателю на объект nil. Но поскольку я его и так инициализировал с nil а меняться он не должен. то в случае отсутствия можно ничего не делать. Поскольку деструктор возникнет автоматом. Это сообщение отредактировал(а) PsiMagistr - 3.6.2010, 19:16 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |