月別アーカイブ: 2026年3月

Code Editor あれこれ

Delphi のコードエディターを使っていて、個人的に(あれ !?)って思う機能が2つ。

1.驚愕のショートカット その1

1つは、カスタマイズ出来るのかもしれませんが、左向き矢印キーを押し下げ続けた際のカーソルの挙動です。コードエディターの行の左端までカーソルが移動すると、一般的なエディター(?)ならカーソルは現在の行の上の行へと移動すると思うのですが(そのエディタを開発したプログラマさんの考えによるものと拝察しますが)、Delphi のコードエディターでは、カーソルは画面の左端位置をまるで死守するかのように、そこで頑ななまでに停止し続けます。

もって瞑すべし。左向きの矢印キーの連打にも必死に抵抗、テコでも動かないカーソルの立派な態度は見習うべきものがあります。

個人的には、実はこの機能がとても気に入っていて、コードエディタの右側に表示される 縦のガイドラインである「右マージン」(Right Margin)をはるかに超えて、右へ、右へ、と 長~くコードを書いてしまったときなど、とにかく左向き矢印キーを押し下げ続けていれば、現在カーソルがある行の先頭まで戻れるので、いつの間にか、これを多用するクセがつき、他のエディタを使っている時につい、うっかり、左向きの矢印キーを押し下げ続けてしまい、意図しない遥か上の行へとカーソルが移動・・・みたいなことも。

ただ、アセっている時など、カーソルの移動速度がトロくてイラつくことも、多々あり・・・
(こんな時、コードエディター下のスクロールバーをマウスで操作するのは、手が3本あれば話は別だと思いますが、非常に面倒くさい)

実は、(コレが言いたかったことなのですが)これにはショートカットなる裏ワザがあって、左向きの矢印キーを押し下げ続けなくても、なんと、(私の PC では)Fn キー + Home キー押し下げで現在編集している行の左端へ、イッキに戻れることを、先日偶然、発見。

小学生の頃、宇宙戦艦ヤマトで「ワープ」という航法を知り、激しく感動した記憶は今も胸にあざやかですが、この事実にはそれ同等か、それ以上の驚きを感じました。

だって、20年以上、そんな機能の存在すら、知らなかったのですから・・・

チャリンコで風を切りながら、わーぷできんかなー♪ と考えていたあの頃がなつかしぃ

それとは別に海を見下ろす丘からの長いながい下り坂。マシンと一体化するマンガか、なにかの真似をしてチャリンコの後ろの方へ足を伸ばしつつ、わーぷをイメージして駆け下ったら、右足が後輪のスポークにはさまってわーぷどころか、大急ブレーキ。足の甲がチギれたかと思うほど痛い目にあったのも、今では懐かしい思い出です。改めて実感。バカは何も今に始まったことでなく・・・

もしかして、死んでも なおらない・・・?
この世に未練がある場所、いっぱいあるもんなー
あぁ ことごとく、あの日、あの場所に戻れたら。

なにはともあれ、左へ戻るなら Fn + Home キー

こんなイイコトがあったなんて、誰も教えてくれないんだもの。前回の記事にも書きましたが、Delphi を使い続けること20年・・・、こちらも初めて知る驚愕のテクでありました。

2.驚愕のショートカット その2

同じ驚きが、コメント化にも潜んでいました。

AI にコードを書いてもらって、それを試してみる時など、「絶対に動く」保証などどこにもありませんから「現在、不満を抱えつつも or 不備を内包しつつも、捨てるに捨てられない procedure / function はとりあえずコメント化」して、その上か下に(私は下ですが) AI が書いてくれたコードを貼り付けて試す・・・みたいなことを、どなた様も普通におこなっていらっしゃる今日この頃のではないかと思うのですが、その際問題になるのがコメント化の方法です。Delphi のコメント化の場合、もちろん使用するのは、それが1行、2行なら // で、それが複数行にわたる場合は皆さま { } だと思うのですが、

マウスでドラッグしてコメント化したい範囲を選択


