- ベストアンサー
Delphi XEのTry文の使い方
var h:real; begin h:=StrToFloat(edit1.Text); <---ここでエラーがで出る(数字以外の文字が入るとエラー) ・ ・ その後演算処理 今はStrToFloatDefでしのいでしますが、エラーが起きない代わりにその後の演算処理まで進んでしまい変な値が出てしまいます。 やはり、エラーを拾い、メッセージを出して演算を止める必要があるのですが。。。。 わかる方(Try文)教えて下さい。お願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
10回に一回くらいメッセージが出るとなると、ちょっとお手上げです。 やはり、実行環境に何か原因があるような気がします。 確認しておくべきことは、 数値に変換できない文字のとき、例外が発生していないのか、それとも、例外が発生しているのにメッセージが表示されないのか。 例外が発生しているのにメッセージが表示されないとしたら、 例外処理の中だけメッセージボックスが表示されないなのか、通常の処理の中でもメッセージボックスが表示されないのか。 の2点でしょう。 もし、例外が発生しているのに例外処理の中だけメッセージボックスが表示されないというのなら、 例外処理の中では、エラーフラグを立てておき、例外処理を抜けてからエラーフラグを判定してメッセージボックスを表示するという方法ではどうですか。
その他の回答 (3)
- nag0720
- ベストアンサー率58% (1093/1860)
>二番目のやり方ですが例外を拾わなくなりました。。。。(T_T)。 二番目のStrToFloatDefを使う方法は、エラーにはならないので例外は発生しません。 数字に変換できない文字のとき、-1.0E100を代入し、それを判断して処理を分岐させる方法です。 exeファイルでメッセージボックスが出ないのは、もしかしたらDelphi XEの実行環境のせいかもしれません。 メッセージボックスの表示先が実行マシンのモニターになっていないとか・・・ メッセージボックスではなく、別の方法、例えば、エラーファイルを作成するなどして確認してみてはどうですか。
補足
二番目の方法はなんとか解決できました。 一つづつ解決します。 「メッセージボックスの表示先が実行マシンのモニターになっていない」はどうやって確かめるのですか? それにおかしいのは、10回に一回くらいはメッセージが出るのですよ。。。 (長い間のお付き合いありがとうございます。)
- nag0720
- ベストアンサー率58% (1093/1860)
>作成されたexeファイルではなかなかメッセージボックスが出てくれません もしかしたら、別のエラーが発生しているかもしれません。 on EConvertError do ではなくて、 on Exception do にしてみてください。 on E:Exception do ShowMessage(E.Massage); とすれば、エラーの内容が表示されます。 もしどうしてもダメなら、StrToFloatDefを使う方法で、 edit1.Textに絶対に入力されることがない値を利用して、 h:=StrToFloatDef(edit1.Text,-1.0E100); if h<-1.0E99 then begin // エラー処理 Exit; end; というような方法もあります。
補足
一番目のやり方は変わりませんでした。相変わらずEConvertErrorを出しております。exeからはメッセージが出ません。 またメッセージ(e.Message)の内容は「’’は浮動小数点数ではありません」です。 二番目のやり方ですが例外を拾わなくなりました。。。。(T_T)。
- nag0720
- ベストアンサー率58% (1093/1860)
一番簡単な使い方は、 try ・・・・・ h:=StrToFloat(edit1.Text); ・・・・・ except // エラー処理 ・・・・・ end; tryからexceptまでの間にエラーが発生すると、exceptの次の行に制御が移ります。
補足
レスありがとうございます。 try h:=StrToFloat(edit1.Text); ・・・・・ except on EConvertError do // 変換の失敗による例外 begin ShowMessage('文字が含まれています'); end; end; にて、Delphiではエラー再現時メッセージがでるのですが、作成されたexeファイルではなかなかメッセージボックスが出てくれません、どこか、コーディングが変でしょうか?
お礼
フラッグを立ててみてわかりました。 On e:ConvertError doのあとは一行だけのときはBebin,End;を使ってはいけないのです。 お陰さまでわかりました、長い間お付き合いありがとうございました。