Отмена действия

  • Автор темы Guest
  • Дата начала
G

Guest

Не могу сделать элементарную вещь!
1. Жмем по закрытию окна.
2. Всплывает окно:
- Сохранить, Не сохранять и Отмена.

Вопрос: Как правильно прописать кнопку «Отмена».
 
E

etc

Что значит - "правильно"? вас что интересует?
 
G

Guest

Вот есть форма.
Вот жмем на крестик или Alt+F4 и откр. другая модал. форма.
На ней три кнопки: да, нет, отмена.
Вопрос: Какой код нужно прописать кнопке отмена, что бы первая форма не закрылась, ведь она основная. Просто прикол в том, что вторая форма сплывает при событии OnClose, тойсь все, что бы я не делал, при окончании того действия, все ровно закроется первая форма!
-----------------------------
Можно же конечно переписать всю прогу, что бы та форма, которая мне нужна, была второй, тогда все будет пучком, но в этом случае тяжело это сделать...
 
E

etc

RКакаято абракадабра.
Т.е. вы закрываете окно, и сразу открываете другое, но при чем тут какаято кнопка на другой, если уже первая закрыта???
короче ниче не понятно, вы расскажите че вам надо, только не про формы а про смысл.
 
G

Guest

Откройте ворд, напишите там че-то и попробуйте закрыть программу! Всплывает вопрос, хотите сохранить или нет? А есть еще кнопка отменить (тойсь отменить закрытие). Вот я и хочу узнать как отменить закрытие проги! :)
 
E

etc

В ворде при "всплытии" того окна, сам ворд не закрываеться, чувствуете разницу?
Вариантов сделать такое масса, один из - OnCloseQuery, но с ним надо быть осторожней.
 
Y

Yason

Сантехник, вот код для билдера, в дельфи переводится почти дословно :)
Код:
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
switch (MessageDlg("Save?", mtConfirmation, mbYesNoCancel, 0)) {
case mrYes:
ShowMessage("Saved");
CanClose = true;
break;
case mrNo:
CanClose = true;
break;
case mrCancel:
CanClose = false;
break;
default:
ShowMessage("WTF?!");
}
}
 
E

etc

Yason Что будет если прога бует закрываться вместе с системой, т.е. шотдаун сделали?
 
Y

Yason

etc, действительно, появится неприятное окошко, которое будет мешать системе выгружаться; в конце концов система или выдаст предложение прибить программу, или сделает это автоматически.
Напомню, однако, что в исходном вопросе про обработку подобных случаев не спрашивалось :)
1. Жмем по закрытию окна.
2. Всплывает окно:
- Сохранить, Не сохранять и Отмена.
 
E

etc

Yason
Ну это не то чтобы ошибка, просто как я уже и подчеркивал в Сообщение #6, надо такие моменты помнить и делать соотв. действия (если надо).
 
G

Guest

Yason, Большое спасибо! Очень благодарен!
 
G

gromoseka

А может просто проверить все необходимое при закрытии окна?
Например, что-то типа
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{
if (MessageDlg("Close application ?", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo,0) == mrYes)
Action = caFree;
else
Action = caMinimize;
}
(пример из билдера)
 
G

Guest

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if (MessageDlg("Close application ?", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo,0) == mrYes)
Action = caFree;
else
Action = caMinimize;
}

Это пример лучше, потому, что если CanClose будет равно false, то система вообще не завершит свою работу... А если использовать Action, то она ее насильно завершит в случае завершения... Вот только нужно не Action = caMinimize;, а Action = caNone; :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!