Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.11.2011, 16:15
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
Вопрос Повторное открытие окон - ошибка Access Violation

Здравствуйте!
Тупая проблема - всё работает отлично, но если открыть окно, закрыть окно, затем нажать кнопку открывающую окно - ошибка Access Violation, то есть ошибка при попытке повторного открытия окна.
Окно MDIChild, процедура закрытия окна caFree. Перед закрытием также прописано Dataset.Close (пробовал писать и FormDestroy и в FormClose). Создаётся окно в главной форме MDIForm так: fOkno := TfOkno.Create(self);
Ничего сложного вроде нет. Но баг есть... из-за чего может быть?!

Последний раз редактировалось delphicoding, 18.11.2011 в 16:18.
Ответить с цитированием
  #2  
Старый 18.11.2011, 19:41
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

окно создаётся во время нажатия кнопки?
попробуй перед
fOkno := TfOkno.Create(self);
напиши fOkno.free;
возможно при повторном открытии переменная fokno уже занята.
Ответить с цитированием
  #3  
Старый 18.11.2011, 20:12
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Мы программисты, а не гадалки. Давай код, посмотрим.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #4  
Старый 19.11.2011, 12:52
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Если код такой, то всё работает корректно, но есть ненужная возможность создать это окно два раза повторным кликом:
Код:
fOkno := TfOkno.Create(Application);
fOkno.Show;
Если код такой, то баги:
Код:
ошибка:
FreeAndNil(fOkno); (или fOkno.Free;)
fOkno := TfOkno.Create(Application); (или Self)
fOkno.Show;

а так ничего не происходит при повторном нажатии, видимо переменная действительно не очистилась:
if not Assigned(fOkno) then begin   
fOkno := TfOkno.Create(Application);
fOkno.Show;
end;

Пробовал так, но это очевидно сразу же очищает окно после создания:
fOkno := TfOkno.Create(Application);
fOkno.Show;
FreeAndNil(fOkno);

Пробовал так, но опять ошибка:
if Assigned(fOkno) then FreeAndNil(fOkno); (или fOkno.Free)
fOkno := TfOkno.Create(Application);
fOkno.Show;
Как написать код создания окна, чтобы всё хорошо работало и окно было только в одном экземпляре ???
Ответить с цитированием
  #5  
Старый 19.11.2011, 14:49
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Ставь обработчик на OnClose того окна, чтоб очищал переменную. Переменную, соответственно, сделай глобальной. Ну и тогда код, который
Код:
if not Assigned(fOkno) then begin
  fOkno := TfOkno.Create(Application);
  fOkno.Show;
end; 
у тебя будет работать замечательно.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #6  
Старый 05.12.2011, 10:58
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Цитата:
Ставь обработчик на OnClose того окна, чтоб очищал переменную. Переменную, соответственно, сделай глобальной. Ну и тогда код, который
Увы, не получится, тк fOkno это Каталог (fCatalogOffice), а обработчик OnClose прописан не в самом классе fOkno, а в унаследованном базовом для многих каталогов классе fBaseCatalogsForm - можно ли из него как-то универсально указать уничтожать переменную соответствующую каждому конкретному окну?

Последний раз редактировалось delphicoding, 05.12.2011 в 12:02.
Ответить с цитированием
  #7  
Старый 05.12.2011, 12:34
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
Сообщение от delphicoding
Увы, не получится, тк fOkno это Каталог (fCatalogOffice), а обработчик OnClose прописан не в самом классе fOkno, а в унаследованном базовом для многих каталогов классе fBaseCatalogsForm - можно ли из него как-то универсально указать уничтожать переменную соответствующую каждому конкретному окну?
Тогда перед показом окна ищи его в Screen.Forms, и если его там нет - создавай(любым способом, все созданные формы автоматически попадают в этот список)
Ответить с цитированием
  #8  
Старый 05.12.2011, 23:02
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Напишите пример, пожалуйста...
Ответить с цитированием
  #9  
Старый 06.12.2011, 16:27
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Решено - первый код вполне правильный и хорошо работает, не хватало только полного очищения/уничтожения переменной fOkno, для этого потребовалось всего-лишь дописать в OnClose строку fOkno:=nil; и всё, никаких извратов и ненужных конструкций.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter