著者 :Marco Cantù
発行者 :Marco Cantù
編集者 :Peter W A Wood, Andreas Toth (second edition)
Copyright 1995-2021 Marco Cantù, Piacenza, Italy.World rights reserved.
本書に記載のサンプルコードは、読者が自由に使用できます。本書のソースコードは著作権で保護されたフリーウェアで、Web サイト https://code.marcocantu.com より入手できます。著作権で保護されているため、コードを印刷物または電子メディアで許可なく再版することはできません。読者には、コード自体を独立した製品として配信、販売または商用に利用しないという制限付きで、アプリケーション内でのこのコードの使用が許可されます。
ソースコードに関するこの特別な例外以外に、原語版または翻訳版の本書の一部または全部を、発行者の事前の同意および書面による許可なくコピー、写真、磁気記録または他の記録媒体を含むいかなる方法
でも検索システムに格納したり、転送または複製することはできません。
Delphi は、エンバカデロ・テクノロジーズの商標です。その他の商標は、それぞれ本文に記載の所有者のものです。著者および発行者は本書の準備に最大限の努力をし、内容はソフトウェアの最新リリースに基づいています。著者および発行者は、本書の内容の完全性または正確性に関していかなる表明も保証もいたしません。また、パフォーマンス、市場性、特定の用途に対する適切性、または本書に直接または間接的に起因する損失または損害に対しいかなる責任も負いません。
Object Pascal Handbook: Delphi 11 Alexandria Edition
この PDF 限定版は 2021 年 11 月に出版されました。
最新の印刷版（Delphi 10.4 Sydney 版）: ISBN-13: 9798554519963

iii
はじめに

はじめに
To my family, Raffaella, Benedetta, and Jacopo,with all of my love and a big thank you for all you do
to take my life ahead of my expectations

強力かつ簡潔、表現力と可読性、学習にもプロの開発にも最適。これが現在の Object Pascal の端的な特徴です。この言語には長い歴史、活発な現在、そして明るい未来があります。
Object Pascal は多面的な言語です。伝統的な手続き型プログラミングスタイルのサポートを維持しながら、オブジェクト指向プログラミング（OOP: object-oriented programing）のパワー、ジェネリックプログラミングの強力なサポート、属性などといった動的な構文要素を併せ持っています。モバイル時代に対応したコンパイラと開発環境を備えた多才なツールであり、過去からの確固たるルーツを持ちながらも、将来にも対応した言語なのです。
Object Pascal 言語は、どのような場面で使われているのでしょうか。デスクトップアプリの記述からクライアントサーバーアプリケーション、大規模な Web サーバーモジュールからミドルウェ
ア、オフィスオートメーションから最新の電話やタブレット用アプリ、産業用自動システムからインターネット仮想電話ネットワーク……この言語が、これらの用途に利用できる可能性があるという仮定の話ではなく、今まさに現実の世界で利用されているのです。
最新の Object Pascal 言語の中核は、1995 年の定義に由来します。この年に Java と JavaScriptが考案されたことを考えると、1995 年はプログラミング言語にとってすばらしい年でした。
Object Pascal のルーツは Pascal の前身に遡りますが、その進化は 1995 年で止まることはありませんでした。現在もコア機能の改良は続けられ、エンバカデロ・テクノロジーズによってデスクトップコンパイラとモバイルコンパイラが作成され、Delphi、RAD Studio で使用することができ
ます。

iv

現在の言語に関する書籍
この言語の役割の変化、長年にわたる拡張、そして今日新しい開発者からも注目を集めているという事実を考えると、現在の Object Pascal 言語について網羅した本を書くことは重要であると考えました。この書籍のゴールは、新たな開発者や他の似たような言語から移行した開発者だけでなく、この言語の最新の変更点について学習しようとしているさまざまな Pascal 系言語の古くからの開発者も対象とした、言語マニュアルを提供することです。
未経験者に基礎が必要なのは当然ですが、変更点が多岐にわたることを考えると、経験者も本書のいくつかの章で新たな発見があるでしょう。
Object Pascal 言語の歴史について簡単に説明した短い付録以外、本書では現在の Object Pascal
言語について解説しています。この言語の中核的な機能の大部分は、1995 年の Object Pascal の最初の実装である Delphi の初期バージョン以来あまり変わっていません。
本書を通して言及していますが、この言語はここ数年、停滞どころか非常に速いペースで進化しています。
過去に書いた他の本では、古典的な Pascal を最初に取り上げ、その後、登場順に拡張について説明するという「時系列的な」手法をとりました。しかし、本書ではより「論理的な」手法を用いています。この言語がどのように進化してきたかではなく、トピックごとに、この言語の現在とその最も良い使用方法について説明します。
たとえば、オリジナルの Pascal 言語から続くネイティブデータ型では、（組み込みの型ヘルパのおかげで）メソッドライクな機能が最近導入されました。第 2 章でこの機能の使用方法を紹介していますが、自分でそのカスタム型を拡張する方法については、後半で触れています。
つまり、本書では現在の Object Pascal 言語について基礎から順に説明し、歴史的な視点は非常に限られています。この言語を過去に使用したことがあっても、最後の数章だけでなく、本書全体にざっと目を通し、新しい機能を確認することをお勧めします。

実践的学習
本書では、まず中核的な概念を説明し、そのすぐ後に読者が実行したり、試してみたくなるような簡単なサンプルを示し、概念の理解と習得につなげることを基本的な考え方としています。本書
はリファレンスマニュアルではありません。この言語が理論上なすべきことについて説明し、考えられる状況をすべて示します。正確であることを心がけていますが、言語について説明すること、実践的で段階的なガイドを提供することによりフォーカスしています。一度に 1 つの機能にフォーカスすることが目標であるため、そのサンプルは通常、非常に単純です。
ソースコード全体は、オンラインコードリポジトリである GitHub にあります。単一のファイルとしてダウンロードしたり、リポジトリのクローンを作成したり、オンラインで表示したり特定のv
プロジェクトのコードのみをダウンロードしたりすることもできます。リポジトリのクローンを作成すると、私がサンプルの変更や追加を行ったときに、自分のコードの該当箇所を容易に特定して更新することができます。GitHub の場所は、Delphi 10.4 Sydney 向けの印刷版で仕様したのと同じです。
https://github.com/MarcoDelphiBooks/ObjectPascalHandbook104

