2016-02-02 3 views
2

Я пытаюсь вызвать метод FormClose, но у меня есть проблема с его параметрами, когда я пытаюсь:Как вызвать обработчик события FormClose?

FormName.FormClose(nil, CaFree); 

Обычно я могу вызвать обработчик событий компонента с параметром, используя nil или sender as TOBject. Но теперь я получаю сообщение об ошибке:

Constant object cannot be passed as var parameter

Я пробовал много комбинаций для этих двух значений TObject и TAction. Для TObject я попробовал `sender как TObject ', а для TAction - все параметры, такие как CaFree и т. Д.

+2

'FormClose' - это обработчик событий. Почти всегда бывает ошибкой называть это самим. Вы должны просто называть 'Close' (который предназначен только для этого использования). Если вам нужно освободить форму, есть гораздо более подходящие способы сделать это. –

+0

Да, но из-за очень специфического характера проекта я могу закрыть форму без закрытия ParentForm, у ParentForm.onclose есть много функций из-за данных. Моя проблема была решена ниже, в любом случае, спасибо за внимание. – Toster

+1

Вы можете закрыть форму, не закрывая ее родительскую форму, не вызывая FormClose. Как я уже сказал, если вам нужно это сделать, вы, вероятно, делаете что-то очень не так. Ответ Дэвида может решить вашу ближайшую проблему, но делать неправильную вещь и найти хакерское исправление обычно означает больше проблем в будущем. Во-первых, вы должны делать все правильно. –

ответ

4

Второй параметр - это параметр var, что и сообщение об ошибке компилятора. Поэтому вам нужно передать переменную. Вы не можете передать литерал.

var 
    Action: TCloseAction; 
.... 
Action := caFree; 
Name.FormClose(nil, Action); 

Обратите внимание, что вы почти наверняка не должны этого делать. Вы не предназначены для прямого вызова обработчиков событий. Структура будет называть их в соответствующее время. Я думаю, что очень вероятно, что вы ошибаетесь, думая, что вам нужно просто запустить этот обработчик событий или даже выполнить код вне обычного сценария закрытия формы.

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

+0

Спасибо, что anwser поможет мне решить проблему. Какой еще метод Параметры этого параметра также необходимо задать для переменной? – Toster

+1

Вам необходимо передать переменную для параметров 'var' и' out'. Другие параметры могут принимать любое выражение правильного типа или выражение, которое может быть неявно передано правильному типу. –