• ベストアンサー

Delphi XEのTry文の使い方

var h:real; begin h:=StrToFloat(edit1.Text); <---ここでエラーがで出る(数字以外の文字が入るとエラー) ・ ・ その後演算処理 今はStrToFloatDefでしのいでしますが、エラーが起きない代わりにその後の演算処理まで進んでしまい変な値が出てしまいます。 やはり、エラーを拾い、メッセージを出して演算を止める必要があるのですが。。。。 わかる方(Try文)教えて下さい。お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.4

10回に一回くらいメッセージが出るとなると、ちょっとお手上げです。 やはり、実行環境に何か原因があるような気がします。 確認しておくべきことは、 数値に変換できない文字のとき、例外が発生していないのか、それとも、例外が発生しているのにメッセージが表示されないのか。 例外が発生しているのにメッセージが表示されないとしたら、 例外処理の中だけメッセージボックスが表示されないなのか、通常の処理の中でもメッセージボックスが表示されないのか。 の2点でしょう。 もし、例外が発生しているのに例外処理の中だけメッセージボックスが表示されないというのなら、 例外処理の中では、エラーフラグを立てておき、例外処理を抜けてからエラーフラグを判定してメッセージボックスを表示するという方法ではどうですか。

taka0012
質問者

お礼

フラッグを立ててみてわかりました。 On e:ConvertError doのあとは一行だけのときはBebin,End;を使ってはいけないのです。 お陰さまでわかりました、長い間お付き合いありがとうございました。

その他の回答 (3)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.3

>二番目のやり方ですが例外を拾わなくなりました。。。。(T_T)。 二番目のStrToFloatDefを使う方法は、エラーにはならないので例外は発生しません。 数字に変換できない文字のとき、-1.0E100を代入し、それを判断して処理を分岐させる方法です。 exeファイルでメッセージボックスが出ないのは、もしかしたらDelphi XEの実行環境のせいかもしれません。 メッセージボックスの表示先が実行マシンのモニターになっていないとか・・・ メッセージボックスではなく、別の方法、例えば、エラーファイルを作成するなどして確認してみてはどうですか。

taka0012
質問者

補足

二番目の方法はなんとか解決できました。 一つづつ解決します。 「メッセージボックスの表示先が実行マシンのモニターになっていない」はどうやって確かめるのですか? それにおかしいのは、10回に一回くらいはメッセージが出るのですよ。。。 (長い間のお付き合いありがとうございます。)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

>作成された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; というような方法もあります。

taka0012
質問者

補足

一番目のやり方は変わりませんでした。相変わらずEConvertErrorを出しております。exeからはメッセージが出ません。 またメッセージ(e.Message)の内容は「’’は浮動小数点数ではありません」です。 二番目のやり方ですが例外を拾わなくなりました。。。。(T_T)。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

一番簡単な使い方は、 try ・・・・・ h:=StrToFloat(edit1.Text); ・・・・・ except // エラー処理 ・・・・・ end; tryからexceptまでの間にエラーが発生すると、exceptの次の行に制御が移ります。

taka0012
質問者

補足

レスありがとうございます。 try h:=StrToFloat(edit1.Text); ・・・・・ except on EConvertError do // 変換の失敗による例外 begin ShowMessage('文字が含まれています'); end; end; にて、Delphiではエラー再現時メッセージがでるのですが、作成されたexeファイルではなかなかメッセージボックスが出てくれません、どこか、コーディングが変でしょうか?