サンプルコードをコンパイルしてテストするには、最新バージョンの Delphi が必要です（すべてを動かすには少なくとも 10.4 が必要です。ただし多くのサンプルは、10.x および 11 リリースでも動作します）。
Delphi のライセンスをお持ちでない方には、トライアル版も用意されており、通常 30 日間無料
でコンパイラと IDE を使用できます。また、無料の Delphi Community Edition（現在バージョン
10.4 にアップデートされています）もあり、ソフトウェア開発によって収益を得ていない場合か
限定的である場合には、無料で利用できます。

謝辞
他の本同様、本書は多くの人々のおかげで完成しました。多すぎてひとりひとり記載できません。本書初版に関わる仕事の大半をともに行ったのは編集者の Peter Wood で、刻々と変わる私のスケジュールに耐え、私の技術英語を改善し、本書を現在の姿にしてくれました。
初版を出してから、読者で開発者の Andreas Toth から初版に関する広範なフィードバックが届きました。その後、彼は第 2 版の編集者として参加してくれ、英文法、書籍としての一貫性、Object Pascal のコーディングスタイルまでをカバーする包括的なコンテンツレビューを行ってくれました。この新版の多くは、彼に依るところが多くあります。
新版は、他の数人の Delphi エキスパート（そのほとんどはエンバカデロ MVP です）によるレビューも受けています。特に François Piette は、最終版のテキストに反映された 100 を超える修正と提案を送ってくれました。
エンバカデロ・テクノロジーズの製品マネージャとしての現在の職のおかげで社内での数え切れないほどの会話、ミーティング、電子メールスレッドで知見が得られ、製品とそのテクノロジに対する理解がさらに深まりました。同僚全員と R&D チームのメンバーに非常に感謝しています。
全員の名前をここで言及することは難しいですが、本書初版に関して直接情報をくれた 3 人については、紹介しておこうと思います。デベロッパーリレーションの David I、開発ツール製品管理のトップであった John Thomas（JT）、そして RAD Studio のチーフアーキテクトの Allen Bauer です。
最 近 で は、RAD Studio の 製 品 マ ネ ー ジ ャ に 従 事 す る 他 の 2 人（Sarina DuPont と David
Millington）と、現在エバンジェリストを務める Jim McKeeth、そして R&D アーキテクトとしてすvi
ばらしい仕事をしてくれている現在のチームの協力も得ています。
エンバカデロ社外の人々も、直接情報が得られる重要な機会を与え続けてくれました。多くのイ
タリアの Delphi エキスパートから、数多くのお客様、エンバカデロのセールスやテクニカルパー
トナーの皆さん、Delphi コミュニティメンバー、MVP、さらには、私がしばしば会っている他の言語やツールを利用する開発者まで、いずれも重要です。
もし、このグループから 1 人の名前を挙げるとすれば、エンバカデロに加わる前に多くの時間を共に過ごした Cary Jensen を紹介したいと思います。彼とは、ヨーロッパと米国で、Delphi
Developer Days を何度か実施しました。
最後に、私の旅行スケジュール、何夜にも及ぶミーティング、週末の他の書物の執筆に耐えてくれた家族に感謝します。ありがとう、Lella、Benny、Jacopo。

著者自身について
過去 25 年の大半を Object Pascal 言語を使用したソフトウェア開発についての執筆、教育、コ
ンサルティングに費やしました。ベストセラーの「Mastering Delphi」シリーズ、自費出版 で作成した（Delphi 2007 から Delphi XE の各バージョンの）開発ツールに関する「Handbook」シリーズなどを執筆しています。
世界中の多くのプログラミングコンファレンスで講演したり、何百人もの開発者にトレーニングを提供してきました。さらに、Delphi 開発者イベント、企業向けのクラスルームトレーニング、オンライン Web セミナー、CodeRage カンファレンスなどでも講演しています。
2013 年、独立したコンサルタント／トレーナーとして長年働いてきた私のキャリアに突然変化が訪れました。すばらしい開発ツールを開発、販売している企業であるエンバカデロ・テクノロ
ジーズでの Delphi および現在の RAD Studio の製品マネージャとしての職を引き受けました。
これ以上読者をわずらわせないよう、現在はイタリアに住んでいて（最近は頻度が減りましたが）カリフォルニアへ通っていること、魅力的な妻と 2 人のすばらしい子供がいること、できるだけプ
ログラミングに携わり、それを楽しんでいることのみ付け加えておきます。
私がこの新版の執筆を楽しんだのと同じくらい、本書を楽しんでいただけたらと思います。さらなる情報については、次の Web サイト、ソーシャルメディアチャンネルを使用してください。
https://www.marcocantu.com

https://blog.marcocantu.com

https://twitter.com/marcocantu

vii

目 次

目 次

はじめに ...........................................................................iii
現在の言語に関する書籍……iv ／ 実践的学習……iv ／ 謝辞……v
著者自身について……vi

第I部
第1章

基礎 …… 1
Pascal でのコーディング .....................................3
1.1

コードから始めよう...........................................................................................................3
最初のコンソールアプリケーション……4 ／ 最初のビジュアルアプリケーション……5

1.2

構文とコーディングスタイル.........................................................................................8
コメント……9 ／ コメントと XML ドキュメント……10 ／ シンボル識別子……12
空白……14 ／ インデント……15 ／ 構文強調表示……17

1.3
1.4

言語キーワード.................................................................................................................18
プログラムの構造............................................................................................................23
ユニットとプログラム名……24 ／ ユニットとスコープ……29
プログラムファイル……30

1.5

コンパイラ指令.................................................................................................................31
条件定義……32 ／ コンパイラのバージョン……33 ／ インクルードファイル……34

第2章

変数とデータ型...................................................37
2.1

変数と代入..........................................................................................................................38
リテラル値……39 ／ 代入文……40 ／ 代入と変換……41 ／ グローバル変数の初期化……41
ローカル変数の初期化……42 ／ インライン変数……42 ／ 定数……45
変数の存続と可視性……47

2.2

データ型..............................................................................................................................48
順序型と数値型……48 ／ Boolean……54 ／ 文字……54 ／ 浮動小数点型……57

