「範囲チェックエラー」がどこで出たのか知る方法を教えてください

解決


AS  2022-05-16 08:15:10  No: 150198  IP: [192.*.*.*]

長い間、お世話になっていますが、よろしくお願いします。

範囲チェックエラーというのが最近出るようになりました。
これはプログラムのどこででたのかを知る方法はありませんか??

今までは何とか割り出してきましたが、簡単にわかる方法がある
のではと思い、質問に来ました。

よろしくお願いします。

編集 削除
HFUKUSHI  2022-05-16 09:54:00  No: 150199  IP: [192.*.*.*]

IDEからデバッグ実行しているのであれば、メインメニュー→ツール→デバッガ→Embarcaderoデバッガ→言語固有の例外→言語の例外で通知をチェックオンにすると、例外が送出されたときにIDEで捕捉されて実行が一時停止します。

編集 削除
AS  2022-05-16 11:07:45  No: 150201  IP: [192.*.*.*]

ありがとうございます。

デバッグ実行というのは普通の「実行」ですよね??

見てみましたが、チェックは入っていて、実行は一時停止します。
プログラムのどこでエラーが起きたのかを知りたいのですが??

よろしくお願いします。

編集 削除
HFUKUSHI  2022-05-16 13:13:51  No: 150202  IP: [192.*.*.*]

エラーが起きるとプログラムの実行が一時停止してIDEに制御が戻って、デバッガ例外通知のダイアログが表示されます。
ここでブレークを選択すると、IDEのエディタでエラーが発生した行がハイライト表示されます。
ってことではないのかな?

たとえば
procedure TForm1.Button1Click(Sender: TObject);
var
  X: Integer;
  Y: Int16;
begin
  X := High(Integer);
  Y := X;
end;
こんなコードを実行してボタンをクリックすると、Y := X;の行でエラーが発生して止まります。

編集 削除
AS  2022-05-16 22:29:29  No: 150203  IP: [192.*.*.*]

ありがとうございます。

残念ながら何も起きないので、ここに来ました。
何か、ありませんかね。

<ここでブレークを選択すると、IDEのエディタでエラーが発生した行がハイライト表示されます。
<ってことではないのかな?

編集 削除
HFUKUSHI  2022-05-16 23:26:52  No: 150204  IP: [192.*.*.*]

> 残念ながら何も起きない
IDEで例外が捕捉されない、ということでしょうか?

基本的なところから確認させてください。
OSとDelphiのバージョンは?
フレームワークはVCL or FMX?
アクティブな構成は(RELEASEではなく)DEBUGになっていますか?
新規にアプリケーションを作成し、ボタンを1つ配置してOnClickイベントハンドラに↑のコードを記述して、プロジェクトオプションのビルド→Delphiコンパイラ→コンパイル→実行時エラー→範囲チェックをチェックオンとして、デバッグ実行(普通に[F9]で実行)してボタンをクリックして、デバッガ例外通知のダイアログが表示されますか?
表示されたならブレークを選択して、IDEのエディタでY := X;の行がハイライトされていませんか?

編集 削除
HFUKUSHI  2022-05-16 23:38:15  No: 150205  IP: [192.*.*.*]

あ、ソースコードのない(.dcuファイルのみの)ライブラリのなかでエラーが発生した場合はエディタ上でハイライト表示されないかも?
その場合はブレークしてIDEに制御が戻ったときに、左上の呼び出し履歴ペインで当該コードまでの呼び出し履歴が表示され、上から順に選択することでコード上でどのように呼び出しが行われたのかがわかります。

編集 削除
AS  2022-05-20 10:54:47  No: 150212  IP: [192.*.*.*]

返信が遅くなり、失礼しました。

エラーが起こるところを調べて、エラーが起こらないようにチェック機能をつけて、エラーは起らないようになりました。

私もエラーが起こった個所がハイライトされることを期待しています。
OSはWindows10で、DelphiはXE5です。
フレームワークはVCLです。
アクティブな構成、意味が分かりません。
後は実際にやってみます。

編集 削除
AS  2022-05-24 15:21:48  No: 150217  IP: [192.*.*.*]

実際にやってみましたが、
何も起きませんでした。

何か、助言があればよろしくです。

編集 削除
HFUKUSHI  2022-05-25 00:05:54  No: 150218  IP: [192.*.*.*]

何をやって、何が起きて、何が起きなかったのか、詳しく書いてもらえませんか?
IDEの設定としては言語の例外で通知をチェックオン、プロジェクトオプションとしては実行時エラーの範囲チェックをチェックオンで試してください。

編集 削除
AS  2022-06-14 18:35:34  No: 150283  IP: [192.*.*.*]

すみません。
仕事が忙しくて、ここのチェックを忘れていました。

>IDEからデバッグ実行しているのであれば、メインメニュー→ツール→デバッガ→Embarcaderoデバッガ→言語固有の例外→言語の例外で通知をチェックオンにすると、例外が送出されたときにIDEで捕捉されて実行が一時停止します。

ここで、ツール→デバッガ―のデバッガーという選択無いようなのですが??
オプションの中のデバッガーオプションでいいのですよね??

>IDEの設定としては言語の例外で通知をチェックオン、プロジェクトオプションとしては実行時エラーの範囲チェックをチェックオンで試してください。

「プロジェクトオプションとしては実行時エラーの範囲チェック」は、プロジェクト→オプションで「実行時エラー」が見つからないのですが??

XE5ですので古いのですかね??

よろしくお願いします。

編集 削除
AS  2022-06-14 18:48:50  No: 150284  IP: [192.*.*.*]

>左上の呼び出し履歴ペインで当該コードまでの呼び出し履歴が表示され、上から順に選択することでコード上でどのように呼び出しが行われたのかがわかります。

これは確認していませんでしたが、履歴ペインというのはないのですが??
よろしくお願いします。

編集 削除
HFUKUSHI  2022-06-17 06:52:20  No: 150286  IP: [192.*.*.*]

> ここで、ツール→デバッガ―のデバッガーという選択無いようなのですが??
> オプションの中のデバッガーオプションでいいのですよね??
おっと、その通りです。

> 「プロジェクトオプションとしては実行時エラーの範囲チェック」は、プロジェクト→オプションで「実行時エラー」が見つからないのですが??
メインメニュー→プロジェクト→オプションでプロジェクトオプション画面のDelphiコンパイラ→コンパイルの中にある、実行時エラー→範囲チェックの項目です(デフォルトはチェックオフだと思うので、これをチェックオン)。
コンパイラオプションを変更したら再コンパイルを忘れずに。

> 履歴ペインというのはないのですが?? 
実行時に例外が送出されて、IDEがこれを(プログラムよりも前に)捕捉すると、デバッガ例外通知のダイアログ("プロジェクト Project1.exe は例外クラス ERangeError (メッセージ '範囲チェックエラー')を送出しました。")が表示されますが、ここで"ブレーク"を選択すると、IDEの右上のペインに"呼び出し履歴 - スレッド #####"と表示されていませんか?
(デバッガ例外通知のダイアログは言語の例外で通知をチェックオンにしたときに表示されるようになります)

編集 削除
AS  2022-06-25 11:28:16  No: 150294  IP: [192.*.*.*]

返信、ありがとうございました。
こちらの返信がまた時間がかかり、すみません。

実行時エラー→範囲チェックの項目、これはすでにチェック済でした。
IDEの右上のペインに"呼び出し履歴 - スレッド #####"、ありました。

すべて、理解できました。
また、エラーが出たら、見てみます。
ありがとうございました。

また、いつかご迷惑をおかけすると思いますが、
よろしくお願いします。

編集 削除