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

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

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

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

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

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

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

При закрытии убиваете окно, а при открытии не создаете.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.11.2011, 17:07   #3
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Ещё раз - в главной форме MDIForm есть кнопка с кодом:
fOkno := TfOkno.Create(self);
Первый раз окно открывается отлично, всё ок.
Закрывается окно с кодом caFree также без багов.
При повторном нажатии на ТУ ЖЕ кнопку - ошибка!
delphicoding вне форума Ответить с цитированием
Старый 18.11.2011, 18:46   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Сейчас набегут телепаты и на основании вашей инфы будут угадывать причину ошибки. Показывайте код и место аварии.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.11.2011, 12:44   #5
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Если код такой, то всё работает корректно, но есть ненужная возможность создать это окно два раза повторным кликом:
Код:
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 := TfOkno.Create(Application);
fOkno.Show;
Как написать код создания окна, чтобы всё хорошо работало и окно было только в одном экземпляре ???

Последний раз редактировалось delphicoding; 19.11.2011 в 12:50.
delphicoding вне форума Ответить с цитированием
Старый 19.11.2011, 13:21   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а может не надо тысячу раз окно создавать?
создайте один раз, потом просто показывайте/скрывайте.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.11.2011, 14:15   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
процедура закрытия окна caFree
Использование caFree в OnClose убивает окно, но fOkno не очищается. Поэтому попытки опереться на содержимое fOkno заранее обречены на неудачу. Проверять существует ли дочернее MDI-окно нужно используя свойства MDIChildCount и MDIChildren главного MDI-окна. Показывать-скрывать дочерние MDI-окна тоже можно для простого приложения, для более сложного проекта это нерациональное использование ресурсов. В MDI приложениях использование fOkno может привести к серьезным ошибкам. А если две копии одного окна создается, почему бы и нет? Тогда в fOkno будет указатель на последнее созданное окно.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.11.2011 в 14:50.
Аватар вне форума Ответить с цитированием
Старый 05.12.2011, 10:18   #8
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Цитата:
А если две копии одного окна создается, почему бы и нет? Тогда в fOkno будет указатель на последнее созданное окно.
Это криво, зачем юзеру 2 раза один каталог с одинаковыми данными из одного Dataset и синхронизированным курсором?! Два окна не нужны.
Цитата:
Использование caFree в OnClose убивает окно, но fOkno не очищается.
Также подумал, но как его очистить "в автоматическом режиме" для всех наследованных форм??? (то есть как написать код в окне MDIForm или в классе которы наследуется во всех каталогах типа BaseCatalogForm чтобы автоматически при закрытии окна очищалась переменная?!)
Цитата:
Показывать-скрывать дочерние MDI-окна тоже можно для простого приложения, для более сложного проекта это нерациональное использование ресурсов.
Думаю можно было бы и показывать-скрывать, просто не вижу смысла постоянно дерать в оперативке ненужные на текущий момент окна - зачем?
Цитата:
Поэтому попытки опереться на содержимое fOkno заранее обречены на неудачу. Проверять существует ли дочернее MDI-окно нужно используя свойства MDIChildCount и MDIChildren главного MDI-окна.
Пример напишите, пожалуйста...
delphicoding вне форума Ответить с цитированием
Старый 05.12.2011, 11:14   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Пример напишите, пожалуйста...
F1
Цитата:
MDIChildren property (TCustomForm)

TCustomForm See also Delphi example C++ example
Код:
The following code closes all the MDI children of Form1.

var

  I: Integer;
begin
  with Form1 do
    for I := MDIChildCount-1 downto 0 do
      MDIChildren[I].Close;

end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 05.12.2011, 11:39   #10
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Я не понял общей концепции данного предложения - буду очень благодарен за работоспособный код учитывающий особенности задачи:
+ открытие множества каталогов из главного окна MDIForm;
+ формы всех каталогов базируются на унаследованной форме базового каталога;
+ запрет на открытие двух одинаковых окон каталогов;
+ возможность работать с несколькими разными каталогами и возможность закрывать только одно из открытых окон каталогов.
Напишите, пожалуйста, точный код Создания окна и Закрытия окна...
delphicoding вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в потоках (Access violation at address) designer999 Общие вопросы Delphi 9 25.08.2011 16:04
Ошибка Access violation... ара Общие вопросы Delphi 2 15.05.2011 15:57
Ошибка access violation at adress Godod Помощь студентам 2 02.02.2011 11:11
ошибка access violation at address ... Yuran БД в Delphi 5 05.01.2011 16:04
Ошибка Access Violation AHTuKiLLeR Общие вопросы Delphi 8 02.06.2009 10:48