2.3

シンプルなユーザー定義データ型.............................................................................60
名前付きの型、名前なしの型……60 ／ 型エイリアス……61
部分範囲型……63 ／ 列挙型……64 ／ 集合型……65

viii

●目

次

2.4

式と演算子..........................................................................................................................67
演算子の使用……67 ／ 演算子と優先度……69

2.5

日付と時刻..........................................................................................................................71

2.6

型キャストと型変換........................................................................................................74

TDateTime ヘルパ……74

第3章

言語の文 ............................................................77
3.1

単純文と複合文.................................................................................................................78

3.2

if 文........................................................................................................................................79

3.3

case 文..................................................................................................................................81

3.4

for ループ...........................................................................................................................83
for-in ループ……87

3.5

while 文と repeat 文.......................................................................................................88
ループの例……89 ／ Break と Continue によるフロー制御……91

第4章

手続きと関数 ......................................................95
4.1

手続きと関数.....................................................................................................................95
前方宣言……98 ／ 再帰関数……100 ／ メソッドとは……101

4.2

パラメータと戻り値.....................................................................................................102
結果を含む Exit……103 ／ 参照パラメータ……104 ／ 定数パラメータ……106
関数のオーバーロード……107 ／ オーバーロードとあいまいな呼び出し……110
デフォルトパラメータ……112

4.3
4.4

インライン化..................................................................................................................114
関数の高度な機能.........................................................................................................117
Object Pascal の呼び出し規約……117 ／ 手続き型……118 ／ 外部関数宣言……121
DLL 関数の遅延読み込み……122

第5章

配列とレコード.................................................1255.1

配列データ型..................................................................................................................125
静的配列……126 ／ 配列のサイズと範囲……127 ／ 多次元静的配列……128
動的配列……130 ／ オープン配列パラメータ……134

5.2

レコードデータ型.........................................................................................................139
レコードの配列の使用……141 ／ 可変レコード……143
フィールドのアラインメント……143 ／ With 文について……145

5.3

メソッド付きレコード................................................................................................147
Self: レコードの隠れたマジック……150 ／ レコードの初期化……151
レコードとコンストラクタ……152 ／ 演算子の新境地……153

ix
演算子とカスタムマネージドレコード……158

5.4

バリアント.......................................................................................................................164
型なしバリアント……164 ／ バリアントの詳細……166 ／ バリアントは低速……167

第6章

5.5

ポインタとは..................................................................................................................1685.6

ファイル型とは..............................................................................................................173

文字列のすべて.................................................175
6.1

Unicode: 世界共通の文字体系.................................................................................175
文字の変遷 :ASCII から ISO エンコーディングへ……176
Unicode コードポイントと書記素……177 ／ コードポイントからバイトへ（UTF）……178
バイト順マーク……180 ／ Unicode についての考察……181

6.2

Char 型の再検討............................................................................................................184
Character ユニットでの Unicode 演算……184 ／ Unicode 文字リテラル……186
1 バイト文字について……188

6.3

文字列データ型..............................................................................................................188
パラメータとしての文字列の渡し……192[] および文字列の文字カウントモードの使用……193 ／ 文字列の連結……196
文字列ヘルパ操作……198 ／ その他の文字列 RTL……201 ／ 書式設定文字列……202
文字列の内部構造……205 ／ メモリ内の文字列について……207

6.4

文字列とエンコード.....................................................................................................208

6.5

文字列の他の型..............................................................................................................212
UCS4String 型……212 ／ 古い文字列型……213

第 II 部 Object Pascal での OOP …… 215
第7章

オブジェクト ....................................................217
7.1

クラスとオブジェクトについて..............................................................................217
クラスの定義……218 ／ 他の OOP 言語のクラス……220 ／ クラスのメソッド……221
オブジェクトの作成……222

7.2

オブジェクト参照モデル............................................................................................223
オブジェクトの破棄……224 ／ 「nil」とは……225
メモリでのレコードとクラス……226

7.3

private、protected、public....................................................................................226
プライベートデータの例……228 ／ カプセル化とフォーム……231

7.4

Self 識別子.......................................................................................................................233
コンポーネントの動的な作成……234

x

●目

次

7.5

コンストラクタ..............................................................................................................236
コンストラクタとデストラクタによるローカルクラスデータの管理……239
オーバーロードされたメソッドとコンストラクタ……241 ／ 完全な TDate クラス……243

7.6

第8章

ネストした型とネストした定数..............................................................................246

継承 ................................................................251
8.1

既存の型からの継承.....................................................................................................251

8.2

共通の基底クラス.........................................................................................................254

8.3

protected フィールドとカプセル化......................................................................255「protected ハック」の使用……2568.4

継承から多態性へ.........................................................................................................258
継承と型の互換性……258 ／ 遅延バインディングと多態性……261
メソッドのオーバーライド、再定義、reintroduce……263
継承とコンストラクタ……266 ／ 仮想メソッドと動的メソッド……267

8.5

抽象メソッドと抽象クラス.......................................................................................268
抽象メソッド……268 ／ Sealed クラスと final メソッド……271

8.6

安全な型キャスト演算子............................................................................................272

8.7

ビジュアルフォームの継承.......................................................................................274
基本フォームの継承……275

第9章

例外の処理 .......................................................281
9.1

try-except ブロック.....................................................................................................282

9.2

finally ブロック.............................................................................................................290

例外階層……284 ／ 例外の発生……287 ／ 例外とスタック……288

finally ブロックを用いたカーソルの復元……292
マネージドレコードを用いたカーソルの復元……292

9.3

実際の例外.......................................................................................................................294

9.4

グローバル例外処理.....................................................................................................294

9.5

例外とコンストラクタ................................................................................................296

9.6

例外の高度な機能.........................................................................................................298
ネストした例外と InnerException メカニズム……299
例外のインターセプト……303

第 10 章 プロパティとイベント .......................................305
10.1 プロパティの定義.........................................................................................................306
他の言語とのプロパティの比較……307 ／ プロパティによるカプセル化……308

xi
プロパティのコード補完……309 ／ フォームへのプロパティの追加……311
TDate クラスへのプロパティの追加……313 ／ 配列プロパティの使用……316
参照によるプロパティの設定……317