んで、Ctrl + / を実行。・・・すると

んごっ!(みたいな衝撃はありませんが、感覚的にはありで)

最後の d; 部分に現れる「芸の細かさ」にも魂はふるえ・・・


さらに、あろうことか・・・ そのまま、もいちど Ctrl + / で

元に戻ります・・・

ひー

こんなイイコトがあったなんて、誰も教えてくれないんだもの。前回の記事にも書きましたが、Delphi を使い続けること20年・・・、こちらも初めて知る驚愕の一手でありました。・・・と、もう一度書くしかない厳粛な事実を、どう受け止めたらよいのでありましょう?

てか、こういう時代ですから、IDE 側でこちらの気持を忖度して、左向きのキーが長押しされたら、

「それなら Fn + Home が便利です」とか・・・

超絶、延々と範囲選択したら、

「コメント化なら Ctrl + / だよ」などと・・・

テレパシーで送信するのは無理だとしても、せめて StatusBar あたりに表示してもらえたら・・・

と、思ったのですが、そぉいうのは、無理かなー やっぱり?

いっしょに暮らしている方が、この記事を読んだら、きっと、

それがどしたん?
おまえが勉強しとらんだけだろ?

そうおっしゃるに相違なく。

でも、海より深く感動した事実とささやかな夢を、またまたインターネットの片隅に・・・

おまけ 驚愕のショートカット その3

ナニと、それがかち合うとその機能が停止するのか・・・ AI はLSPの解析タイミングとかなんとか言ってましたけど・・・ ほんとのところは未だにまったくわかりませんが、動いてくれると大変便利なんですが、最近、動かないショートカットの代表が、Ctrl + Shift + V です。

あの記事を書いた頃は、それなりに動いていたんだけど、なー


動いてくれれば、こんなに便利なショートカットは他にないと思うのですが、3日くらいまえかなー? 偶然のように動くのを見た記憶があるのですが、あれから1度も動きません。

メニューのリファクタリングから見ると、いつもグレーアウトしています。


これが、いつも期待通りに動くと、すごく、うれしいんだけど、なー☆

かみさま 僕の Delphi で Ctrl + Shift + V が今度動く日は、いつー?

お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。ここに記載した内容を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。

case文と列挙型

新しく開発中のデジタル採点システムで、試験形式を分類するための公開列挙型を次のように interface 宣言部に宣言しました。

// 試験の形式
type
  TExamFormat = (efMarkOnly, efMixed, efHandOnly);

TExamFormat の列挙値の意味は次の通りです。

efMarkOnly:マークシート方式
efMixed:マークシートと手書きの併用方式
efHandOnly:手書き方式

で、驚いたのは、これを case 文で使用する時の挙動です。

case ExamFormat of

と、書きまして、Enter キーを叩いたら、

  case ExamFormat of
    efMarkOnly: ;
    efMixed: ;
    efHandOnly: ;
  end;

・・・と、全自動で入力されました!

こんな便利な機能が case 文にあったなんて!!

20年以上、Delphi に触れてきて、恥ずかしい限りですが、昨日、初めて知りました!!!

理由はわかりませんが、

めちゃくちゃ感動!

この感動と驚きをインターネットの片隅に。

CPU Window は見たくない

ずっと、そう思っていました。・・・ってか、新しい Delphi は玄人向け仕様に進化して、エラーが起きたら、デフォルト CPU Window が表示されるんだなー みたいな。うわー すごいなー!! みたいな。

(僕がそう思い込んでいただけで、上の記述は完全な誤りです)

いつか、この画面の意味がわかるようになりたいなー!


だから、エラーが発生すると僕みたいなド素人はもぉたいへん・・・。>_<

OutPutDebugString(デバッガが受信できるデバッグストリームに文字列を出力する API )を随所に入れて、どこまで無事に動いたか? みたいな方法で、膨大な手間暇をかけてエラーが起きた行を特定するしかなく・・・

s := 'Step1 Passed';
OutPutDebugString(PChar(s));

