|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.01.2012, 09:34 | #1 |
Новичок
Джуниор
Регистрация: 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. Как исправить это и добиться требуемого результата? Заранее Спасибо |
09.01.2012, 15:45 | #3 |
Форумчанин
Регистрация: 11.03.2011
Сообщений: 426
|
Можно при создании и открытии второй формы запоминать в переменной Handle новой формы и закрывать её отправкой сообщения PostMessage(tmpHandle, WM_CLOSE, 0,0); Если форма в наличии - она закроется, если формы уже нет, то сообщение будет проигнорировано.
|
09.01.2012, 15:53 | #4 |
Новичок
Джуниор
Регистрация: 09.01.2012
Сообщений: 2
|
Супер! 3D Hunter, ReportCube - Спасибо! Работает
уже записал в свою прогу -всё пашет! |
09.01.2012, 22:14 | #5 |
Регистрация: 21.02.2010
Сообщений: 8
|
Проблема в том, что когда Вы в событии OnClose пишите caFree уничтожается экземпляр класса, а ссылка на него продолжает существовать (внутри класса нельзя убить ссылку на экземпляр класса). Проверка Assigned(Form2) аналоничная как Form2 <> nil возвращает Вам ссылку на объект, которого уже нет((.
Как вариант для Вашего случая: Form2.Close; Form2:=nil; Я для удаления экземпляра класса использую FreeAndNil(Object); Но он не спасает Вас при "крестике" или альт+ф4. Варианты решения Вам уже описали выше... Ну, и не допускайте такой логики в приложении. Потом сами в ней и запутаетесь. Глобальные переменные, объекты и т.д. - зло, хотя иногда и очень необходимы. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ошибка доступа при выделении памяти в чужом процессе | 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 |