10.2 published アクセス指定子........................................................................................319
設計時のプロパティ……320 ／ published とフォーム……321 ／ 自動 RTTI……322

10.3 イベント駆動型プログラミング..............................................................................323
メソッドポインタ……324 ／ 委譲の概念……326 ／ イベントはプロパティである……330
TDate クラスへのイベントの割り当て……331

10.4 TDate コンポーネントの作成...................................................................................334
10.5 クラスでの列挙サポートの実装..............................................................................337
10.6 RAD と OOP を混在させる場合の 15 のヒント................................................340
ヒント 1：フォームはクラスである……341
ヒント 2：コンポーネントに名前を付ける……341
ヒント 3：イベントに名前を付ける……341
ヒント 4：フォームメソッドを使用する……342
ヒント 5：フォームコンストラクタを追加する……342
ヒント 6：グローバル変数を回避する……342
ヒント 7：インスタンス変数をその実装内で決して使わない……343
ヒント 8：フォーム変数の使用を極力回避する……343
ヒント 9：グローバル Form1 変数を削除する……343
ヒント 10：フォームプロパティを追加する……344
ヒント 11：コンポーネントプロパティを公開する……344
ヒント 12：必要に応じて配列プロパティを使用する……344
ヒント 13：プロパティを介して操作を行う……345
ヒント 14：コンポーネントを隠す……345
ヒント 15：OOP フォームウィザードを使用する……346
ヒントに関するまとめ（および参考資料）……347

第 11 章 インターフェイス .............................................349
11.1 インターフェイスの使用............................................................................................350
インターフェイスの宣言……351 ／ インターフェイスの実装……352
インターフェイスと参照カウント……354 ／ 参照の混在によるエラー……356
弱いインターフェイス参照と安全でないインターフェイス参照……358

11.2 高度なインターフェイスの手法..............................................................................361
インターフェイスプロパティ……361 ／ インターフェイスの委譲……363
複数のインターフェイスとメソッドのエイリアス……365
インターフェイスの多態性……367
インターフェイス参照からのオブジェクトの抽出……368

11.3 インターフェイスによる Adapter パターンの実装.........................................371

xii

●目

次

第 12 章 クラスの操作 ....................................................375
12.1 クラスメソッドとクラスデータ..............................................................................375
クラスデータ……376 ／ 仮想クラスメソッドと隠された Self パラメータ……377
静的クラスメソッド……378 ／ クラスプロパティ……380
インスタンスカウンタのあるクラス……381

12.2 クラスコンストラクタ（およびデストラクタ）................................................383
RTL でのクラスコンストラクタ……384 ／ Singleton パターンの実装……385

12.3 クラス参照.......................................................................................................................386
RTL でのクラス参照……388 ／ クラス参照を使用するコンポーネントの作成……389

12.4 クラスとレコードヘルパー.......................................................................................392
クラスヘルパー……392 ／ クラスヘルパーと継承……396
クラスヘルパーを使用したコントロール列挙の追加……396
組み込み型用のレコードヘルパー……400 ／ 型エイリアス用のヘルパー……402

第 13 章 オブジェクトとメモリ .......................................405
13.1 グローバルデータ、スタック、ヒープ.................................................................406
グローバルメモリ……406 ／ スタック……407 ／ ヒープ……408

13.2 オブジェクト参照モデル............................................................................................409
オブジェクトのパラメータ渡し……410

13.3 メモリ管理の Tips........................................................................................................411
自分で作成したオブジェクトの破棄……412 ／ オブジェクトの破棄は 1 回限り……413

13.4 メモリ管理とインターフェイス..............................................................................416
弱い参照の詳細……416 ／ unsafe 属性……421

13.5 メモリの追跡とチェック............................................................................................422
メモリの状態……422 ／ FastMM4……423
リークの追跡とその他のグローバル設定……424
フル機能の FastMM4 でのバッファオーバーラン……425
Windows 以外のプラットフォームのメモリ管理……428
クラスごとの割り当ての追跡……429

13.6 堅牢なアプリケーションの記述..............................................................................429
コンストラクタ、デストラクタ、例外……430 ／ ネストした finally ブロック……432
動的型チェック……433 ／ ポインタはオブジェクト参照か……435

xiii

第 III 部

高度な機能 …… 439

第 14 章 ジェネリクス ....................................................441
14.1 ジェネリック Key-Value ペア..................................................................................442
インライン変数とジェネリック型推論……446 ／ ジェネリクスの型規則……446

14.2 Object Pascal におけるジェネリクス...................................................................447
ジェネリック型の互換性規則……448 ／ 標準クラスのためのジェネリックメソッド……450
ジェネリック型のインスタンス化……452 ／ ジェネリック型関数……454
ジェネリッククラスのためのクラスコンストラクタ……458

14.3 ジェネリック制約.........................................................................................................460
クラス制約……460 ／ 特定のクラス制約……463 ／ インターフェイス制約……463
インターフェイス参照 対 ジェネリックインターフェイス制約……467
デフォルトコンストラクタ制約……468
ジェネリック制約のまとめとこれらの組み合わせ……470

14.4 既定のジェネリックコンテナ...................................................................................471
TList<T> の使用……472 ／ TList<T> のソート……473
無名メソッドによるソート……475 ／ オブジェクトコンテナ……477
ジェネリックディクショナリの使用……478
ディクショナリ 対文字列リスト……483

14.5 ジェネリックインターフェイス..............................................................................485
既定のジェネリックインターフェイス……488

14.6 Object Pascal のスマートポインタ........................................................................489
スマートポインタにレコードを使う……489
ジェネリックマネージドレコードを用いたスマートポインタの実装……491
ジェネリックレコードとインターフェイスによるスマートポインタの実装……493
Implicit 変換の追加……495 ／ スマートポインタソリューションの比較……497

14.7 ジェネリクスと共変戻り値型...................................................................................497
Animal、Dog、Cat を扱う……497 ／ ジェネリック結果を伴うメソッド……499
異なるクラスの継承オブジェクトを返す……500

第 15 章 無名メソッド ...................................................503
15.1 無名メソッドの構文と意味.......................................................................................504
無名メソッド変数……504 ／ 無名メソッドパラメータ……505

