2013-05-15 9 views
0

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

это кнопка, где я хочу, чтобы вызвать исключение

procedure TForm1.Button3Click(Sender: TObject); 
begin 
    form3.Show; 

end; 
+0

По-видимому, название кнопки 2 является 'Button3'. Могу ли я предложить 'btnShowResults' вместо этого? –

+0

да, вы правы –

ответ

3

Я woudn't поднять исключение, я бы просто показать сообщение об ошибке. В первых строк обработчика щелчка второй кнопки должны быть

if not FTestHasBeenRun then 
begin 
    MessageBox(Handle, 'No test has been run.', PChar(Caption), MB_ICONERROR); 
    Exit; 
end; 

// Display test results here. 

Излишне говорить, что FTestHasBeenRun переменные со значением false по умолчанию, который установлен в true, как только тест завершен.

Он даже может иметь смысл, чтобы отобразить более пологий информационное сообщение, вместо того, чтобы:

MessageBox(Handle, 'No test has been run.', PChar(Caption), MB_ICONINFORMATION); 

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

Если вы предпочитаете исключение, вы можете поднять один вручную, написав

raise Exception.Create('No test has been run.'); 

Тогда вы можете получить отладчик Delphi выскакивать. Но! Это происходит только при запуске приложения из среды Delphi. Если вы запустите свою программу, дважды щелкнув EXE в проводнике Windows, вы получите обычное сообщение об ошибке. Вы можете написать свой собственный код обработки исключений, если хотите представить сообщение в удобной для пользователя форме (не говоря о «исключениях» и т. Д.).

Однако, из ваших комментариев выясняется, что вы делаете не хотите поднять исключение (или показать сообщение об ошибке) вручную. Вы хотите подавить тот, который поднимается где-то в другом месте. Решение должно выполняться так же, как в моем первом фрагменте кода, или отключить вторую кнопку до тех пор, пока не будет выполнен тест. Таким образом, пользователь не сможет дать команду «анализировать данные» до того, как будут проанализированы какие-либо данные.

+0

так что я пытаюсь сделать эту процедуру TForm1.Button3Click (Sender: TObject); начало form3.Show; MessageBox (Handle, «Тест не запущен», PChar (Caption), MB_ICONINFORMATION); конец; но все же появляется другое сообщение об исключении, я не хочу, чтобы он всплывал, я просто хочу, чтобы сообщение не было запущено, чтобы выскочить –

+0

@joe: Первые строки ужасно названной процедуры Button3Click должны быть 'if not FTestHasBeen ... ', как я писал выше. 'Exit' гарантирует, что остальная часть процедуры будет пропущена. И поэтому часть, пытающаяся проанализировать нулевые данные, пропущена, и поэтому вы, вероятно, не получите исключения. [Похоже, вы начинаете анализировать в событии 'FormShow' вашего' Form3' (также ужасно названного).] Конечно, вам решать установить флаг 'FTestHasBeenRun' в' true' после того, как тест был run - значение по умолчанию должно быть «false». –

+0

Что случилось с поднятием исключения? Преимущество состоит в том, что вы позволяете кому-то решать, как с ним справиться. Это позволяет программе GUI превратить ее в окно сообщения и безглавую DLL, чтобы превратить ее в код ошибки. –

3

Я не хочу, чтобы это показать перерыв отменить или продолжить варианты

Это не то, что вы изменили в коде. Вам нужно изменить параметры отладчика, чтобы выполнить это изменение.

Вы можете остановить все исключения провоцировать разрыв/продолжить диалог, уберите пометку Уведомлять об исключениях языка вариант на Исключения языка страницы диалогового окна Параметры отладчика.

Или, если вы хотите быть немного cuter, вы можете игнорировать определенные классы исключений. Опять же, начиная с Язык Исключения страницы диалога параметров отладчика добавьте в список классы исключений. Или, в диалоговом окне break/continue, проверьте Игнорируйте этот тип исключения и нажмите continue.Когда вы попросите игнорировать исключение, вы больше не увидите диалог break/continue для этого класса исключений или его подклассов.


Я пытаюсь вызвать исключение для моей кнопки

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

raise SomeExceptionClass.Create(...); 

Или, если вы хотите, чтобы показать окно сообщения, сделайте это.


Я подозреваю, что вы пытаетесь показать этот код

form3.Show; 

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

  1. Отключить кнопку, которая имеет вызов form3.Show за ним, если вы знаете, что собирается поднять исключение.
  2. Не звоните form3.Show, если вы знаете, что собирается создать исключение.
  3. Позволяет вызывать form3.Show, но обнаруживать условие ошибки, отображать диалоговое окно с сообщением об ошибке, а затем звонить Abort. Вы должны сделать это в коде, который выполняется до того, как форма покажет, поэтому, возможно, вы могли бы добавить метод в форму, которая вызывала бы Show, только если форма была в состоянии для показа. Это позволит вам переместить решение ближе к коду, который знает о причине решения.

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

+0

Это, наверное, так, но я не думаю, что это нужно OP. Ему нужно знать, есть ли какие-то данные для анализа или нет. –

+0

@AndreasRejbrand Я прочитал комментарий к вашему ответу, «но все же появляется другое сообщение об исключении, я не хочу, чтобы он всплывал, я просто хочу сообщение», и из вопроса «я не хочу, чтобы он показывал break cancel или continue options, я просто хочу, чтобы оно отображало сообщение, подобное ошибке ». Поэтому я понимаю, что код уже создает исключение. Нет необходимости поднимать еще один. –

+0

Да, я согласен. Текст Q противоречит заголовку, который заключается в том, что вручную отображается сообщение об ошибке/восходящее исключение. Тем не менее, я считаю, что правильная вещь - * не пытаться анализировать любые данные до того, как тест будет запущен. Таким образом, вы либо отключите кнопку перед запуском теста, либо выполните как в моем первом фрагменте кода (или и том и другом). –

Смежные вопросы