Метод Form::Close, событие FormClosing и аргумент события CloseReason. Установить пользовательскую CloseReason?

Это вопрос, аналогичный этому, но я обнаружил, что ответ не работает при переносе на С++. Событие FormClosing всегда запускается любым методом, используемым для закрытия формы, поэтому значение _programmaticClose всегда равно false при выходе. Кроме того, вызов базовой функции OnFormCLosing приводил к бесконечному циклу!

Мне нужно различать кнопку «Применить», кнопку «Отмена», «X», Alt + F4 и т. Д.


person user2941165    schedule 31.10.2013    source источник


Ответы (1)


Недвижимость

FormClosingEventArgs.CloseReason

доступен только для чтения, поэтому вы не можете изменить его вручную после запуска события Closing.

Что вам нужно сделать, так это определить собственное перечисление CloseReason.

enum CloseReason
{
    Apply, Cancel, X, AltF4 // etc...
}

И добавьте в форму две переменные:

private:
    bool forceClose = false;
    CloseReason closeReason;

Затем в методе FormClosing напишите этот код (здесь я предполагаю, что событие вызывает метод с именем Form1_FormClosing):

void Form1_FormClosing(Object sender, FormClosingEventArgs e)
{
    if (!forceClose)
        e->Cancel = true;
}

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

Теперь для каждого «альтернативного» метода закрытия формы вам нужно написать другой обработчик событий, который сообщает форме, как она закрывается, а также фактически закрывает ее, если это необходимо. Например, если у вас есть кнопка с именем ApplyButton, которую вы хотите закрыть форму:

void ApplyButton_Click(Object sender, EventArgs e)
{
    closeReason = CloseReason::Apply;
    forceClose = true;
    this->Close();
}

И просто повторите этот формат для других методов закрытия. Когда ваш пользователь закрывает форму с помощью «X», будет вызываться только метод FormClosing, поэтому вам нужно написать дополнительный код в этом методе, если вы хотите, чтобы произошло что-то особенное.

person Alex Walker    schedule 31.10.2013
comment
В конце концов, подсказанный вашим ответом, я обнаружил, что самое простое - установить для _programmaticClose (или эквивалентного) значение false по умолчанию. Затем, если и только если была нажата кнопка «Применить», я установил для нее значение true. Так что нет необходимости в FormClosing вообще. - person user2941165; 31.10.2013