Hoge Hoge

s := 'Step2 Passed';
OutPutDebugString(PChar(s));

Hoge Hoge Hoge

s := 'Step3 Passed';
OutPutDebugString(PChar(s));

プログラム書いてるんだか、OutPutDebugString経を唱えてるんだか、わからない状態に・・・

もちろん、悩み相談できる人もなく・・・普通に考えて、Delphi 使って開発しているヒトが僕の周囲数十(ひょっとすると数百・・・)km以内にいるとは思えないし・・・、で、Object Pascal のことなら何でも答えてくれる AI に訊いても、Delphi の IDE の具体的な操作方法になると全然ダメで、ありもしない『オリジナル』メニュー項目を創作したり? それってもしかして Delphi 7 の時代のメニューじゃない? みたいな、僕の12.3 にはない操作方法をまことしやかに案内されたり・・・

だから、CPU ウィンドウは、なるべくなら見たくないものの代表でした。
Delphi 12.3 のエラー発生時のデフォルト設定は「 CPU ウィンドウの表示 」。
今、考えると、それは僕の悲しい思い込みだったようです。

【もくじ】

1.ある日 AI が言いました
2.CPU ウィンドウが消えた!
3.デフォルト CPU ウィンドウの表示じゃなかったの?
4.まとめ
5.お願いとお断り

1.ある日 AI が言いました

午前2時、太陽が出ている間は陽の当たらない場所を歩くことが多い僕にとって、いちばん輝いた時間です。ほんと、心安らかに Delphi との会話を楽しめる、他にたとえようもないくらい、大好きで大切なひと時です。

ふと思い立って AI に訊いてみました。

Q:Delphiで、エラーが発生した行を突き止めたいのですが CPU という Window が出てしまいます。エラーが発生した行を示すように設定を変更したいです。Delphi のバージョンは 12.3 です。このバージョンに合わせて正しい設定方法を出来る限り、わかりやすく、教えてください。

AI の回答を要約。

1. ビルド構成を「Debug」にする
画面右側の「プロジェクト マネージャ」で [ビルド構成] のツリーを展開し、[Debug] が太字(アクティブ)になっていることを確認。もし [Release] が太字になっていたら、[Debug] をダブルクリックして切り替える。

2. 「デバッグ用の .dcu を使用する」をオンにする
※ これは 12.3 では「デバッグ版 DCU の使用」という名称でした。
IDE上部のメニューから [プロジェクト] > [オプション] をクリックして、プロジェクトオプション画面を開き、左側のツリーメニューから、[ビルド] > [Delphi コンパイラ] > [コンパイル] を選択。画面一番上の「ターゲット」というドロップダウンが [Debug 構成] になっていることを確認。右側の設定リストの中から [デバッグ] というグループを探し、[デバッグ用の .dcu を使用する] という項目を [True] に変更する。

3. 「最適化」をオフにし、「デバッグ情報」をオンにする
[コンパイル] の画面で、[コード生成] グループの中にある [最適化] を [False] にする。続けて、左側のツリーメニューから、[ビルド] > [Delphi コンパイラ] > [リンク] を選択し、[デバッグ情報] という項目を [True] に設定。

設定が終わったら、画面右下の [保存] ボタンを押してオプション画面を閉じる。

4. プロジェクトの「クリーン」と「ビルド」を実行する
設定を変更した後は、古いコンパイル結果が残らないように全体を再構築する必要がある。この手順を忘れると設定が反映されない。方法は、メニューから [プロジェクト] > [(プロジェクト名)クリーン] をクリックする。続いて、メニューから [プロジェクト] > [(プロジェクト名)をビルド] をクリックして実行する。

おかしな部分も多少ありましたが、いつもより、かなりまともな回答をいただけました。
(実は今まで何度もこのような質問をして、そのたびにガッカリしてきた記憶が・・・)

【おかしな部分】

① 誤:「デバッグ用の .dcu を使用する」 → 正:「デバッグ版 DCU の使用」


