Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 431

Раздел: Delphi » Прочее
/ вопрос решён /

Здравствуйте!
Все же выяснилась небольшая недоработка в коде, а именно в окне подтверждения закрытия программы.
При нажатии что кнопки "ок", что "отмена" программа закрывается.
Что и где нужно дописать именно в этот кусок кода (который в приложении), чтобы закрытие происходило только при нажатии "ок"?

Приложение:
  1. procedure TForm1.N2Click(Sender: TObject);
  2. begin
  3.  
  4. MessageBeep(MB_ICONQUESTION);
  5.  
  6.  
  7. Application.terminate
  8. end;


Northwind Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Northwind (статус: Посетитель)
Вопрос отправлен: 18 февраля 2009, 20:40
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, Белояр!
Легко:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MessageBeep(MB_ICONQUESTION);
  if MessageBox(0, 'Завершить текущий сеанс?', 'Подтверждение...', mb_OkCancel+mb_iconQuestion) = idOK then
    Close;
end;
P.S. Зачем Application.Terminate? Завершайте обычным закрытием главной формы.

Ответ отправил: Dron (статус: Студент)
Время отправки: 18 февраля 2009, 20:46
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Ученый

Здравствуйте, Белояр! Взял ваш исходничек....подправил его немного....теперь по нажатию "крестика" на форме, приложение сворачивается в трей, а по нажатию shift+delete или кнопки в главном меню происходит закрытие приложения.
Поменял я всего две процедуры:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
Application.Minimize;
end;
заменил на

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if a=true then
 CanClose:=true
else
begin
CanClose:=false;
Application.Minimize;
end;
end;
а вместо
procedure TForm1.N2Click(Sender: TObject);
begin
  MessageBeep(MB_ICONQUESTION); 
 if MessageBox(0, 'Завершить текущий сеанс?', 'Подтверждение...', mb_OkCancel+mb_iconQuestion) = idOK then
    Close;
end;
надо прописать
procedure TForm1.N2Click(Sender: TObject);
begin
  MessageBeep(MB_ICONQUESTION);
  if MessageBox(0, 'Завершить текущий сеанс?', 'Подтверждение...', mb_OkCancel+mb_iconQuestion) = idOK then
  begin
   a:=true;
  Close;
  end;
 end;
да, и чуть не забыл, надо объявить глобальную переменную a: Boolean;
ну вот вроде и все.... исходник прикреплен...


P.S. УДачи:))
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Приложение:
  1.  
  2.  


Ответ отправил: Ученый (статус: 8-ой класс)
Время отправки: 19 февраля 2009, 15:00
Оценка за ответ: 5

Комментарий к оценке: огромное спасибо :)

Мини-форум вопроса

Всего сообщений: 17; последнее сообщение — 18 февраля 2009, 21:24; участников в обсуждении: 3.
Ученый

