![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректное закрытие приложения ... [D7]
Asail © (2005-12-13 12:25:00)Здрасте!!!
Как можно корректно закрыть приложение, в случае, когда
открыто несколько форм (модальных)?
Грубо говоря, в определенный момент надо закрыть все, что было открыто из главной формы, а затем и саму главную форму.
Проблема в том, что таких модальных форм может быть много.
К тому-же могут оказаться в момент закрытия приложения
открытые диалоговые окна (OpenDlg, SaveDlg), message-боксы (типа ShowMessage), Preview отчетов...
Задача - корректно закрыть приложение, так, что-бы у каждой
открытой формы сработал OnClose (в обратной, относительно порядка открытия форм, последовательности).
Пардон за черезчур длинный вопрос.
Заранее, спасибо!
Asail (2005-12-19 11:32:00) [1]
> clickmaker © (13.12.05 13:17) [7]
> то почему бы не сделать
> for i := Application.ComponentCount-1 downto 0
> if (Application.Components[i] is TForm)
> TForm(Application.Components[i]).Close;
Попробовал так, вроде сработало!
Спасибо.
evvcom (2005-12-19 10:19:00) [2]А... Вон в чем дело! Ну дык... Смотри код TCustomForm.ShowModal
if Application.FTerminate then ModalResult := mrCancel else
if ModalResult <> 0 then CloseModal;
Видишь, если принудительное завершение приложение произошло, то CloseModal не вызывается. Корректнее, думаю, действительно было бы написать:
if Application.FTerminate then ModalResult := mrCancel;
if ModalResult <> 0 then CloseModal;
Но поскольку трогать генофонд не принято, ищи другие выходы. Вешай обработчик OnDestroy, например.
Asail (2005-12-18 17:32:00) [3]2evvcom
> Пробовал из открытой модальной формы (в цепочке их штук
> 6 было) Application.MainForm.Close
А у меня не получается !!!
Вызавыю из последней модальной формы Application.MainForm.Close.
Все формы действительно закрываются, но событие OnClose вызывается
только для главной формы, а у модальных нет. А в этом и был вопрос!
Извиняюсь за занудство...
evvcom (2005-12-15 11:03:00) [4]Кстати, то что я описывал в [9] делалось в D5 да еще и с dll. Может что-то некорректно я описал и может что-то еще. Но сейчас я попробовал в D7 аналогичное проделать, все корректно завершилось. Пробовал из открытой модальной формы (в цепочке их штук 6 было) Application.MainForm.Close; и SendMessage(Application.MainForm.Handle, WM_CLOSE, 0, 0); Все OK!
Asail (2005-12-15 09:56:00) [5]2Alexander Panov
> А при корректном закрытии приложения
А Application.Terminate - это корректное закрытие? И как можно нажать
кнопку "х" в главной форме, если из нее открыта хотя-бы одна модальная
форма?
Alexander Panov (2005-12-14 19:46:00) [6]Добавлю, что событие OnClose основной формы срабоает после закрытия всехмодальных форм.
Alexander Panov (2005-12-14 19:44:00) [7]Asail (14.12.05 18:05) [16]
Я так и не понял, как вызвать form.Close последовательно сверху вниз,
А при корректном закрытии приложения(например, на кнопку "x") модальные формы и так будут закрыты в порядке, обратном их появлению. Если у тебя что-то нужно закрыть, используй событие OnClose этихформ.
Asail (2005-12-14 18:05:00) [8]Я так и не понял, как вызвать form.Close последовательно сверху вниз,
т.е. от последнего открытого окна к первому. Метод Close для всех окон
будет вызываться из главной формы (по таймеру), а после закрытия всех
окон можно вызвать и Close для главной.
Jeer (2005-12-13 18:35:00) [9]evvcom © (13.12.05 17:21) [12]
Может ты и не заметил, может он чего-то не договорил.
Как выясняется - не договорил:)
Jeer (2005-12-13 18:34:00) [10]Asail (13.12.05 18:13) [13]
Не вижу особых проблем, если нет пожеланий интерактивности в вопросе открытых и измененных, но не записанных данных.
Но это неверное проектирование логики работы с датасет.
А так:
TSession.DatabaseCount
Databases[Index: Integer]
DataSets[Index: Integer]
State: -> TDataSetState type
Asail (2005-12-13 18:13:00) [11]Поясню свою задачу...
Необходимо в определенный момент времени (например, по таймеру)
закрыть все приложение. Application.Terminate - не есть хорошо, т.к. убъет
все без разбора, а в открытых окнах могут быть открытые файлы, DataSet'ы
и т.д. Таким образом, надо закрыть все открытые окна прежде, чем
Terminate. Проблема в том, что закрывать окна желательно в обратной
их открытию последовательности. Т.е., если, frmA открыла frmB, то сначала
надо закрыть frmB и только потом - frmA. Особенно это важно если frmB
обращается к компонентам с frmA (datasets например).
evvcom (2005-12-13 17:21:00) [12]
> Jeer © (13.12.05 16:34) [11]
Что-то я не заметил, чтобы где-нибудь говорилось об MDI-приложении.
Jeer (2005-12-13 16:34:00) [13]Это не поможет ? :)
with fmMain do
for i := 0 to MDIChildCount-1 do
MDIChildren[i].Close;
umbra (2005-12-13 15:19:00) [14]может в Application.OnMessage сообщения перехватывать и формы закрывать?
evvcom (2005-12-13 13:56:00) [15]Мне интересно другое. Каким образом у автора вызван frmMain.OnClose? Ведь когда открыта модальная форма, главная недоступна. Остаются только сообщения и прямой вызов Close из модальной. И цикл крутится где-то внутри ShowModal (не надо никому уточнять, где именно, я и сам знаю, как посмотреть). Я когда-то пытался такое сделать, но нашлись более важные дела, так и не додумал, решения не нашел. У меня была тогда проблема, что MainForm уничтожалась в этом случае раньше, чем модальная, и программа выходя из модального цикла, возвращалась в методы и обработчики MainForm, где предполагалось, что Self еще существует, с естественным AV.
Lamer@fools.ua (2005-12-13 13:20:00) [16]>> clickmaker © (13.12.05 13:17) [7]
IMHO, через Screen.Forms (либо Screen.CustomForms) удобнее и быстрее.
clickmaker (2005-12-13 13:17:00) [17]что-то непонятно...
если модальные формы (да и немодальные) создаются как
Form := TForm1.Create(Application)
то почему бы не сделать
for i := Application.ComponentCount-1 downto 0
if (Application.Components[i] is TForm)
TForm(Application.Components[i]).Close;
Ы?
Васяня (2005-12-13 13:07:00) [18]Удалено модератором
Игорь Шевченко (2005-12-13 13:02:00) [19]Васяня
" Еще не хотелось бы видеть открытого коверканья русского языка, использования уличного сленга. "
Понял, да ?
evvcom (2005-12-13 13:00:00) [20]
> Васяня (13.12.05 12:36) [1]
> Чо за муть? зачем такой изврат?
Вот что за муть ты, Васяня, написал с использованием глобальных переменных и пр.? А изврат такой нужен, если ты хочешь написать надежноеприложение. Например, винда закрывается по каким-либо причинам (сигнал от UPS из-за сбоя по питанию).