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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2007, 20:25   #1
KirkMETAL
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 12
Вопрос Проблема с закрытием MDIChild'ов(Delphi)

Delphi...
Многооконный редактор(MDI). На закрытии у меня стоит такая процедура:
.....
If MDIChildCount=0 then Application.Terminate
else
for i:=0 to MdiChildCount-1 do
MDIChildren[i].Close;
Application.Terminate;
.....
У дочерней формы такая процедура:
....
If Memo1.Modified then
begin
beep;
res:=MessageDlg('В файл '+FName+' внесены изменения. Сохранить?',mtConfirmation,mbYesNoC ancel,0);
If res=mrYes then
begin
Form1.SaveFileClick(Sender);
action:=cafree;
end;
If res=mrCancel then Action:=CaNone;
If res=mrNo then Action:=caFree;
end
else
action:=cafree;
....
Проблема в том, что если создано одно или два дочерних окна, то всё нормально закрывается, а вот если три и более то уже после закрытия второго окна появляется "Access Violation и т.д.".
Я новичок в этом деле, и, наверное, не знаю всех тонкостей, подскажите в чем проблема?
Пробовал делать не через for i:=0 to MdiChildCount-1 do
MDIChildren[i].Close;
а через зацикливание процедуру на саму себя с условием но кол-во окон, такая же ошибка...

P.S. Если кто может подскажите ещё как лучше сделать сохранение каждого окна в отдельный файл, а то я там условий понакрутил, а скорее всего есть более простой выход из ситуации, просто я его не знаю...

Последний раз редактировалось KirkMETAL; 25.11.2007 в 03:05.
KirkMETAL вне форума Ответить с цитированием
Старый 24.11.2007, 20:43   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Я так и не понял, а где в событии закрытия дочерней формы CLOSE?
FREE, это - хорошо, а где CLOSE?
Ваша проблема - (на мой взгляд) - вы пытаетесь освободить еще занятые (незакрытые) ресурсы...
"Пробовал делать не через for i:=0 to MdiChildCount-1 do
MDIChildren[i].Close;"
Уважаемый! Кау только вы закрыли одну форму, MdiChildCount уже уменьшился... Он не вычисляется больше, увы! Этот параметр цикла - вычисленнная константа (единожды).
Поэтому у вас и возникает "Access Violation".

Последний раз редактировалось mihali4; 24.11.2007 в 20:56.
mihali4 вне форума Ответить с цитированием
Старый 24.11.2007, 20:56   #3
KirkMETAL
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 12
По умолчанию

Мне бы знать куда его пристроить это Close. Я думас на Free окно закрывается. А если я в конце процедуры добавляю Close, то у меня вообще не закрывается.
Хм... А можно по-подробней насчёт MDIChildCount?
Если я правильно понял, то нужно свой счетчик ставить, и тогда все нормально будет. Например, на OnShow у дочерней поставить n:=n+1 а на OnClose n:=n-1... И тогда делать If n=0 и т.д. ?
KirkMETAL вне форума Ответить с цитированием
Старый 24.11.2007, 21:02   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Мне бы знать куда его пристроить это Close
Он "пристраивается", во-первых, на закрытие дочерней формы внутри нее самой.
Во-вторых, если вы хотите "прикрыть" ее из главной формы, сделайте Try Fomrкакая-то.Close (кстати, тогда и Free не нужно), но (я имею в виду Try...Except...) это так, на всякий случай...
mihali4 вне форума Ответить с цитированием
Старый 24.11.2007, 21:11   #5
KirkMETAL
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 12
По умолчанию

Ну я и говорю, что на на закрытии дочерней формы(TForm2.FormClose) ставлю Close, и вообще не закрывается...
Кстати, затея с счётчиком не помогла...
А что значить ""прикрыть" ёё из главной формы"? Меня интересует именно при закрытии программы вообще, внутри всё окна по отдельности закрываю и все нормально.
KirkMETAL вне форума Ответить с цитированием
Старый 24.11.2007, 21:25   #6
KirkMETAL
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 12
По умолчанию

Вот сама прога(Delphi7), так посмотри.
И ещё насчёт закрытия и сохранения что-нибудь подскажи.
Вложения
Тип файла: zip Editor.zip (43.9 Кб, 15 просмотров)
KirkMETAL вне форума Ответить с цитированием
Старый 24.11.2007, 21:40   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Для начала:
переделываем
Код:
procedure TForm1.OpenFileClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
    If n=0 then MNewClick(Sender);
    With ActiveMDIChild as TForm2 do
    begin
      FName:=OpenDialog1.FileName;
      Memo1.Lines.LoadFromFile(FName);
      Caption:=FName;
      If n=0 then MNewClick(Sender);
   end;
end;
end;
и это тоже
Код:
procedure TForm1.VihodClick(Sender: TObject);
var i:integer;
begin
  If n=0 then Application.Terminate
  else
  for i:=0 to n-1 do
  MDIChildren[i].Close;
  Application.Terminate;
end;
"Application.Terminate" гробит все, что находится "ниже" главной (родительской) формы, поэтому
Код:
if n=0 then Application.Terminate
  else
  for i:=0 to n-1 do
  MDIChildren[i].Close;
- это извращение (прошу прощения за синоним).
Смотрю дальше...
Просмотрел (мельком).
Осталось только одно замечание - "проблема" пишется с одним "М" (мы же интеллигентные люди! Не так ли?).

Последний раз редактировалось mihali4; 24.11.2007 в 22:02.
mihali4 вне форума Ответить с цитированием
Старый 24.11.2007, 21:51   #8
KirkMETAL
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 12
По умолчанию

Ты говоришь про If n=0 then Application.Terminate или про Application.Terminate?
Если убрать тот что с If ,то если не будет дочерних окон при закрытии то будет ошибка, т.е. это такой обход ошибки.
А вот первые 2 цитаты я не понял...
KirkMETAL вне форума Ответить с цитированием
Старый 24.11.2007, 22:03   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
А вот первые 2 цитаты я не понял
Пардон... Я теперь пометил красным...
mihali4 вне форума Ответить с цитированием
Старый 25.11.2007, 03:13   #10
KirkMETAL
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 12
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Пардон... Я теперь пометил красным...
Я то понял, что их исправить надо, но что именно. Тот же Application.Terminate заменял на Close, эффекта никакого. А в первой цитате я вообще не понял, что неправильно...
KirkMETAL вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемма с 3d max 9 Crivel Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 29.08.2008 23:03
проблемма сссылками CopTupoBo4Huk HTML и CSS 7 21.08.2008 22:45
Проблемма c if Crivel Помощь студентам 8 08.08.2008 15:28
проблемма с подключаемыми файлами ratibor32 Общие вопросы C/C++ 4 18.01.2008 11:36