15.2 ローカル変数の使用.....................................................................................................506
ローカル変数の寿命の延長……507

15.3 無名メソッドの舞台裏................................................................................................509
かっこの省略に関する問題……509 ／ 無名メソッドの実装……511
出来合いの参照型……512

xiv

●目

次

15.4 無名メソッドの実際の利用.......................................................................................514
無名イベントハンドラ……514 ／ 無名メソッドの速度……516
スレッド同期……518 ／ Object Pascal における AJAX……521

第 16 章 リフレクションと属性 .......................................527
16.1 拡張 RTTI.........................................................................................................................528
最初のサンプル……528 ／ コンパイラで生成される情報……530
Weak および Strong 型リンク……532

16.2 RTTI ユニット................................................................................................................532
Rtti ユニットの RTTI クラス……535
RTTI オブジェクト有効期間の管理と TRttiContext レコード……536
クラス情報の表示……538 ／ パッケージの RTTI……540

16.3 TValue 構造体................................................................................................................541
TValue を使用したプロパティの読み取り……544 ／ メソッドの呼び出し……545

16.4 属性の使用.......................................................................................................................546
属性とは……546 ／ 属性クラスと属性宣言……547 ／ 属性の参照……550

16.5 仮想メソッドインターセプタ...................................................................................553
16.6 RTTI ケーススタディ..................................................................................................557
ID および記述の属性……558 ／ XML ストリーミング……564
その他の RTTI ベースのライブラリ……572

第 17 章 TObject および System ユニット ....................575
17.1 TObject クラス..............................................................................................................576
作成と破棄……576 ／ オブジェクトに関する知識……577
TObject クラスのその他のメソッド……578 ／ TObject の仮想メソッド……580
TObject クラスのまとめ……585 ／ Unicode およびクラス名……586

17.2 System ユニット...........................................................................................................587
重要な System 型……588 ／ System ユニットのインターフェイス……589
重要な System ルーチン……590 ／ あらかじめ定義された RTTI 属性……590

第 18 章 その他のコア RTL クラス ..................................593
18.1 Classes ユニット...........................................................................................................594
Classes ユニットのクラス……594 ／ TPersistent クラス……595
TComponent クラス……596

18.2 最新のファイルアクセス............................................................................................599
入出力ユーティリティユニット……599 ／ ストリームの概要……602
Reader および Writer の使用……604

xv
18.3 文字列および文字列リストの作成..........................................................................607
TStringBuilder クラス……607 ／ 文字列リストの使用……609

18.4 巨大なランタイムライブラリ...................................................................................609

おわりに ........................................................................613

付 録 …… 615
付録 A

付録 B

Object Pascal の発展 .....................................617
A.1

Wirth の Pascal.............................................................................................................618

A.2

Turbo Pascal..................................................................................................................618

A.3

初期の Delphi の Object Pascal..............................................................................619

A.4

Object Pascal - CodeGear からエンバカデロまで...........................................620

A.5

モバイルへの進出.........................................................................................................620

A.6

Delphi 10.x 時代...........................................................................................................621

A.7

Delphi 11 のリリース.................................................................................................622

用語集 .............................................................623

索 引 ............................................................................633

第 I 部 : 基礎

第I部
基礎

Object Pascal は、美しいプログラム構造を持ち、拡張可能なデータ型など中核的な基礎機能に支えられた大変強力なプログラミング言語です。これらの基礎部分の一部は、伝統的な Pascal 言語から来ていますが、中核の言語機能であっても、早い段階から多くの拡張が加えられています。
この第 I 部では、言語構文、コーディングスタイル、プログラムの構造、変数やデー
タ型の使用法、基本的な文（条件やループなど）、手続き、関数の使用法、そして、配列、レコード、文字列など中心的な型コンストラクタについて学習します。
これらは、本書の第 II 部と第 III 部で説明するクラスやジェネリック型などの高度な機能の基礎となります。言語の学習は家を建てるようなもので、しっかりとした土台と基礎から始める必要があります。そうしないと、その上の構造は美しいかもしれません
が、不安定になってしまいます。
第 I 部のサマリー
第1章

Pascal でのコーディング

第2章

変数とデータ型

第3章

言語の文

第4章

手続きと関数第5章

配列とレコード

第6章

文字列のすべて第1章

Pascal でのコーディング

第1章
Pascal でのコーディング
この章では、コードと関連するコメントを記述する標準的な方法の説明、そしてキーワードやプ
ログラムの構造の概説など、Object Pascal アプリケーションの基本的な要素から始めます。簡単
なアプリケーションを作成してその動作を説明し、以降の章で詳細を説明する、その他の主な概念について概説します。

1.1 コードから始めよう
この章では、言語の基礎について説明します。アプリケーションの動作全体の詳細を説明するには、複数の章が必要になってしまいます。そのため、ここでは（構造が異なる）2 つの単純なプログラムを取り上げますが、詳細の説明には立ち入りません。プログラムの各種要素を説明する前に、サンプルを作成するのに使用するプログラム構造を紹介し、特定の言語構文要素について紹介します。本書の情報をできるだけ早く実践できるようにするには、このサンプルを初めから確認するのが良いでしょう。
Object Pascal は、その統合開発環境（IDE）と緊密に連携するよう設計されています。Object
Pascal がマシンフレンドリな言語の実行スピードを発揮しながら、プログラマフレンドリな言語の容易さと開発スピードを同時に実現できるのは、この強力な組み合わせによるものです。
IDE では、ユーザーインターフェイスの設計、コードの記述、プログラムの実行など、さまざまな作業を行えます。本書の Object Pascal 言語の説明では、この IDE を使用します。

4●第 1 章Pascal でのコーディング

最初のコンソールアプリケーション
まず初めに、単純な「Hello, World」コンソールアプリケーションのコードを示し、Pascal プロ
グラムの構造上の要素を示しましょう。コンソールアプリケーションは、グラフィカルユーザーイ
ンターフェイスを持たないプログラムで、テキストを表示してキーボード入力を受け付ける、通常
オペレーティングシステムコンソールまたはコマンドプロンプトから実行されるアプリケーションです。一般にコンソールアプリケーションはモバイルプラットフォームではほとんど意味をなしま

