![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
blaze |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 10.2.2006 Репутация: нет Всего: нет |
подскажите, в чем ошибка? Создаю свой класс, например в модуле Unit2
Потом ссылаюсь на этот класс из другого модуля, наприме Unit1, где у меня на нажатие кнопки вызывается v.data:=123; где v - глобальная переменная в этом модуле тип ее - TMyClass; После этого события выскакивает Access Violation; Cannot write at adress .....; Нет Вы не поняли, ошибка возникает при попытке присвоения v.Data:=123 CANNOT WRITE AT ADRESS Это сообщение отредактировал(а) Girder - 16.2.2006, 10:45 |
|||
|
||||
CaNIBaLchik |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 8.2.2006 Где: Томск Репутация: нет Всего: нет |
забыл наверное
v:=TMyClass.Create; |
|||
|
||||
Bog d`An |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 26.3.2005 Где: Украина:Днепропет ровск Репутация: нет Всего: 3 |
после работы тоже неплохо бы освободить память...
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер] |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 8 Всего: 51 |
||||
|
||||
Bog d`An |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 26.3.2005 Где: Украина:Днепропет ровск Репутация: нет Всего: 3 |
шо в лоб, шо по лбу
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер] |
|||
|
||||
CaNIBaLchik |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 8.2.2006 Где: Томск Репутация: нет Всего: нет |
ага а также destroy
можно dispose тоже сработает ![]() |
|||
|
||||
Bog d`An |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 26.3.2005 Где: Украина:Днепропет ровск Репутация: нет Всего: 3 |
в литературе рекомендуют использовать free
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер] |
|||
|
||||
CaNIBaLchik |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 8.2.2006 Где: Томск Репутация: нет Всего: нет |
только потому что перед destroy там идет проверка на nil
|
|||
|
||||
s-r |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 19.4.2007 Репутация: нет Всего: нет |
у меня аналогичная ситуация
В обработчике по клику:
код отрабатывает, но после закрытия формы вываливается исключение.. проблема решилась так
Может поскажите какая разница между cr.Create и cr:=TCirc.Create? и зачем это нужно делать, и почему если это не сделать возникает ошибка... прошу прощения если задаю глупые вопросы Это сообщение отредактировал(а) s-r - 31.5.2007, 08:23 |
||||||
|
|||||||
Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 6 Всего: 111 |
А такая, что кодом cr.Create ты пытаешься обратиться к свойству объекта который не существует. А кодом cr:=TCirc.Create ты выделяешь память под экземпляр класса TCirc и назначаешь указатель на эту память переменной cr (cr суть указатель). А зачем так делать, так это ты у борланда спроси. Они так придумали. Хотя мне такой принцип кажется логичным и прозрачным ![]() |
|||
|
||||
MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
можно написать так:
хм... как интересно получается... вроде как нельзя обращаться к объекту, который еще не создан. но ведь такой код является верным:
т.е. во Free произойдет проверка Self <> nil и выход. но ведь объект еще не создан/уже разрушен.... или TObject весь такой особенный, что позволяет это делать. или если нет обращения к внутренним полям класса, то вызов методов несозданного объекта все-таки возможен? ))) Это сообщение отредактировал(а) MetalFan - 31.5.2007, 08:39 -------------------- There are always someone smarter than you... |
||||
|
|||||
Yanis |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 6 Всего: 111 |
Должна быть ошибка ![]() Да, он такой особенный ;) Не помню как точно называется. Классовые методы или что то подобное. Они объявляются так:
т.е. её можно вызывать без выделения памяти под экземпляр:
Вот так работает Create. Добавлено @ 08:47 Для тех, кто в танке:
Это сообщение отредактировал(а) Yanis - 31.5.2007, 08:49 |
||||||||||||
|
|||||||||||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Free - это не class procedure.... только что посмотрел)
но вызов Free без дополнительной проверки на nil возможен и не приводит к AV.... Это сообщение отредактировал(а) MetalFan - 31.5.2007, 08:53 -------------------- There are always someone smarter than you... |
|||
|
||||
Yanis |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 6 Всего: 111 |
Ага. По всей видимости ошибка начинает возникать после того как в методе начинается работа с переменными класса. Если таковых нет, то всё работает ![]()
Это сообщение отредактировал(а) Yanis - 31.5.2007, 09:34 |
||||
|
|||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
мда.. а зачем тогда Class functions?... может отдельную тему сказать, вдруг мастера знают секрет этого фокуса? )))
-------------------- There are always someone smarter than you... |
|||
|
||||
pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
blaze, Раз v - глобальная переменная, то в модуле Unit1, как я понимаю это форма TForm1, код должен быть такой:
-------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 6 Всего: 111 |
Тада компилятор не даст нам использовать внутренние переменные в этих методах ![]() Добавлено через 6 минут и 38 секунд Оказывается всё это прокатывает без AV, потому что методы статические. Компилятор их помнит без напоминания. Спасибо Розычу. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
А чего в этом такого? С точки зрения реализации метод это обычная процедура в которую первым параметром передается указатель на объект. Если к данным не обращаться, то с чего будут возникать AV? Проверил Self на nil и вперед, если он не nil то VMT существует и можно без проблем вызывать Destroy. Напрямую вызов Destroy, у несуществующего объекта приведет к AV так как Destroy - это виртуальный метод (иногда даже динамический), т.е. поиск его адреса будет осуществляться в VMT, ссылка на которую отсутствует в уничтоженном объекте. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 6 Всего: 111 |
в несуществующем ![]() Добавлено через 18 секунд или «не созданном». |
|||
|
||||
Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 15 Всего: 76 |
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Там есть одна неточность
Уточню, любые статические (статические в делфиском смысле, т.е. не виртуальные и не динамические). Это сообщение отредактировал(а) Alexeis - 31.5.2007, 10:24 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
отлично) разобралис) всем спасибо!
-------------------- There are always someone smarter than you... |
|||
|
||||
Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 6 Всего: 111 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "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. |