② 完全な誤り:メニューから [プロジェクト] > [(プロジェクト名)クリーン] をクリックする。

そんなメニュー項目は Delphi 12.3 にはありません。でも、すぐにピンときました。キーワードは「クリーン」です。そう、IDE の画面右上にあるツールウィンドウの「プロジェクト」に表示されている exe を右クリックすると出るサブメニューの「クリーンアップ」のこと? みたいな・・・

exe を右クリックするとサブメニュー(下)が表示される
きっとコレだ!

ダメもとで上記設定1~4を早速 設定 & 実行 してみました☆ すると・・・

2.CPU ウィンドウが消えた!

長い間、見たことのない懐かしい画面が出現したのです。CPU ウィンドウは表示されず、画面に薄い赤い線引きで(あぁ、御懐かしい)表示されたのは System.SysUtils の内部エラーが発生している行☆

こんな感じ(画像はイメージで、実際の画面とは異なります)

今思えば、僕が書いたプログラムのコードじゃなくて、「 System.SysUtils の内部エラーが発生している行 」が表示されているところにも重大な意味があったのですが、もちろん、この時の僕はそんなことは露知らず・・・、もぉうれしくて!!!

CPU Window が消えたー☆☆☆

ヒトはなんて可笑しな生き物なのでしょう。(何にもわかってない僕は)さらに欲を出して・・・

Q:Delphiで、Debug実行時にエラーが発生した場合、System.SysUtils などのエラー発生行が示されますが、自分の書いたコードのエラーが発生する原因になった記述のある位置を表示する方法を教えてください。

AI の回答の要約

常にVCLのソースコードの中まで入ってしまうのが煩わしい場合は、設定を変更すれば「自分のコードに近い場所」で止まりやすくできます。

で、その方法は・・・

1. メニューの プロジェクト(P) > オプション(O) を開く。
2. ビルド > Delphi コンパイラ > コンパイル を選択。
3. 「デバッグ用 DCU を使用」 を False にする。

はぁ?

「デバッグ用 DCU を使用」 を False に?

さっきと逆じゃん☆

どーゆーコト?

みたいな・・・

3.デフォルト CPU ウィンドウの表示じゃなかったの?

この時点で、まだ僕は Debug 実行でエラーが発生した際に表示される画面を「デバッグ用 DCU を使用」の True / False が左右していることに気がついていません。

つまり・・・(わかってしまえばカンタンなのですが)

設定表示される画面メリット
TrueVCL(ライブラリ)のエラー発生個所VCLの内部の動きがわかる
False自分のコードのエラー発生個所自分のコードの誤りがわかる

最初、僕は「デバッグ用 DCU を使用」を True に設定していたので、エラー発生時に表示された画面は System.SysUtils のエラー発生行だったのです。

僕はどちらかと言えば、「自分で書いたコードのエラー発生位置(行)を知りたかった」ので素直に AI にそう訊ねたのですが、AI は僕がくるくるぱーで、実はなんにもわかってないことなんて知りませんから、ごく普通に、至極当たり前の表現で、

常にVCLのソースコードの中まで入ってしまうのが煩わしい場合は設定を Falseにした方がいいよ!

・・・と教えてくれたわけです。つまりこれは、False に設定すれば VCL 内部のエラーを引き起こす原因を作った僕の書いたコードの位置を表示して実行が中断されることを意味します。

なぜ、そのことに気がついたかと言うと、嘘をついても始まりませんから正直に言いますが・・・

Q:エラーの原因になった行を特定するためには、「デバッグ用 DCU を使用」 はTrueにしておくのが正しいのですか? それとも False にする方が正しいのですか? あなたに訊いたら、ある時はTrueにせよ、ある時はFalseにせよ、と一貫性がない答えをいただいて混乱しています。True/Falseどちらが良いのか、わかりやすく解説してください。