せんが、Windows（Microsoft は最近、cmd.exe の改善や PowerShell、ターミナルアクセスなどにも注力しています）でもまだ使われており、Linux では主流です。

次のコードの各要素について説明することは、最初の数章にわたる目的なので、ここではまだ触れずにおきます。以下が、HelloConsole サンプルのコードです。
program HelloConsole;{$APPTYPE CONSOLE}
StrMessage: string;

var
begin

StrMessage := 'Hello, World' ;Writeln(StrMessage);// Enterキーが押されるまで待機
Readln;end.
メモ「はじめに」で説明したように、本書で取り上げる全サンプルの完全なソースコードは
GitHub リポジトリにあります。サンプルの入手方法の詳細は、「はじめに」を参照してください。本文ではプロジェクト名で呼びます（この例では HelloConsole）が、これはサンプ

ルの各種ファイルを含むフォルダの名前でもあります。プロジェクトフォルダは章ごとに分かれているため、この 1 つ目のサンプルは 01/HelloConsole にあります。

1 行目には、program という宣言の後ろにプログラム名、2 行目以降にコンパイラ指令（$ 記号で始まり、中かっこで囲まれています）、変数宣言（string という型名と名称）が続き、メインのbegin-end ブロック内に 3 行のコードとコメントがあります。3 行のコードでは値を文字列にコピーし、システム関数を呼び出してそのテキスト行をコンソールに出力し、別のシステム関数を呼び出してユーザー入力行を読み取ります（この例ではユーザーが Enter キーを押すまで待ちます）。後
述するように Object Pascal では独自の関数を定義することもできますが、あらかじめ定義された

1.1

コードから始めよう●

数多くの関数が用意されています。
繰り返しになりますが、この最初のセクションの目的は、小さくても完全な Pascal プログラムがどのようなものかを示すことであるため、これらの全要素についての説明は後にまわします。
もちろん、このアプリケーションは、開いて実行することができます。出力は次のとおりです（Windows 版の実例を図 1.1 に示します）。
Hello, World

図 1.1
Windows で実行したサンプ
ル HelloConsole の出力

最初のビジュアルアプリケーション
最近のアプリケーションは、以前のコンソールプログラムとは異なり、通常、ウィンドウ（フォームと呼ばれます）に表示されるビジュアル要素（コントロールと呼ばれます）で構成されます。本書ではほとんどの場合（単純なテキストを表示することになる場合がほとんどですが）、FireMonkey（FMX）プラットフォームライブラリを使用してビジュアルサンプルを作成します。
メモ

Delphi のビジュアルコントロールには、VCL（Windows 用ビジュアルコンポーネントライブラリ）と FireMonkey（サポートされているすべてのプラットフォーム、デスクトップおよびモバイル用のマルチデバイスライブラリ）の 2 つの「種類」があります。このデモをWindows 固有の VCL ライブラリに適応させることは難しくありません。

ビジュアルアプリケーションの正確な構造について理解するには、本書の該当部分を参照しなけ
ればなりません。フォームは、特定のクラスのオブジェクトで、メソッド、イベントハンドラ、プロパティを持ち、いずれの機能の理解にも相応の時間がかかります。しかし、これらのアプリケー
ションを作成するには、エキスパートである必要はありません。新しいデスクトップアプリケー
ションまたはモバイルアプリケーションを作成するには、メニューコマンドを使用するだけです。
本書ではまず、FireMonkey プラットフォームを使用して、フォームとボタン、そしてそのクリッ
ク操作を扱います。はじめに、任意の種類のフォーム（デスクトップでもモバイルでもどちらでも、私は通常、マルチデバイスアプリケーションで「空のアプリケーション」を選択します）を作成し、出力を表示する複数行のテキストコントロール（Memo）とボタンコントロール（Button）を配置

5

6●第 1 章Pascal でのコーディング

します。
図 1.2 に、モバイルアプリケーションの場合のフォームが Delphi IDE でどのように表示されるかを示します。Android スタイルプレビューを選択（設計画面の上部のコンボボックスをご覧ください）して、ボタンコントロールを配置した状態です。

図 1.2
HelloVisual デモで使用されている、ボタンを1 つ持つ単純なモバイルアプリケーション

同様のアプリケーションを作成するには、空のフォームにボタンを追加します。ここで実際にコードを追加する（それがここでのポイントです）には、ボタンをダブルクリックします。次のコー
ドスケルトン（または同様のもの）が表示されます。
procedure TForm1.Button1Click(Sender: Tobject)
begin
end;

クラスのメソッド（Button1Click）を知らなくても、コードフラグメント内（begin キーワードと end キーワードの間）に入力すれば、ボタンを押したときにそのコードが実行されます。

最初の「ビジュアル」プログラムのコードは、1 つ目のコンソールアプリケーションのコードと同様の処理ですが、コンテキストと呼び出すライブラリ関数（ShowMessage）が異なります。
HelloVisual サンプルのコードは次のとおりです。最初から再作成しても簡単です。

1.1

コードから始めよう●procedure TForm1.Button1Click(Sender: TObject)var

StrMessage: string;

begin

StrMessage := 'Hello, World' ;ShowMessage(StrMessage);end;

begin 文とその後の実際のコードの前に StrMessage 変数の宣言を配置する必要があることに注意してください。繰り返しになりますが、詳細は後で説明するため、不明な点があっても心配しな
いでください。
メモ

このサンプルのソースコードは、この章の 01 コンテナ下のフォルダにあります。ただし、
この場合、このサンプルと似た名前のプロジェクトファイルがありますが、プロジェクト名の後ろに "Form" が付いたセカンダリユニットファイルもあります。それが、本書での標準です。プロジェクトの構造は、この章の最後に説明します。

図 1.3 に、FMX モバイルプレビューモードを有効し Windows で実行した、この単純なプログラ
ムの出力を示します（このデモは Android、iOS および macOS でも実行できますが、IDE に追加の設定が必要です）。
メモ

FireMonkey モバイルプレビューを使用すれば、Windows アプリケーションをモバイルアプ
リのように見せることができます。本書のほとんどのサンプルで、このモードを有効にしています。これは、プロジェクトのソースコードの uses 節に MobilePreview ユニットを追加することで可能です。