関連するQ&A

  • delphi try文の使い方

    下記コードのようにエラーを回避したいのですが、try文が機能せずエラーになります。 procedure TForm1.Button1Click(Sender: TObject); var p:integer; begin edit1.text:='abc'; try p:=strtoint(edit1.Text); except p:=-1; end; label1.Caption:=inttostr(p); end; try文の使い方がわかりません。

  • Delphi XEの警告文を消したい

    [DCC 警告] Unit5.pas(216): W1050 set 式で WideChar がバイト char に縮小されました。'SysUtils' ユニットの 'CharInSet' 関数で使用することを検討してください。 との警告文が出ます。 ソースは procedure TForm5.Edit2KeyPress(Sender: TObject; var Key: Char); begin if not(key in['0'..'9','.',Char(VK_RETURN),Char(VK_BACK)]) then Key:=Char(0); end; です。何処をどうしたら良いのかさっぱりわかりません。 分かる人具体的に解決方法を教えてください、お願いいたします。

  • Delphi XE5をアップデートしたら(2)

    前回アップデートしたら例外処理がおかしくなったという質問をしましたが、 あれから、いろいろやっていたら、exeファイルから実行すると正常にエラーメッセージが出て、RAD Studioから実行すると(デバッグモード?)、ShowMessageのエラーメッセージが出ないことがわかりました。 もしかしたらupdateは関係ないかもわかりません。 (今となっては検証しようがありません) でも、これってデバッガモード(?)の正常な動作なんでしょうか? //前回の質問 Delphi Xe5 Starterを使っています。 今日update2をインストールしたら、動作がおかしくなりました。 プログラムは次の通りです。 ------------------------------------------------- procedure TForm1.TestDoButtonClick(Sender: TObject); var Rep, pattern: string; begin pattern := FindEdit.Text; Rep := ReplaceEdit.Text; try Memo2.Lines.Text := TRegEx.Replace(Memo1.Lines.Text, pattern, Rep, []); except ShowMessage('正規表現にエラーがあります'); end; end; ---------------------------------- たしか、アップデートする前には正規表現にエラーがあれば、「正規表現にエラーがあります」が表示されたはずですが、システム?のエラー表示が出て、プログラムが停止します。 どこか間違ってますか?

  • delphiで検索機能を作成したいのですが・・・

    Edit1に数字を打ち込むとMemo1に表示されている同じ数字にカーソルが向かうようにしたいのですが procedure TForm1.Button1Click(Sender: TObject); begin FindAndSel(Edit1.Text,Memo1); end; としてしまうと、同じ数字があった場合でも下の行に移らずに同じ行を参照し続けてしまいます。 検索で表示されたそこから先を更に検索するにはどのようにすれば良いのでしょうか? また、001と打ってしまうと001 0012の両方が検索に引っ掛かってしまいますが完全に一致した場合のみ表示されるようにするにはどうすれば宜しいのでしょうか? ご存じの方がいらっしゃればご教授お願いします。また、このHPが分かりやすいなどありましたらお教えください。

  • 例外処理(try...catch...)ができない?

    (1/2) 文末のように、よくある(1) 和暦→西暦、(2) 西暦→和暦 変換スクリプトで、 nullだったり半角数字だったりした場合のエラー処理として、 (1) は、次のようにしたらOKでした。 try{ alert("西暦"+wareki+"年"); } catch(e) { alert( "エラーです。入力した値を確認して下さい。" ); } しかし、(2) は同様に次のようにしても、nullや半角英字だったりすると スクリプトエラーになってしまいます(例外処理されない) try{ alert(seireki1+seireki+"年"); } catch(e) { alert( "エラーです。入力した値を確認して下さい。" ); } どこに誤りがあるのでしょうか?よろしくお願い致します。

  • Delphiのフォーカスのデータの取得。

     嬉しくって、質問を締めちゃいました。 ごめんなさい、書き込んでくれる予定だった、ご主人様ぁ~♪。 数字のフォーマットは、 procedure TForm1.TextFormat(Sender: TObject); var i : Integer; begin  i := StrToInt( TEdit(Sender).text );  TEdit(Sender).Text := Format('%.2d',[i]); end; こんな感じにできました。 数行でこんなすごい事ができるなんて、信じられません! まだまだ、例外処理がありますが、がんばります!! ここまでは私の成長の報告で、次が本題です。^w^えへへぇ。 細かい用法や単語の説明ではなく、全体的なソフトの作り方を説明しているHPや、ソースが見られる簡単なソフトはないでしょうか? Delphiのソース付きのソフトもいくつか見ましたが、やはり初心者には敷居が高くって、もっとシンプルなものでいいのですが。 これからもがんばれるために、ご主人様よろしくおねがいますぅ。

  • DelphiからHDDを直接読みたいのですが・・

    最終的には数テラの容量があるハードディスクドライブを,Delphi6からWin32APIのSetFilePointerで位置付けて,ReadFileでセクタを直接読み取りたいと思っていますが,現在,125GB辺りでエラーが発生し,以降がのセクタが読めません。(DelphiXEでも同じエラーとなります)  参考にできる日本語のサンプルも乏しく困り果てています。  どなたか,お教えください。  m(_ _)m  よろしくお願いいたします。 【動作環境】 OS:Windows7 (32) professional 言語: Delphi6(personal) 及びDelphi XE メモリ:2GB 対象ドライブ:USB外付けHDD 250GB(1論理ドライブWindows7でフォーマット) 名称:\\.\PHYSICALDRIVE1 CylindersLo : 30401 CylindersHi : 0 TracksPerCylinder : 255 SectorsPerTrack : 63 BytesPerSector: 512 【問題点】 セクタ0からセクタ245127535までは読める様なのですが,1セクタ進めて245127536セクタを読み込もうとすると,SetFilePointerはエラーなしで通過するも,ReadFileでエラーとなってしまいます。 エラーが起きた時のSetFilePointerとReadFileに与えたパラメータは次の通りです。 Stsector : 245,127,536 real ofset: 125,505,298,432 p_hi: 58 p_lo: 951,246,848 p_hiの戻り値: 58 【プログラムのソース】 var DHandle : Thandle; // ハンドル drv_cnt : integer; // 接続ドライブ数 drvname : String; // 扱おうとするドライブの名称 sectorSize: integer; // セクタのサイズ SectorNum : word; // セクタ番号 Max_num : word; // 読み込もうとするバイト数 buf : array[0..4095*2] of byte; // 読み取りデータの格納域 STsector : int64; // 読み込み開始のセクタ番号 //----------------------------------------------------------- function getSector:boolean; // ダイレクト読み取り var dwRet : integer; // Seekのリターンコード dwSize : DWORD; // 読み取ったバイト数 iRet : Boolean; // Readのリターンコード real_ofs : int64; // 読み込もうとする位置(先頭からのバイト数) p_lo : integer; // SetFilePointerで使用するseek相対位置の下位32bit p_hi : integer; // 上位32bit begin result := false; SectorNum := 1; //一度に読むセクタ数 Max_num := SectorNum * SECTORSIZE; // 一度に読むバイト数 // ハンドルの取得 DHandle:=CreateFile(PChar(drvname),GENERIC_READ or GENERIC_WRITE, 0,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0 ); if DHandle = INVALID_HANDLE_VALUE then begin // Openエラー処理 showmessage('open device エラー'); exit; end else begin // real_ofs := STsector * SECTORSIZE; // seek位置をバイト単位で取得 p_hi := real_ofs div 2147483648; // 上位32bitを計算 p_lo := real_ofs mod 2147483648; // 下位32bitを計算 dwRet:= SetFilePointer(DHandle, p_lo, @p_hi, FILE_BEGIN ); // seek if dwRet <> -1 then begin // 1セクタ分をbuf[]へ読み込み iRet := ReadFile(DHandle,buf,Max_num,dwSize,nil); if iRet = False then begin // Readエラー処理 showmessage('Read device エラー'); CloseHandle(DHandle); exit; end // dump_Buf; 読み取ったバッファの16進ダンプルーチン呼び出し end else begin // seekエラー処理 showmessage('Seek エラー'); CloseHandle(DHandle); exit; end; end; CloseHandle(DHandle); result := true; end; ※申し訳ありません,先頭の空白がGooによって自動的に削除されてしまうようです。

  • SQLserverのIF文について

    どうしてもIF文がうまくいきません IF文の中にIFを入れ子していますそのIFが複数の条件があります 今までACCESSではELSEIFで条件をいくらでも指定できたのですがSQLの場合はエラーになってしまいます ご教授おねがいします ------------------------------ set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER FUNCTION [dbo].[scfc_part端数処理] ( @PTHASU nvarchar(10), @haken nvarchar(10) ) RETURNS real AS BEGIN DECLARE @PARTT real DECLARE @PARTT_H real if (not(@PTHASU is null)) if @haken='派遣' or @haken='臨時' if substring(@PTHASU,4,2)>= 50 SET @PARTT = convert(int,LEFT(@PTHASU,2)+1)*60 --ここをいれるとエラー IF substring(@PTHASU,4,2)< 50 and substring(@PTHASU,4,2)>= 20 --ここをいれるとエラー SET @PARTT = convert(int,LEFT(@PTHASU,2)*60 +30 --ここをいれるとエラー if substring(@PTHASU,4,2)< 20 --ここをいれるとエラー SET @PARTT = convert(int,LEFT(@PTHASU,2)*60 ELSE SET @PARTT = convert(real,LEFT(@PTHASU,2))*60 + convert(real,substring(@PTHASU,4,2))*1 ELSE SET @PARTT= 0 SET @PARTT_H = convert(real,(floor(@PARTT/60*10000)/10000)) RETURN @PARTT_H END

  • perlのfor文について

    perlなのですが、以下のfor文の書き方について教えてください。 for($var1,$var2,$var3,$var4){ s/^(?:Company|Organization|Office|Location)\s*:\s*// if( $_ ); s/"(?:[^"]|\")*"//g if( $_ ); 1 while s/\([^()]*\)//g if( $_ ); } これは、どのようなfor文なのでしょうか。 for文の最後に「1 while」とあるのですが、最後の行の1とは どういう意味で、ここでは何をしているのでしょうか。 また、if文が置換の処理より後ろにかかれていますが、実際は if文が先に動いているのでしょうか。 それと、「 1 while s/\([^()]*\)//g if( $_ );」が以下のようにエラー がでます。 「syntax error at x.pl line x, near "s/\([^()]*\)//g if"」 エラーを出さないようにするにはどうしたらよいでしょうか。

  • verilogでのwhile文について質問

    verilog初心者です。 while文での処理を記述していたのですが、 下記のように変更するとエラーとなってしまいます。 なんとか出来る方法はないでしょうか? module TEST(in_data, state, clock, reset, out); input [9:0] in_data; input [5:0] state; input clock; input reset; output [5:0] out; reg [5:0] out; always@(posedge clock or negedge reset) begin if(reset == 0) begin out = 0; end else begin out = in_data; while(out > 7)begin out = out >> 1; end end end // always@ (posedge clock or negedge reset) endmodule // TEST 上のように書くと、合成でき、シミュレーションでも期待する値は得ることが出来ました。 以下のようにwhile文を変更するとエラーとなってしまいます。 while(out > state)begin out = out >> 1; end よろしくお願いします。

専門家に質問してみよう