この問いに対し AI は『 状況によって正解が変わるんですよ 』と、まるで人間みたいな前置きをした上で、「デバッグ用 DCU を使用」の True / False による挙動の違いを説明してくれました(その極めて簡単にしすぎた感もある要約が上記の表です)。

そぉ だったのかー と、素直に感動☆

もちろん、僕の今後の「デバッグ用 DCU を使用」の設定は False の一択に決定です。僕の書いたコードが VCL にどんな迷惑をかけたかなんてことよりも、その迷惑をかける「きっかけ」となった記述(コード)のある行の方がド素人には重要なのです。

そこを直せば VCL に迷惑をかけずに済むのですから・・・

Delphi 作ったヒト、ほんとにすごいなー☆☆☆

湧き上がる新たな感動に心を震わせたまま、思ったことは(これは My Blog に残しておかなきゃ!)・・・みたいな・・・邪(よこしま)な思い。なんで邪と思うのか、その理由は言葉にできませんが。

Blogに残すにはナニはともあれ、エラー発生時に表示されていた CPU ウィンドウを記録しておかねば・・・と、まともな方向でプログラム書いてる時には思ったこともない「エラーの発生を心から願う」という理解し難い気持ちを抱えつつ、Debug 関連の設定を初期状態(?)に戻してエラーを再現・・・

(エラーが起きるのを、こんな楽しみにしたことも、なかったなー☆)

そう思いつつ、エラーを起こすプログラムを実行(F9)・・・

あ・れ?

CPU Window が出てこない!

どーゆーこと? みたいな・・・

これはもう AI に責任をとってもらうしかありません。

【こんなプロンプトでも AI は言いたいことを理解してくれました!】

Q:今までずっとCPUウィンドウしか出なかったのですが、設定を元に戻しても今度はCPUウィンドウが出なくなりました。なぜですか? 

【驚きの回答の要約】

結論:「一度デバッグ環境をクリーンにしてビルドし直した」ことによって、Delphiの内部管理(デバッグ情報の紐付け)が正常化された。今までCPUウィンドウしか出なかったのは「異常な状態」で、今ソースコードが出るようになったのが「正常な状態」。

そうなった理由は主に3つ。

1.「クリーンアップ」の効果
「プロジェクトをクリーンアップ」したことにより、古い設定(デバッグ情報が壊れていた、あるいはパスが通っていなかった時期)の残骸(.dcu や .exe)が完全に消去された。

2.デバッガが「ソースの場所」を学習(一度「デバッグ用DCU」をオンにしてビルドした際、Delphiのデバッガは「VCLのソースコードはここにある」というパスを正確に認識した。そのため、設定をオフに戻しても、デバッガが「前回の情報を手がかりにソースを見つけ出せる」ようになった。

3.エラー発生元 が「自分のコード」から呼ばれている
あるメソッドを実行してエラーが起きた際、デバッガはまずエラー地点(DLL内)を見るが、「そこはソースがないから、一歩手前の呼び出し元を表示しよう」と判断する。呼び出し元は僕の書いた Unit1.pas。今の環境は「自分のソースコードがどこにあるか」をデバッガが完璧に把握している状態なので、ソースコードを優先して表示し、CPUウィンドウを隠してしまう。

よーするに、今までの僕の環境が異常だったってコト?

つまり、僕の「エラー発生時にまず表示されるのは CPU Window である」というこれまでの認識は完全な誤りでした。

4.まとめ

(1)デバッグ情報不足(含むPath)だと、IDEは「ソースなし」と判断、CPUウィンドウを表示。
(2)デバッグ情報を設定し直すと、ソースコードが優先的に表示されるようになるカモ。
(3)デバッグ用DCUのTrue/Falseの使い分け
 ・自分のミスを探すなら False
 ・VCL 内部でのエラー発生の仕組み・位置を知りたいなら True
(4)今回の出来事を Blog に書いてもイイ?って AI に尋ねたら「全然いいよー」ってお返事でした。
(5)エラーが発生した際に CPU Window が表示されるのはデフォルト設定ではありません。

5.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。記載した内容(プログラムを含む)を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。