メモ帳などのエディタでは、一般的にテキストファイルを開く場合には、モード付きの Windows ダイアログボックスが表示されます。
また、新しく作成されたテキストを保存する場合や、[ 名前を付けて保存 ] 等を選択した場合にも同様に Windows ダイアログボックスが表示されます。
このダイアログボックスの表示を Delphi で実現するにはTOpenDialog, TSaveDialog コンポーネントを使用します。(TOpenDialog, TSaveDialog は、コンポーネントパレットの System ページにあります)。
ここでは、TMemo コンポーネントといっしょに、これらのコンポーネントを用いて簡単なエディタを作成してみます。
フォームに上図のように、それぞれコンポーネントを貼り付けます。
出来ましたら、Button1 を押すと開きたいファイルを選択するWindows ダイアログボックスを表示します。
procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName); end;
上記のように TOpenDialog コンポーネントを利用することで、簡単にダイアログを表示させる事が出来ますが、Execute メソッドがどのように動作するかを理解しなければ、上記のコードの意図が分からないかもしれません。
TOpenDialog の Execute メソッドが呼び出されると、モーダル付きのファイル選択用のダイアログボックスが表示されます。
もし、ユーザーがそのダイアログの中でファイルを選択し、[ 開く ] をクリックした場合には、この Execute メソッドは True を返します。ユーザーが [ キャンセル ] を押したとき、及び×ボタンを押した場合には、Execute メソッドは False を返すようになっています。
そう考えると、なぜ if 文を使用しているのか、つまり以下のようなコードになっているのかが理解できます。
if OpenDialog1.Execute then ..........
結局、ユーザーがファイルを開くことを確定した場合(ファイルを選択して、[ 開く ] を押した場合)にのみ、if 文での評価が True となることが分かります。
Execute メソッドが True を返した場合、次に行うことはTMemo へのファイルの読み込みです。TOpenDialog の Execute メソッド呼び出しで表示されるダイアログの役割は、単なる「ファイルの選択」です。ですから選択されたファイルを実際に Memo へ読み込む作業を行う必要があるわけです。
ファイルを読み込む場合には、TMemo の LoadFromFile メソッドを使用すれば簡単に実現できます。その際に、TOpenDialog の FileName プロパティを使用します。
この FileName プロパティには、Windows ダイアログボックスで選択されたファイルの名前とディレクトリパスが格納されています。ですから、TMemo の LoadFromFile メソッドに、この FileName プロパティを渡すことで、無事ファイルを開くことができるということになります。
ファイル名と、ディレクトリパスの確認の為に、それらをタイトルバーに表示させて見ましょう。コードは以下のようになります。
procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then begin Memo1.Lines.LoadFromFile(OpenDialog1.FileName); Caption := OpenDialog1.FileName end; end;
C:\\MySample にある sample.txt ファイルを読み込んだ例です。
ファイルを保存する方法は、TOpenDialog でファイルを開いた時と全く同じ考え方を利用できます。
まず、ファイルを保存するディレクトリ及びファイル名の決定の為に TSaveDialog コンポーネントを利用します。
procedure TForm1.Button2Click(Sender: TObject); begin if SaveDialog1.Execute then Memo1.Lines.SaveToFile(SaveDialog1.FileName); end;
保存するディレクトリ、ファイル名の決定に TSaveDialog を使用し、実際にファイルを保存するのに SaveToFile メソッドを使用しています。 TOpenDialog の使い方が理解できれば、自然に TSaveDialog も理解できるはずです。
オブジェクトインスペクタで TOpenDialog, TSaveDialog のプロパティを見ると、様々な設定が出来る事がわかります。それらを簡単に見ていきましょう。