Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2012, 09:34   #1
deryt
Новичок
Джуниор
 
Регистрация: 09.01.2012
Сообщений: 2
По умолчанию Ошибка чтения памяти при посылки дублирующей команды Close Вспомогательной Форме (Form2)

Доброе Всем утро!
Проблемка в работе с двумя Формами (Form), при посылании двойной команды на закрыть.
Не пугайтесь большому сообщению, это не проблем столько это описание процедуры в которой ошибка, заранее решил описать все моменты чтобы избежать по возможности вопросов и уточнений.

Часть Описания работы программы и возникающей проблемы: программа состоящая из Form1 (Основная) и Form2(Вспомогательная).
При работе программы могу вызвать Form2 (через Application Create (form2) и команды Form2.show), закрывается Form2 кнопкой «закрыть» окна. В процедуре Form2Close содержится функция «action:=cafree;» для полного удаления формы из памяти компа.
При этом имеется еще одна команда(Form2.close) на закрытие Form2 находящаяся в коде Form1, сделано это для принудительного закрытия Form2 в случаи определенных условий.
И вот тут возникает ошибка:
Допустим если я послал один раз команду на открытие Form2 и один раз на закрытие Form2 то всё нормально. В случае же если посылается команда на закрытие Form2 второй раз, то есть окно Form2 не открыто – возникает ошибка.
Пробовал использовать условия проверки:
1. If form2.showing then form2.close;
2. if Assigend(Form2) then form2.close;
Условие №1 не работает.
Условие №2 работает, но только если форма никогда не была открыта, то есть я посылаю команду (form2.close) на закрытие форме(form2) которая еще не разу не создавалась, тогда условия блокируют команду что позволяет не возникать ошибке. Но если Form2 была когда то создана и закрыта и я вновь посылаю(дублирую) команду на закрытие(form2.close), то условие ПОЧЕМУ ТО не блокирует команду close и возникает ошибка чтения памяти:
«access violation at address 00000000 read of address 00000000»
И вот тут у меня и есть проблема, задача чтобы ошибка не возникала при дублировании команды на закрытие. Поэтому два вопроса:
1. почему Assigend(Form2) не блокирует команду, если Form2 нет?
2. Как исправить это и добиться требуемого результата?

Заранее Спасибо
deryt вне форума Ответить с цитированием
Старый 09.01.2012, 11:54   #2
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Посмотрите этот код (решение через переменную, первое что пришло в голову):
FFF.ZIP
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 09.01.2012, 15:45   #3
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Можно при создании и открытии второй формы запоминать в переменной Handle новой формы и закрывать её отправкой сообщения PostMessage(tmpHandle, WM_CLOSE, 0,0); Если форма в наличии - она закроется, если формы уже нет, то сообщение будет проигнорировано.
ReportCube вне форума Ответить с цитированием
Старый 09.01.2012, 15:53   #4
deryt
Новичок
Джуниор
 
Регистрация: 09.01.2012
Сообщений: 2
По умолчанию

Супер! 3D Hunter, ReportCube - Спасибо! Работает


уже записал в свою прогу -всё пашет!
deryt вне форума Ответить с цитированием
Старый 09.01.2012, 22:14   #5
kwinto
 
Регистрация: 21.02.2010
Сообщений: 8
По умолчанию

Проблема в том, что когда Вы в событии OnClose пишите caFree уничтожается экземпляр класса, а ссылка на него продолжает существовать (внутри класса нельзя убить ссылку на экземпляр класса). Проверка Assigned(Form2) аналоничная как Form2 <> nil возвращает Вам ссылку на объект, которого уже нет((.
Как вариант для Вашего случая:
Form2.Close;
Form2:=nil;
Я для удаления экземпляра класса использую FreeAndNil(Object);
Но он не спасает Вас при "крестике" или альт+ф4.
Варианты решения Вам уже описали выше...
Ну, и не допускайте такой логики в приложении. Потом сами в ней и запутаетесь. Глобальные переменные, объекты и т.д. - зло, хотя иногда и очень необходимы.
kwinto вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка доступа при выделении памяти в чужом процессе Neoteric Общие вопросы Delphi 21 06.12.2010 16:50
Ошибка при написании команды для SoftIce ProgDel Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 06.03.2010 19:16
Ошибка доступа памяти, при работе с принятой строкой. Zeraim Работа с сетью в Delphi 11 26.01.2010 01:11
Ошибка чтения из памяти Шульц Общие вопросы Delphi 20 03.11.2009 12:26
Как убрать (спрятать) кнопку Maximize на форме чтобы остались только Minimize и Close athlant64 Общие вопросы Delphi 15 11.11.2007 17:08