Ученый (статус: 8-ой класс), 18 февраля 2009, 20:46 [#1]:

тоесть вам по клику кнопки надо чтобы вылетела табличка с вопросом "завершить или нет"?
Northwind

Northwind (статус: Посетитель), 18 февраля 2009, 20:49 [#2]:

табличка уже есть, просто при нажатии кнопок (любой из двух) происходит закрытие программы, должно быть по одной.

>>Завершайте обычным закрытием главной формы.
у меня при закрытии главной формы переходит в трей.)
Dron

Dron (статус: Студент), 18 февраля 2009, 20:51 [#3]:

Цитата:

у меня при закрытии главной формы переходит в трей.)

Тогда ставьте какой-нибудь флажок и по нему определяйте, свернуть в трей или завершить работу совсем. Application.Terminate - всё-таки крайний способ.
С уважением.
Northwind

Northwind (статус: Посетитель), 18 февраля 2009, 20:57 [#4]:

я как новичок человек дикий в этом плане, потому не понял, что вы имеете в иду насчет флажков и куда их подставлять.
попробовал этот код:
procedure TForm1.Button1Click(Sender: TObject);
begin
MessageBeep(MB_ICONQUESTION);
if MessageBox(0, 'Завершить текущий сеанс?', 'Подтверждение...', mb_OkCancel+mb_iconQuestion) = idOK then
Close;
end;

возникли ошибки:

[DCC Error] Unit1.pas(142): E2003 Undeclared identifier: 'Button1Click'
[DCC Error] Unit1.pas(142): E2029 ';' expected but '(' found
[DCC Error] Unit1.pas(146): E2029 '(' expected but ';' found
[DCC Error] Unit1.pas(149): E2029 Declaration expected but identifier 'Application' found
[DCC Error] Unit1.pas(150): E2029 '.' expected but ';' found
[DCC Error] Unit1.pas(35): E2065 Unsatisfied forward or external declaration: 'TForm1.N2Click'
[DCC Fatal Error] Project1.dpr(6): F2063 Could not compile used unit 'Unit1.pas'
Ученый

Ученый (статус: 8-ой класс), 18 февраля 2009, 20:59 [#5]:

хех....я скопирывал код, данный Dron'ом, все блестяще работает :)
Ученый

Ученый (статус: 8-ой класс), 18 февраля 2009, 20:59 [#6]:

да, а процедуры вы ручками пишете?
Northwind

Northwind (статус: Посетитель), 18 февраля 2009, 21:03 [#7]:

>>да, а процедуры вы ручками пишете?

копипастом...
Ученый

Ученый (статус: 8-ой класс), 18 февраля 2009, 21:03 [#8]:

А чем вам не нравится if MessageDlg('Вы действительно хотите выйти?',mtWarning,[mbYes,mbNo],0), только тем, что вместо надписи "подтверждение" будет "Warning"?
Northwind

Northwind (статус: Посетитель), 18 февраля 2009, 21:04 [#9]:

теперь код выглядит так:

procedure TForm1.N2Click(Sender: TObject);
begin
MessageBeep(MB_ICONQUESTION);
if MessageBox(0, 'Завершить текущий сеанс?', 'Подтверждение...', mb_OkCancel+mb_iconQuestion) = idOK then
Close;
end;

но кнопка закрывания не работает.
Ученый

Ученый (статус: 8-ой класс), 18 февраля 2009, 21:06 [#10]:

копирую что вы написали, ставляю, все работает, все закрывается....
Northwind

Northwind (статус: Посетитель), 18 февраля 2009, 21:06 [#11]:

>>А чем вам не нравится if MessageDlg('Вы действительно хотите выйти?',mtWarning,[mbYes,mbNo],0), только тем, что вместо надписи "подтверждение" будет "Warning"?

а вместо mtWarning можно поставить например mtПодтверждение?
да мне это в принципе нравится, просто не было Warning, а было Confirm.
Northwind

Northwind (статус: Посетитель), 18 февраля 2009, 21:09 [#12]:

>>копирую что вы написали, ставляю, все работает, все закрывается....

возможно в нашем коде какие-то нестыковки с этим вариантом происходят.
куда здесь можно отправить исходники для просмотра чего не так?
Ученый

Ученый (статус: 8-ой класс), 18 февраля 2009, 21:10 [#13]:

нет нельзя написать "mtПодтверждение", т.к. mtWarning отвечает по мимо зоголовка окшка еще и за картинку, которая там будет...
Ученый

Ученый (статус: 8-ой класс), 18 февраля 2009, 21:11 [#14]:

Исходники залей хоть сюда: http://www.rapidshare.com/, покопаюсь посмотрю...
Northwind

Northwind (статус: Посетитель), 18 февраля 2009, 21:20 [#15]:

http://rapidshare.com/files/199670240/WSN.rar.html
Ученый

Ученый (статус: 8-ой класс), 18 февраля 2009, 21:21 [#16]:

сегодня не смогу.....спать пора....а вот завтра, если будет актуально, обязательно покопаюсь
Northwind

Northwind (статус: Посетитель), 18 февраля 2009, 21:24 [#17]:

хорошо, спасибо.
в принципе устраивает как сейчас реализовано, только главное чтобы программа при нажатии Файл-Выход -- выходила, а при нажатии кнопки выход на главной форме шла в трей...

31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:50
Выполнено за 0.04 сек.