Delphi プログラムの記述方法とテストのやり方がわかったので、この章の最初に述べたとおり、初めに戻ってアプリケーションの基本的な要素のいくつかを詳細に説明していきましょう。まず理解する必要があるのは、プログラムの「読み方」、各種要素の記述方法、そして作成したアプリケー
ションの構造（PAS ファイルと DPR ファイルによって構成）です。

7

8●第 1 章Pascal でのコーディング

図 1.3
HelloVisual デモで使用されている、ボタンを1 つ持つ単純なモバイルアプリケーション

1.2 構文とコーディングスタイル
実際の Object Pascal 言語の文の記述について説明する前に、Object Pascal コーディングスタイ
ルのいくつかの要素について見ていくことも重要です。ここで考えたいのは、（まだ説明していない）構文ルール以外のコードの記述方法です。個人の好みによってスタイルは異なるため、この質問に対する唯一の正解はありません。ただし、コメント、大文字、スペース、そして以前に「プリティプリント（コンピュータではなく人間にとってのプリティ）」と呼ばれていた現在では時代遅れの用語など、知っておくべき原則がいくつかあります。
一般的に、コーディングスタイルのゴールは明確さです。スタイルやフォーマットを決めるのは、特定のコードブロックがどのような目的であるかを表す略記のルールです。明確さに不可欠な要素は一貫性で、どのようなスタイルを選択しようとも、プロジェクト全体、そしてプロジェクト間でも、一貫性を保つ必要があります。

1.2

ヒント

構文とコーディングスタイル●

IDE（統合開発環境）では、（ユニットレベルまたはプロジェクトレベルの）自動コードフォー
マットがサポートされます。エディタで Ctrl + D キーを使用して、ルールのセットに従ってコードを再フォーマットできます。ルールのセットは、約 40 個の各種フォーマット要素（IDE の［オプション］にあります）を調整して変更でき、これらの設定をチームの他の開発者と共有してフォーマットの一貫性を保つこともできます。ただし、自動コードフォーマッ
トは、いくつかの最新言語機能はサポートしていません。

コメント
コードを見ればわかるというケースもありますが、プログラムのソースコードに多くのコメントを追加し、なぜ、コードがこのように記述されているのか、その理由や想定を他者に（あるいは、
将来コードを参照したときの自分自身にも）わかるようにすることは、適切な配慮です。
伝統的な Pascal では、コメントは、中かっこ、または丸かっことアスタリスクのペアによって囲まれていました。最近では、ダブルスラッシュの C/C++ スタイルの 1 行のコメントも使用できます。この場合、コメントは行の終わりまでで、コメントの終わりを示す記号は必要ありません。
// このコメントは1行の終わりで終了します{ これは複数行のコメントです}(* これも別の形式の複数行コメントです *)1 つ目のコメント形式が最も一般的に使用されていますが、Pascal で独自に定義されたものではありませんでした。これは、C/C++ からの借用ですが、C#、Objective-C、Java、JavaScript 同様、複数行のコメント用に /* comment */ も使用されます。

2 つ目の形式のほうが、3 つ目の形式よりもよく使用されています。ヨーロッパでは、キーボー

ドに中かっこ記号がなかったため（あるいは、複数のキーの組み合わせとなり、面倒なため）、これが使用されていました。いいかえれば、この古い形式はちょっと時代遅れです。
行の終わりまでのコメントは、短いコメントの場合と 1 行のコードをコメントアウトする場合に有用です。このコメント形式は、Object Pascal 言語で最もよく使用されています。
ヒント

IDE エディタで、現在の行（または選択した行のグループ）を直接キーストロークでコメントにしたり、コメント解除できます。これは、US キーボードでは Ctrl + / の組み合わせです
が、他のキーボードレイアウトでは異なります（物理的に / キーがどこにあるかに依存します）。実際のキーの組み合わせは、エディタのポップアップメニューに示されます。

9

10●第 1 章Pascal でのコーディング

3 つの異なるコメントの形式があることは、コメントをネストさせる場合に有用です。ソース
コードの複数行をコメントアウトして無効にしたいときに、これらの行の中にコメントが含まれている場合、同じコメント識別子を使用することはできません。
{}

コード ...
{ネストしたコメントが問題を引き起こす}
コード ...

上記のコードは、最初に記述された右中かっこでコメントセクション全体の終了が示されるため、コンパイルエラーになってしまいます。3 つ目のコメント識別子を使用すれば、コードを次のように正しく記述できます。
{}

コード ...
// このコメントはOK
コード ...

あるいは、前述のように複数行を // でコメントアウトし、2 行目の // コメントが {} で囲まれたコメント行に追加した状態であれば、（元のコメントを保持しつつ）同じブロックを簡単にコメント解除できます。
メモ

1 つ目のサンプルの {$APPTYPE CONSOLE} の行のように、左中かっこまたは丸かっことアス

タリスクの後にドル記号（$）が続く場合は、コメントではなく、コンパイラ指令になります。

コンパイラ指令はコンパイラへの特別な指示で、この章の後半で簡単に説明します。

実際、コンパイラ指令はコメントでもあります。たとえば、{$X+ This is a comment} は有効です。これは、有効な指令でもありコメントでもあります。ただし、ほとんどの「良識的な」プログラマは指令とコメントを分ける傾向にあります。

コメントと XML ドキュメント
Object Pascal には、他のプログラミング言語でも共通している、特殊なコメントが用意されています。これは、コンパイラによって特定の方法で処理されます。この特殊なコメントからはドキュメントが生成され、IDE のヘルプインサイトで直接利用されるほか、コンパイラによって生成される XML ファイルで使用されます。

1.2

メモ

構文とコーディングスタイル●

Delphi IDE では、ヘルプインサイトが自動的にシンボルに関する情報（型や定義された場所など）を表示します。XML ドキュメントコメントを用いれば、ソースコード内に記述する特定の詳細情報で、この情報を補足することができます。

XML ドキュメント は、/// コメントまたは {! コメントで有効になります。これらのコメント内

では、一般的なテキストまたは（より適切な）特定の XML タグを用いて、コメントしているシン
ボルについて、さらにはそのパラメータや戻り値などに関する情報を記述することができます。これは、自由形式テキストを用いた極めて単純な例です。
public/// This is a custom method, of course
procedure CustomMethod;

