|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.11.2007, 20:25 | #1 |
Пользователь
Регистрация: 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. |
24.11.2007, 20:43 | #2 |
*
Старожил
Регистрация: 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. |
24.11.2007, 20:56 | #3 |
Пользователь
Регистрация: 24.11.2007
Сообщений: 12
|
Мне бы знать куда его пристроить это Close. Я думас на Free окно закрывается. А если я в конце процедуры добавляю Close, то у меня вообще не закрывается.
Хм... А можно по-подробней насчёт MDIChildCount? Если я правильно понял, то нужно свой счетчик ставить, и тогда все нормально будет. Например, на OnShow у дочерней поставить n:=n+1 а на OnClose n:=n-1... И тогда делать If n=0 и т.д. ? |
24.11.2007, 21:02 | #4 | |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
Цитата:
Во-вторых, если вы хотите "прикрыть" ее из главной формы, сделайте Try Fomrкакая-то.Close (кстати, тогда и Free не нужно), но (я имею в виду Try...Except...) это так, на всякий случай... |
|
24.11.2007, 21:11 | #5 |
Пользователь
Регистрация: 24.11.2007
Сообщений: 12
|
Ну я и говорю, что на на закрытии дочерней формы(TForm2.FormClose) ставлю Close, и вообще не закрывается...
Кстати, затея с счётчиком не помогла... А что значить ""прикрыть" ёё из главной формы"? Меня интересует именно при закрытии программы вообще, внутри всё окна по отдельности закрываю и все нормально. |
24.11.2007, 21:25 | #6 |
Пользователь
Регистрация: 24.11.2007
Сообщений: 12
|
Вот сама прога(Delphi7), так посмотри.
И ещё насчёт закрытия и сохранения что-нибудь подскажи. |
24.11.2007, 21:40 | #7 |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
Для начала:
переделываем Код:
Код:
Код:
Смотрю дальше... Просмотрел (мельком). Осталось только одно замечание - "проблема" пишется с одним "М" (мы же интеллигентные люди! Не так ли?). Последний раз редактировалось mihali4; 24.11.2007 в 22:02. |
24.11.2007, 21:51 | #8 |
Пользователь
Регистрация: 24.11.2007
Сообщений: 12
|
Ты говоришь про If n=0 then Application.Terminate или про Application.Terminate?
Если убрать тот что с If ,то если не будет дочерних окон при закрытии то будет ошибка, т.е. это такой обход ошибки. А вот первые 2 цитаты я не понял... |
24.11.2007, 22:03 | #9 | |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
Цитата:
|
|
25.11.2007, 03:13 | #10 |
Пользователь
Регистрация: 24.11.2007
Сообщений: 12
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблемма с 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 |