Delphi エラーのやっつけ方

これは何

Delphi で何かをしようとした時に出るエラーの対策ページです. 毎回説明するのが面倒になった TA が勝手に作ったものの可能性が疑われます.

実行結果がおかしい場合は下の「挙動がおかしい索引」から 該当するおかしさを選択すると,何かわかるかもしれません.

エラーメッセージが出る場合は,下の「エラーメッセージ索引」から表示されたエラーメッセージを選択すると, もしかしたらどこがおかしいのか分かるような情報が手に入るかもしれません. ただし,ありがちな間違いの場合にしか対応していないので, そもそも出てきたエラーメッセージが索引に無いかもしれませんし, ここに書かれている対策ではうまく対処できないこともあります. 参考程度ぐらいに使ってみてください.

内容は随時追加されていく・・・かもしれません.

挙動がおかしい索引

エラーメッセージ索引


write や writeln の使い方がよくわからない

まずは使い方の基本を確認してみます.

write( )やwriteln( )の中に書くときは,変数の中身を表示させたいときは変数名をそのまま書き, 打ったとおりに表示させたいばあいはクオート(')で囲みます.つまり,次のような感じです.
・画面に「b」と表示したいときは, write('b');
・画面に変数bの値(中身)を表示したいときは, write(b);

次に,表示したいものが複数ある場合はカンマ(,)で区切って書きます.たとえば,
・write('山笠が', 'あるけん', '博多たい');
と書けば,「山笠が」と「あるけん」と「博多たい」が順に書かれるので, 結局「山笠があるけん博多たい」と書かれるわけです.

たとえば,変数bに20という値が入っていて,「bの値は20です」と表示させたければ,
・「bの値は」と書く
・bの値を書く
・「です」と書く
という順でやればいいので,
・write('bの値は', b, 'です');
と書けばOKです.・・・だいたいわかりました?

write と writeln の違いは,何かを画面上に書いた後改行するかしないかです. 詳しくは教科書の6ページに書いてあるのですが,たとえば,
write('A');
write('B');
write('C');
write('D');
を実行すると「ABCD」と表示されますが,
writeln('A');
writeln('B');
writeln('C');
writeln('D');
を実行すると「
A
B
C
D
」と表示されます.

実数(real型とか)を表示したら「2.30000000000000E+0000」みたいに表示される

なお,「2.30000000000000E+0000」ってのは「2.30000000000000×10の0000乗」って意味です. 実数を素直に表示させるとこのようになってしまうので,気に入らない場合は,たとえばreal型の変数cを表示するときは

writeln(c);

ではなく

writeln(c:4:4);

のように書くと,「2.3000」と表示されます.この「4」の部分が小数点第何位まで表示するかを表します. 詳しく知りたい場合は教科書の15ページの「書式付き出力文」ってとこを読んでみてください.

以下余談.「writeln(c:4:4);」は本来は「cを全部で4文字で,かつ小数点以下を4文字で書いてくれ」 という意味なんですが,小数点以下が4文字なら全部で6文字以上になってしまうので「全部で4文字」は実現できません. 実現できないのでその部分は無視されたりします.だから,「writeln(c:0:4);」と書いても同じことになります.

家でDelphiをインストールしたけど「使用許諾コード」とかいうのが取得できない

ぶっちゃげ今はもう取得できませんが取得する必要もありません. たぶんこのページ を見たんだと思いますが,そのページは古すぎるページで,書いてあることはウソです. こっちのページ に書いてあることが本当なので,こっちを信じてください.

ていうか,古いページにリンクが張られているのは問題なので, 今度基盤センターに文句言っておきます ページを管理している峯先生にメールしたら一瞬で直してくださいました.

何回やっても何回やってもDelphiが終わらないよ

Internal Error PRO-2688
が延々出てくるとか,終了しようとしても
デバッグ中です.終了してよいですか?
と言われて,「OK」を押しても
アクセスが拒否されました
が出てきて終了させてくれない場合は,以下の手順で強制終了してください.

CtrlキーとAltキーを押しながらDeleteキーを押す.すると, 「Windows タスク マネージャ」が起動する.
タスク マネージャ
「プロセス」のタブを選択し, 「delphi32.exe」を選んで 「プロセスの終了」ボタンを押す.
タスク マネージャのプロセスタブ
…delphi32.exeがなかなか見つからない場合は, 「イメージ名」と書かれている部分をクリックすると 表示がアルファベット順になって探しやすいです.
「タスク マネージャの警告」というメッセージが出るので, 「はい」を押してください.これでDelphiが終わります.
タスク マネージャの警告

ちなみに,エラーを起こしている最中のプログラムを クローズボックス(ウィンドウ右上の×ボタン)で終了するとこういう状態に なりやすいです. プログラムがエラーを起こしたら, あわてずに後ろに出ているエラーメッセージを閉じたあと, Delphi の「実行」メニューから「プログラムの終了」を選んでください.

プログラムの行が青くなったり赤くなったりしてうまく実行できない

下みたいな感じになっている場合の対処法です.
青い例
赤い例

赤いときはその行に移動してF5を押せば直ります. 青いときは,何度かF7キーを押すと直ります.

メールでレポートを提出するように言われて,ファイル名を 「ID(lt107000とか)-1.exe」にして提出しろって言われたのに, そういう名前で保存しようとすると「'lt107000-1' は適切な識別子ではありません.」と怒られる.

こうなる場合...

ごめんなさい,ハイフンが含まれるファイル名では保存できません! 別な名前で保存して実行し,提出する寸前にファイル名だけ変更してください.

[エラー] XXXXXX.dpr(XX): 演算子またはセミコロン (';') が必要です

このエラーが出た場合はたいがいエラーになっている行の直前の行の末尾にセミコロンを書き忘れています. たとえば・・・

エラーの例

一見「writeln('こんにちは', b, 'さん!');」がエラーを起こしているように見えますが, 間違っているのは前の行の「readln(b)」で,「readln(b)」の後ろにセミコロン(;)が抜けています.

[エラー] XXXXXX.dpr(XX): 未定義の識別子 : '■■'

このエラーが出るのはだいたい次のどちらかの場合です.

■■の部分が変数名(たぶんaとかbとかxとか)の場合

たぶんその変数をvarの部分に書き忘れて(宣言し忘れて)います.たとえば,

エラーの例

この例だとvarのところに「c : integer;」を書き忘れているので, 「未定義の識別子 : 'c'」と怒られます.

■■の部分が画面に表示したい文章の場合

その文章をクオート記号(')で囲み忘れていると思われます. 日本語の文書をクオートで囲み忘れると真っ赤に表示されるのですぐ気づきますが, 半角文字の文書(英文とか)を画面に表示させようとしている場合は注意が必要です.

[エラー] XXXXXX.dpr(XX): 識別子の多重定義 : '■■'

varの所で同じ名前の変数を2回以上定義してしまっています. ちなみに,PASCALでは変数名の大文字と小文字は区別されないので, 「nagasa」と「Nagasa」と「NAGaSa」は全て同じ変数名として扱われてしまいます.

[エラー] XXXXXX.dpr(XX): 文字列が正しく終わっていません

これが起きるときは,だいたい半角の「'」で囲むべき部分に間違って全角の「’」が使われています.

エラーの例

下が正しい書き方で,上は水色枠の文字が間違って全角の「’」になっています. ぶっちゃげ肉眼での区別は困難ですが,よく見ると図の茶色枠の部分の文字が紺色になっています. この部分は正しく書けば黒くなります(下の例ではちゃんと黒です).

[エラー] XXXXXX.dpr(XX): 'Integer' と 'Extended' には互換性がありません

整数の割り算に「/」を使っていませんか?整数の割り算は「div」です.

たとえば,a,b,cが整数のとき,
・a := b / c;
は間違いで,正しくは
・a := b div c;
です.

割り算なんか使ってないときは,だいたい整数型の変数に実数を代入してしまっています.

ほか

Valid XHTML 1.0 Strict