XML ドキュメントの生成を有効にしていると、この情報はコンパイラによって生成される XML 出
力に追加されます。以下がその例です。
<procedure name="CustomMethod" visibility="public"><devnotes>

This is a custom method, of course</devnotes></procedure>

同じ情報は、IDE でシンボルの上にマウスを置くと表示されます。図 1.4 がその例です。

図 1.4
Delphi IDE のヘルプインサイトが ///コメントによって記述された XML ド
キュメント情報を表示

11

12

●第 1 章Pascal でのコーディング

ガイドラインに従ってこのコメントに summary セクションを記述しておくと、ヘルプインサイト

ウィンドウにもこの情報が表示されます。
public/// <summary>This is a custom method, of course</summary>procedure CustomMethod;

この機能のメリットは、パラメータ、戻り値、より詳細な情報の記述に用いることのできる多くの XML タグが用意されていることです。利用可能なタグの一覧は、以下に掲載されています。
https://docwiki.embarcadero.com/RADStudio/ja/XML_ドキュメント_コメント

シンボル識別子プログラムは、さまざまな要素（データ型、変数、関数、オブジェクト、クラスなど）の名前を示すためのさまざまなシンボルによって構成されています。プログラムでは、任意の識別子を使用できますが、いくつかの従うべきルールがあります。
●

識別子にスペースを含めることはできません（スペースによって識別子と他の言語要素とを区別するため）●

識別子には、全 Unicode 文字を含む文字および数字を使用できます。必要であれば、自国の言語でシンボルの名前を付けることができます（いくつかの文字は推奨されません。IDE のい
くつかの箇所で、同じサポートが提供されているわけではないからです）。

●

従来の ASCII 記号のうち識別子に使用できるのはアンダースコア記号（_）のみです。文字お

よび数字以外の ASCII 記号は使用できません。識別子に使用できない記号には、算術記号（+、-、*、/、=）、すべてのかっこ、句読点、特殊文字（@、#、$、%、^、&、\、| など）などがあります。使用できるのは、☼ ♪や∞などの Unicode 記号です。
●

識別子は文字またはアンダースコアで始まる必要があります。数字で始まることはできません（数字は使用できますが、先頭に使用することはできません）。ここでいう数字とは ASCII 数字（0 から 9）のことで、Unicode 表現の数字なら使用することができます。
次に、IdentifiersTest サンプルにリストされている典型的な識別子の例を示します。
MyValue
Value1

1.2

構文とコーディングスタイル●

My_Value_ValueVal123_123

次に、有効な Unicode 識別子の例を示します（最後のは、やや極端な例です）。
Cantù (アクセント記号付きの文字)结 (簡体中国語)
画像 (日本語)☼ (Unicodeの記号)

次に、「無効な」識別子の例をいくつか示します。
123

1ValueMy Value
My-Value
My%Value

ヒント

実行時に識別子が有効かどうかをチェックする場合（他の開発者のためにツールを作成する

場合以外あまり必要になることはありませんが）、IsValidIdent というランタイムライブラ
リの関数を使用できます。

大文字・小文字の区別無視と大文字の使用
C の構文に基づく言語（C++、Java、C#、JavaScript など）をはじめとする他の多くの言語とは異なり、Object Pascal コンパイラでは識別子の大文字／小文字の区別は無視されます。したがって、
識別子 Myname、MyName、myname、myName そして MYNAME はすべてまったく同じです。大文字／小文

字を区別する言語では、大文字／小文字の間違いによって構文エラーやささいなミスが起こることがあるため、大文字／小文字を区別しないことは、個人的には良い機能だと考えます。

ただし、識別子に Unicode を使用できることを考えると、同じ文字の大文字は同じ要素として扱
われ、アクセント記号付きは別のシンボルとして扱われるため、状況は多少複雑になります。つまり、次のようになります。
cantu: Integer;

Cantu: Integer; // エラー: 識別子が重複cantù: Integer; // 正しい: 異なる識別子と認識される

13

14

●第 1 章注意

Pascal でのコーディング

大文字／小文字の区別には例外が 1 つのみあります。C++ の互換性の問題から、コンポーネ
ントパッケージの Register 手続きは大文字の R で始まる必要があります。もちろん、他の言語によってエクスポートされた識別子（ネイティブオペレーティングシステム関数など）を参照する場合、大文字／小文字を適切に使用する必要がある場合があります。

ただし、ささいなデメリットがいくつかあります。まず、これらの識別子が同一であることを認識する必要があることです。異なる要素として使用しないようにしなければなりません。次に、コードの読みやすさを向上させるために、大文字の使用について一貫性を保つ必要があることです。
大文字／小文字の使用について一貫性を保つことはコンパイラによって実現されることではありません。習慣付けです。一般的な方法は、各識別子の最初の文字のみを大文字にすることです。識別子が複数の連続する語で構成される場合（識別子にスペースを含めることはできません）、各語の最初の文字を大文字にすることをお勧めします。
MyLongIdentifier

MyVeryLongAndAlmostStupidIdentifier

これは、いわゆるキャメル記法との対比で、しばしば「Pascal 記法」と呼ばれます。Java やその他の言語のキャメル記法は C の構文に基づいており、次のように内部の語を大文字で始め、先頭の文字は小文字にします。
myLongIdentifier

実際、ローカル変数にキャメル記法（先頭が小文字）が使用され、クラス要素、パラメータやその他のよりグローバルな要素に Pascal 記法が使用された Object Pascal コードがより一般的になりつつあります。いずれにしても、本書のソースコード例では、すべてのシンボルに一貫して Pascal
記法を使用します。

空白
コンパイラによって完全に無視されるその他の要素は、ソースコードに追加されたスペース、改行、タブです。これらのすべての要素はまとめて「空白」と呼ばれます。空白はコードの読みやすさを向上させるためにのみ使用されます。コンパイルには一切影響しません。
従来の BASIC とは異なり、Object Pascal では長い命令を複数行に分け、複数行にわたる文を記述することができます。複数行にわたる文を使用できることのデメリットは、文の終わりを示すために（より正確にいうと、文を次の文と区別するために）セミコロンを追加する必要があることで