Comments
Description
Transcript
第 1 章 Delphiについて
第 1 章 Delphi について 1.1. Delphi とは 「Delphi」は Borland 社が開発した、ネイティブコードコンパイラ、ビジュアル開発、モバイル開発、データ ベース処理のすべてを統合した、非常に生産性の高い、Windows 向けの統合開発環境である。現在は名前を縮め て「Delphi」と呼ばれているが、開発会社の変更に伴って Borland Delphi → CodeGear Delphi → Embarcadero Delphi という風に名前が少しずつ変化している。Delphi は教育言語である Pascal を大幅に拡張し、オブジェク ト指向開発を可能とした Delphi 言語を用いる。Delphi はその言語にワンパスでコンパイルできる文法を使用して おり、プログラムのコンパイルの速度は、他のソフトウェア開発製品に比べ群を抜いて速いのが利点である。ま た Delphi 特有のフレームワークによってユーザーインターフェースが迅速に設計でき、オブジェクト指向開発も 可能にしている。Delphi は Windows アプリケーションを作るのに便利な、様々な機能を装備している。つまり、 Delphi は業務用の巨大プログラムの開発に対応することを想定しているプログラミング言語である。 1.2. Delphi の歴史 Delphi のプログラム言語は Object Pascal というが、この元となったのが Pascal 言語である。Pascal はもとも と教育用プログラム言語として開発された。その歴史はかなり古く、C 言語も Pascal から派生したと言われてい る。Pascal はC言語や FORTRAN、BASIC、Java などと並ぶ汎用的なプログラミング言語の1つである。歴史 的にいえば、アルゴリズムの記述を重視した言語である Algol から派生し、「構造化」を実装して普及させた言語 である。Algol から派生した経緯を考えれば、C言語とも同根であり、Cと Pascal の間の書換えは比較的に容易 である。Pascal は、コードが直感的に把握しやすく、その厳密な形式性のために誤ったコードを書きにくいので 教育・研究用として優れている。以下に Pascal のプログラムの構造を書く。 program プログラム名; 宣言部 実行部 また簡単な例としては整数の変数 x に5を読み込み、3倍にして表示するだけのプログラムを以下に書く。 program sample; var x : integer; begin x := 5; writeln(’x=’, x); x := x * 3; writeln(’x*3=’,x:3); readln; end. 元来の Pascal はこうしたプログラムのコードをエディタで書き、プログラムをコンパイルして実行するのであっ た。最初の行はプログラムのヘッダである。2 行目の var は変数 x を宣言する宣言部である。そして実行部は begin と end に挟まれた 5 行である。Pascal ではこの実行部のステートメントを上から下に順次実行してゆく。しかし、 Delphi は Turbo Pascal のような単純な Pascal コンパイラではない。この単純な Pascal のコンパイラから拡張し てオブジェクト指向の概念を導入したものが Object Pascal である。Object Pascal は,型チェックの厳密なコン パイラ型の高水準言語であり,構造化されたオブジェクト指向設計をサポートする。コードが読みやすい,高速 なコンパイル,複数のユニットファイルの使用によるモジュラープログラミングが可能であるなどの利点がある。 最初の Delphi(製品名:Delphi for Windows、コードネーム:Delphi)は、16 ビット Windows である Windows 3.1 向けに開発され、1995 年 9 月に発売された。。 「オブジェクト指向」をその土台に据えつつ、その存在を忘れて しまうほどの高速なコンパイラを備え、「コンポーネント」と呼ばれる設計部材による視覚的(ビジュアル)開発 手法を採用する Delphi の基本的な性格は、この時既に定まっており、この画期的な製品はソフトウェア開発者ら 1 から大きな注目を浴びた。最初の Delphi の開発環境は 16 ビットであったが、これ以降に開発されたバージョン での開発環境は 32 ビットとなっている。今回使用したのは Delphi6 であるが、Delphi6 は日本でも Personal 版が 無償で提供され、多くの著名なフリーウェアが Delphi で作成されたバージョンである。 1.3. Delphi の基本特性 この節では Delphi がどのような特性を持っているかを簡単に説明する。なお、ここに述べる Delphi の特性は Windows 用の言語であればほぼ共通に有するものであり、Delphi に固有という訳ではない。 1.3.1. 統合開発環境 Delphi のようなグラフィカルなプログラミング環境を統合開発環境(IDE)と呼ぶ。統合開発環境のキーワー ドは2つである。第1は Rad(Rapid Application Development)、つまりアプリケーション開発の簡便性である。 例えばボタンやメモを自前でプログラムしようとすると面倒なことになる。統合開発環境はコンポーネントを貼 り付けるなどの単純な操作で、この面倒な作業を代替しているのである。第2はデザイナ画面の作業とコード画 面の作業の連携である。デザイナ画面で作業すればそれに対応するソースコードがある程度自動生成、自動変更 される。つまりプログラマは、プログラムのソースコードのすべてを自分で書く必要はない。逆にソースコード の指定によってグラフィカルなフォームの形態を操作することもできる。 1.3.2. プロジェクトファイルとユニットファイル Delphi のプログラムは複数のファイルで構成されている。それぞれが異なった拡張子を持つ。ファイルが何個 になるかはプログラムの条件や Delphi のバージョンによって異なるが、Delphi 6 では10個前後のファイルで1 つのプログラムが成り立っている。ファイルの数が多いのは、異なった種類の設定を別々のファイルに書き込ん でいるからである。しかしファイルの多くは統合環境の中で自動生成されるため、プログラマが注意を向ける必 要があるのはプロジェクトファイル(.dpr)とユニットファイル (.pas) の2つであり、プログラマが自分でソース コードを書くのは通常はユニットファイルだけである。 1.3.3. 操作性 “ フォーム ”に“ コンポーネント ”という部品を貼り付けるだけで、基本的な Window は作成できてしまう。ま た、その部品に付与される様々な属性も、 “ プロパティ ”という値を設定するだけで行える。同様の操作で部品に “ イベント ”や“ メソッド ”を割り当てることができ、VC++などの開発で必要となる「Windows Message」や 「Win32 API」などの知識を基本的に必要としないという点で操作性に優れているといえる。 1.3.4. コンパイラ Delphi に実装されているコンパイラでは、様々なコンパイラ指令を利用することが可能で、範囲チェック、オー バーフローチェックなど、実行時に予想される様々なエラーをコンパイルの時点ではじいてくれる。また、変数や 定数の型にも非常に厳格で、文字列と数値の違いはコンパイルエラーとなるのは当然、数値であっても、そのサ イズに違いがあると、それもコンパイルエラーとしてはじかれる。これは、一見すると非常にコーディングが難 しくなるように思われるが、逆に、Delphi でコンパイルが通れば、ある程度の動作は保証されるといっても良い のである。また、Delphi のコンパイル速度は驚異的であり、コンパイルエラーが発生すると、そのキーワードへ カーソルがジャンプして強調表示してくれる。 1.3.5. イベント Delphi では、各コンポーネントに対して、様々なイベントが用意されており、プログラマは適当な「イベント」 を選択するだけで良いようになっている。その中でも代表的なものは「ボタン」コンポーネントに対する「クリッ ク」イベントである。Delphi ではこの「ボタンクリック」イベントを典型的なイベントと捉え、ボタンをクリッ クした時に何らかの処理を行うプログラムを作成する。 2 第 2 章 Delphi の動作 2.1. 起動時の画面 Delphi を起動したときに表示される画面について説明する。以下の図 1 は Delphi の起動時の図である。 図 1: Delphi 起動時の図 ・スピードバー 画面上部にあるウィンドウの左半分をスピードバーという。これは「プロジェクトを開く」「実行」「保存」な どの Delphi のアプリケーションの開発を行う際によく使用するコマンドをボタンにしたものである。 ・コンポーネントパレット スピードバーとは逆のウィンドウの右半分をコンポーネントパレットという。この部分は Delphi でアプリケー ションを作成する際に重要なボタン、エディタ、コンボボックスなどのコンポーネントを種類別にまとめたもので ある。 ・オブジェクトツリー スピードバーの真下にある、初めは Form1 が入力されている部分をオブジェクトツリーという。ここにはフォー ムに表示されているコンポーネントの親子関係が表示される。他のコンポーネントを内部に配置することができ るコンテナコンポーネントがある場合は、どのコンテナコンポーネントにどのコンポーネントが配置されている かがひと目で分かるようになっている。 ・フォームエディタ コンポーネントパレットの下にある、細かくドットの打たれたウィンドウをフォームエディタという。フォーム エディタは Delphi でアプリを作成する際に要となる非常に重要なウィンドウである。このウィンドウの上にコン ポーネントを配置することで、フォームをデザインすることができる。ここでデザインしたフォームは、実行時 3 の姿になるので、コンパイルする前に簡単に実行時の外見を確認することができる。 ・コードエディタ フォームエディタと同じくコンポーネントパレットの下にあり、コードを記述する部分をコードエディタとい う。ここでアプリケーションの動作を決定するすべてのソースコードを表示、編集することができる。フォームエ ディタとコードエディタは F12 キーにより切り替えることができる。 ・オブジェクトインスペクタ オブジェクトツリーの真下にあり、コンポーネントの外見や動作に関する設定を変更することができるウィンド ウをオブジェクトインスペクタという。F11 キーでこのウィンドウにフォーカスを移すことができる。 2.2. コンポーネント ここでは Delphi を使う上で欠かせないコンポーネントの説明をしていく。 2.2.1. コンポーネントの配置方法 Delphi による Windows アプリケーション開発はコンポーネントをフォームに配置することが基礎となってい る。初めに「Memo コンポーネント」を配置してみる。 コンポーネントを配置するためには、まずコンポーネントパレットにある、配置したいコンポーネントをクリッ クする。ここで図 2 の左から 5 番目の「Memo コンポーネント」をクリックする。 図 2: コンポーネントパレット 次にフォーム上でクリックする。すると下の図 3 のようにクリックした位置に Memo コンポーネントが配置さ れる。このときコードエディタには自動的に Memo コンポーネントに関するコードを書いている。 図 3: Memo コンポーネントを配置した時の図 4 コンポーネントを移動したいときはコンポーネントをドラッグすることで移動でき、コンポーネントのサイズ を変更したいときはコンポーネントとフォームエディタの境界にある 8 個の黒い四角形をドラッグすることでサ イズを変更することができる。 2.2.2. コンパイル方法 では先ほど配置したコンポーネントを実際にコンパイルしてみる。コンパイルするためには実行メニューの「実 行」を選択するか、実行アイコン [ ] をクリックするとコンパイルが始まり、エラーなく無事に完了すると自 動的にアプリケーションが起動される。 すると先ほど配置したコンポーネントがフォームにそのままの形で現れ、Memo コンポーネントにカーソルが 行き、文章を打ち込むことができるアプリケーションが作成できていることがわかる。下の図 4 はそのアプリケー ションに例文を打ち込んだものである。 図 4: 文章を打ち込むアプリケーション 2.2.3. コンポーネントの種類 Delphi でアプリケーションを作る際に欠かせないのがコンポーネントの配置である。ここでは主に使用するコ ンポーネントをいくつか抜き出して説明していく。次の図 5 は主によく使用する Standard コンポーネントパレッ トであり、図 6 は Dialog コンポーネントパレットである。 図 5: Standard コンポーネント 5 図 6: Dialog コンポーネント ・TLabel TLabel を使うことによって、ユーザーが編集できないテキストをフォームに追加することができる。表示した いテキストは Caption プロパティで設定することができる。設定された文字列の応じて自身のサイズを変更する のもこのコンポーネントの特長である。 ・TEdit TEdit を使用することによって、ユーザーからの一行の文字列の入力が可能である。このコンポーネントを使 用することによってユーザーに一行の入力エリアを提供することができる。ユーザーが入力した文字は、Text プ ロパティを介して得ることができる。 ・TMemo TMemo オブジェクトを使用することによって、複数行の入力エリアをフォーム上に配置できる。この複数行の 入力エリアは長い文字列の入力に適している。入力した文字列は Lines プロパティでアクセスすることができる。 ・TButton TButton を使うことによって、標準の押しボタンをフォームに配置することができる。TButton はダイアログ ボックス設定でのボタンの動作を制御する複数のプロパティを導入する。ユーザーはボタンコントロールを選択 することでアクションを開始することができる。 ・TCheeckBox TCheckBox コンポーネントはユーザーオプションを提供する。ユーザーはチェックボックスにチェックマーク をつけてオプションを選択したり、チェックマークをはずしてオプションの選択を解除することができる。 ・TRadioButton TRadioButton を使うと、ラジオボタンをフォームに追加できる。ラジオボタンを使うことによっていくつあ る機能のうち1つを選択することができる。ユーザーがいずれかのラジオボタンを選択すると、前に選択していた ラジオボタンは選択解除される。つまり TRadioButton をいくつか配置すると、もうその時点でどれか 1 つだけ しか選択できないようになっている。チェックされているかどうかはそれぞれの Checked プロパティで調べるこ とができる。試しにオブジェクトインスペクタで Checked プロパティを True にしてみると、他の TRadioButton は False になり、どれか1つしか選択できないようになっているのがわかる。 ・TListBox TListBox コンポーネントを使うと、ユーザーが選択、追加、削除できる項目のスクロール可能なリストを表 示できる。特化したリストボックスを表示するためには TCustomListBox のほかの下位クラスを使うか、または TCustomListBox から継承する。 ・TPanel TPanel コンポーネントを使うと、空のパネルをフォームに配置することができる。それによって枠のデザイン を細かく設定することができる。TPanel コンポーネントはコントロールの周囲のベベルのスタイルを提供するメ ソッドを持っているコンポーネントである。 6 ・TOpenDialog、TSaveDialog TOpenDialog はファイルを開くときに使い、開くファイルを指定することができる。また、TSaveDialog はファ イルを保存するときに使い、保存するファイルを選択することができる。しかし、これらのコンポーネントは、た だフォームに設定しただけではアイコンが配置されるだけで動作はしない。ダイアログは実行時にユーザーによっ て表示するものなので、フォームに最初から表示されていては困るからである。たとえば TOpenDialog コンポー ネントを配置すると図 7 のようになる。 図 7: TOpenDialog コンポーネントを配置した時の図 実行時には TOpenDialog コンポーネントが見えなくなってしまうので、実行時の画面に映っているのは Button 1のみとなる。ここで TOpenDialog コンポーネントと TButton を関連づけるために、以下のようにコードを打 ち込む。 procedure TForm1.Button1Click(Sender: TObject); begin Opendialog1.Execute; end; これは Button1 をクリックしたときに Execute メソッドを返すコードになっているので、Button1 をクリック すると TOpenDialog により、ファイルを開くためのメニューが表示される。TOpenDialog や TSaveDialog を使 う場合は上のコードを応用させるなどして使用するのが良い。 以上のコンポーネントやダイヤログを並べると図 8 のようになる。 7 図 8: コンポーネントを配置した時の図 2.3. プロパティ プロパティとはオブジェクトインスペクタに表示されている情報のことであり、プロパティはコンポーネントご とに保持されている値で、そのコンポーネントの外観や動作を決定するものである。オブジェクトインスペクタ は、フォーム上でクリックして選択されたコンポーネントのプロパティを表示している。下の図 9 はオブジェク トインスペクタ内のプロパティの図である。 図 9: オブジェクトインスペクタ内のプロパティ 次に主によく使用するプロパティについて説明していく。 8 ・Name プロパティの中で一番重要なのは Name プロパティである。プログラム中でコンポーネントを参照するときは、 この Name プロパティに設定された名前を使う。 フォームに Memo コンポーネントを配置して、オブジェクト インスペクタで Name プロパティを調べてみると、この Memo コンポーネントに「Memo1」という名前が付く。 この名前は Delphi がコンポーネント配置時に自動的につけた名前である。またその一方で、フォームに配置され た Memo コンポーネントの中にも「Memo1」という文字が表示されている。これはすでに Memo コンポーネン トの中に入力されている文字で、Lines プロパティに保持されている。これもまた Delphi が自動的に設定したも のである。このように、配置時に目で見てすぐに Name プロパティの名前が分かるようになっている。 しかし、 エディタを起動した時に Memo1 などと表示されていてはおかしいので、この文字は消しておいたほうが良い。こ の文字の編集の仕方についてはオブジェクトインスペクタで「(TStrings)」と書かれている部分をダブルクリッ クする。すると下の図 10 のような画面が出てきて、Lines プロパティの内容を編集することができる。 図 10: Lines プロパティの編集 そして Memo1 の文字を消して、OK ボタンを押すと、Memo コンポーネントから Memo1 の文字が消える。こ のようにプロパティを変更すると即座にコンポーネントの状態が変化することに着目すると、プロパティはコン ポーネントの変数のようなものだと認識されがちだが、そうではない。なぜなら変数は代入、読み出ししかでき ないのに対し、プロパティは代入、読み出しの際に、何らかの動作を行わなければならない。例えば Lines プロパ ティを変更したとき、すぐに Memo コンポーネントの表示を変えるために内部でコードを実行している。つまり、 何らかの関数に値を渡しているのと同じことである。読み出しのときも同じであり、あるコードを実行した結果 として値を返す。 ・Anchors 親コントロールのサイズが変更されても、コントロールとその親コントロールの端に対する現在の相対的な位 置が保持されているかどうかを設定することができる。親オブジェクトのサイズが変更されたとき、コントロー 9 ルはアンカー設定されている辺に対する相対的な位置を保持する。コントロールが親オブジェクトの反対側の辺 に対してアンカー設定されている場合、親オブジェクトのサイズが変更されるとコントロールの幅が拡張される。 例えば、コントロールの Anchors プロパティが [akLeft,akRight] に設定されている場合は、親オブジェクトの幅 が変更されると、コントロールの幅も拡張される。Anchors プロパティは、親コントロールのサイズが変更したと きのみ実行する。たとえば、設計時にフォームの反対側の端にコントロールをアンカー設定し、最大化した状態 でフォームを作成した場合、コントロール作成後にフォームのサイズは変更されないので、コントロールの幅は 拡張されない。 ・Caption ここではコントロールのラベルとして表示される文字列を指定することができる。テキストを表示するコント ロールはテキストの値を指定するのに Caption プロパティ、または Text プロパティを使う。どちらのプロパティ を使うかは、コントロールの種類によって異なる。一般的には Caption はウィンドウはウィンドウタイトルまた はラベルとして表示されるテキストで使い、Text はコントロールの内容として表示されるテキストで使う。 ・Enabled ユーザーがコントロールを使えるかどうかを変更できる。コントロールを無効にするには、Enabled プロパティ を False に設定する。応答しないように設定したコントロールは淡色表示される。Enabled が False であれば、コ ントロールはマウス、キーボード、タイマーイベントを無視する。 ・Height コントロールの高さを取得したり、変更することができる。 ・Left コントロールの左端がどの位置から始まるかを判定したり、コントロールの左端の位置を変更したりすることが できる。コントロールが他のコントロール内にあるとき、Left プロパティと Top プロパティはその親コントロー ルに対する相対座標になる。コントロールがフォームに直接保持されている場合はフォームに対する相対座標に なる。フォームの場合、Left プロパティは画面での相対座標をピクセル数で表す。 ・Stretch True を設定すると、イメージをイメージコントロールのサイズと同じ形状とみなすことができる。イメージコ ントロールをサイズ変更すると、イメージもサイズ変更される。Stretch プロパティを使うとイメージの高さと幅 を独立して変更する。したがって、イメージコントロールとイメージの形が異なる場合、単にイメージを拡大さ せるのではなく、イメージを歪めることができる。 ・Visible 実行時にコントロールを表示するかどうかを制御できる。Visible が True ならばコントロールは表示され、False ならばコントロールは表示されない。 ・Width コントロールの幅を取得したり、変更することができる。 2.4. イベント 「イベント」とは日本語に訳すと「出来事」である。アプリケーションにとっての出来事とは、ボタンをクリッ クしたりするという風な「ユーザーの操作」が大半である。これからこのイベントを Button コンポーネントを例 として取り上げて説明していく。 10 ・イベントハンドラの作成 まず、Button コンポーネントをフォームに配置する。配置した Button1 をクリックすると、オブジェクトイン スペクタには Button1 に関する情報が表示される。ここで、 「イベント」タブをクリックする。そして、 「OnClick」 と書かれた部分の右側の空欄をダブルクリックする。すると、Button1Click という手続き(procedure)が自動的 に記述され、コードエディタが前面に表れる。 この手続きは、Button1 がクリックされたという出来事、すなわち「イベント」が発生したときに呼び出され る。つまり、プログラマはここに Button1 がクリックされたときに実行すべきコードを書いておく。この手続き を「イベントハンドラ」という。 ここで試しに、このイベントハンドラに Memo コンポーネントの背景の色を変えるコードを書いてみる。背景 の色は Color プロパティで設定するので以下のようなコードを書いて、Memo1 の Color プロパティに clBlue(青) を設定するようにする。 Memo1.Color := clBlue; この時のイベントハンドラへの記述は図 11 のようになる。 図 11: イベントハンドラへの記述 このように、コンポーネントのプロパティを参照する場合、参照したいコンポーネントの Name プロパティに 設定されている名前を書き、その後にピリオドで区切ってプロパティ名を書く。このコードを実行して、Button1 をクリックすると、Memo1 の背景色が図 12 のように青になる。 11 図 12: 背景色を変化させた時の図 ・よく使うイベントハンドラの作り方 ここで先ほど実行していたプログラムをいったん終了し、フォームデザイナの Button1 コンポーネントをダブ ルクリックしてみる。すると、先ほどのイベントハンドラが現れる。これは、Button コンポーネントの場合はダ ブルクリックをすると、OnClick イベントハンドラを生成する仕組みになっているからである。 先ほどはイベントハンドラの生成の仕方を説明するためにオブジェクトインスペクタを使ったが、通常はこの とうにコンポーネントをダブルクリックするのが簡単である。このように、コンポーネントをダブルクリックす ることで最もよく使用すると思われるイベントが生成されるようになっている。また、Menu コンポーネントのよ うに、コンポーネントのプロパティ設定ウィンドウがでてくる場合もある。 ちょっとしたコードを実行してみたいときは、このように Button コンポーネントを配置してダブルクリックし、 生成されたイベントハンドラの中にコードを書く方法が簡単であるので覚えておくと良い。 ・イベントハンドラの消去 一度生成したイベントハンドラを消去するには、手作業でそのイベントハンドラに関するコードをすべて削除 するのも1つの方法であるが、それは面倒でかつエラーを起こす原因になるので、普通はイベントハンドラの中 のコードをすべて削除し、空にするという方法を使う。それは Delphi は、中身が空のイベントハンドラをコンパ イルする際に自動的に消去する仕組みを持っているからである。 試しにボタンを配置しダブルクリックをしてイベントハンドラを生成し、そのまま何も書かずに実行ボタンを 押してみると生成されたはずのイベントハンドラが自動的に消去されているのが分かる。次の図 13 は実行ボタン を押す前のイベントハンドラであり、図 14 は実行ボタンを押した後のイベントハンドラである。 12 図 13: 実行ボタンを押す前の図 図 14: 実行ボタンを押した後の図 13 2.5. メソッド 「メソッド」とは C++の用語で簡単にいってしまうと、クラスのメンバ関数のことである。コンポーネントや オブジェクトはクラスに相当する。つまり、そのコンポーネントやオブジェクトが行うことができる動作がメソッ ドである。 プロパティもオブジェクトである場合があるので、メソッドを持つことができる。また、同じようにプロパティ の中にプロパティを持つこともできる。例えば、Memo コンポーネントの内容をテキストファイルに保存すると き、以下のようなコードを書く。 Memo1.Lines.SavetoFile(’C:\Memo1.txt’); これをボタンの OnClick イベントハンドラに書くと、そのボタンを押すことで Memo1 の内容をテキストファ イルとして保存することができる。 ・ファイル選択のウィンドウの表示 いつも決まったファイル名でしか保存できないのは、エディタとはいえない。Windows アプリケーションの多 くは以下の図 15 のようなダイアログを表示して、保存するファイル名をユーザーが決められるようになっている。 図 15: 保存のダイアログ これを Delphi で表示させるためには、コンポーネントパレットの Dialog タブの中にある、SaveDialog コンポー ネントをフォームに配置する必要がある。しかし、これを配置するだけではただアイコンが配置されるだけであ る。なぜならダイアログはフォームの一部として表示するものではないからである。このアイコンは実行ボタン を押すと消えて見えなくなってしまう。このようなフォームに表示されないコンポーネントを「非ビジュアルコン ポーネント」という。そこで、Execute メソッドを用いて次の一行を実行すると SaveDialog(ファイル保存のダ イアログ)を表示させることができる。 SaveDialog1.Execute; 14 ・ユーザーが選んだファイル名を取得する SaveDialog コンポーネントの Execute メソッドは、保存の処理を行わず、ユーザがファイル名を指定する操作 を受け付ける機能しか持っていない。ユーザによって指定されたファイル名は、フルパスで Filename プロパティ に設定される。また、Execute メソッドはユーザが「保存」ボタンをクリックしたときは True を返し、「キャン セル」のボタンを押したときには False を返す。 つまり、ファイルの保存処理は以下のようなコードを適当なボ タンの OnClick イベントハンドラに書くことで実現できる。 if SaveDialog1.Execute then Memo1.Lines.SaveToFile(SaveDialog1.Filename); ファイルの読み込みも同様に、LoadFromFile メソッドと OpenDialog コンポーネントを使用する。このときも 保存のときと同じ方法で読み込むことができる。また、SaveDialog、OpenDialog コンポーネントの初期状態では、 ダイヤログに表示されるべき「ファイルの種類」が設定されていない。これは以下図 16 のように Filter プロパティ で設定すると良い。 図 16: Filter プロパティ 15