| object(o) | property(p) | value | 意味 | 
|---|---|---|---|
| Form1 | Caption | メモ帳 | タイトル | 
| Memo1 | ScrollBars | ssBoth | Pを垂直,水平方向に設定 | 
| WantTabs | True | Oでタブを入力できる | |
| Lines | 空白 | 文字列リストエディタで1行目にあるMemo1を消す | 
Memo1.Left := 0; Momo1.Top := 0; Memo1.Width := ClientWidth; Memo1.Height := ClientHeight;このコードをForm1のOnCreateではなくOnResizeイベントとして定義する。 「Form1」→「Object inspector」→「Event」page→「OnResize」→値「FormResize」の順に選択すると,OnResizeイベントハンドラのコードがDelphiエディタに生成される。 このイベントはForm1のサイズが変更されると呼び出されるので,メモ帳の実行中にフォームのサイズが変更されても,Memoコンポーネントのサイズは常にフォームのサイズに合わせて変更する。
procedure TForm1.FormResize(Sender: TObject);
begin
      Memo1.Left := 0 ;
      Momo1.Top := 0 ;
      Memo1.Width := ClientWidth ;
      Memo1.Height := ClientHeight ;
end;
ここまでの段階で「メモ帳」を実行してみる。メモ帳の画面に文字やタブをキーボード入力できるであろう。 Memoコンポーネントはスクリーンエディタの機能を持つので,文字テキストをマウスでカット&コピーなどの編集することさえもできる。
次に,Memoコンポーネントで編集されたテキストを3.5FDなどにファイルとして保存したり,ファイルから読み出して再び編集できるように簡易版メモ帳を拡張する。完成時にはファイルの印刷もできるようにしたい。
そのためのユーザ・インターフェースを用意するツールとして,ここではメインメニュー・コンポーネント(Standard pageにある。p.229)を利用する。
| Caption | Name | 意味 | 
|---|---|---|
| ファイル(&F) | 設定しない | ファイルメニューを開く | 
| 新規作成(&N) | FileNew1 | |
| 開く(&O) | FileOpen1 | 既存のファイルを開く | 
| 上書き保存(&S) | FileSave1 | 編集中のファイル名で保存 | 
| 名前を付けて保存(&A) | FileSaveAs1 | 編集中のファイルを別のファイル名で保存 | 
| - | 設定しない | 区切(ハイフン"-"を入れる) | 
| 印刷(&P) | FilePrint1 | 開いたファイルを印刷 | 
| - | 設定しない | 区切(ハイフン"-"を入れる) | 
| 終了(&X) | Exit1 | メモ帳を終了 | 
| ヘルプ(&H) | 設定しない | ヘルプメニューを開く | 
| トピックスの検索(&H) | 設定しない | ヘルプ | 
| - | 設定しない | 区切(ハイフン"-"を入れる) | 
| バージョン情報(&A) | 設定しない | メモ帳の情報 | 
ここまで進んだら「メモ帳」を実行してみる。メインメニューが表示され,〔ファイル(F)〕メニューを選択するとサブメニューが開き,各項目をマウスやキーで選択できるだろう。 しかし,まだイベントが定義されていないので,メニュー項目を選択しても何も実行されない。
次の段階では,メニュー項目の選択に対応するプログラムコードを書き,両者を関連付ける。そのためには,これまでボタンコンポーネントにイベントハンドラを定義したように,メニュー項目にOnClickイベントハンドラを定義すればよい。
最初の例として,〔ファイル(F)〕→〔終了(X)〕の順にメニュー項目を選択することに対する、イベントハンドラのコードを記述する手順を説明する。
procedure TForm1.Exit1Click(Sender: TObject);
begin
     Close ;
end;
次のステップとしては,「簡易版メモ帳」で編集したテキストファイルを保存したり,再編集するためにファイルをメモ帳に読み込んでファイルを開く機能,つまりファイルの入力・出力機能を追加する作業に進む。
ファイルの入力・出力を扱うには,component palletのDialogsページにあるWindows common ダイアログボックスの中から次のコンポーネントを利用する。
| object(o) | property(p) | value | 意味 | 
|---|---|---|---|
| Open | Name | OpenDialog1 | 既定値(default)を使う | 
| FileName | 新しいメモ1 | ファイル名の既定値として表示 | |
| DefaultExt | txt | ファイル名の拡張子の既定値 | |
| Filter | *.txt;*.*;など | フィルタの設定を参照のこと | |
| Save | Name | SaveDialog1 | 既定値を使う | 
| DefaultExt | txt | ファイル名の拡張子の既定値 | |
| Filter | *.txt;*.*;など | 次のフィルタの設定を参照のこと | 
| フィルタ名 | フィルタ | 注 | 
|---|---|---|
| テキストファイル(*.txt) | *.txt | Filterの指定には半角英文字を入力する、以下同じ | 
| データファイル(*.dat) | *.dat | |
| Delphiファイル(*.dpr, *.pas) | *.dpr; *.pas | 区切はセミコロン";" | 
| すべてのファイル(*.*) | *.* | 
Open / Save ダイアログボックスの機能を実行時に利用するには,そのExcuteメソッドを次のように呼び出せばよい。
関数Executeの値は"True"か"False"の論理値をとり,ダイアログボックスでファイル名が入力されたときは"True"となり,キャンセルされたときは"False"となる。 したがって,実際にファイルの入力・出力処理を行なうのは"True"の場合だけであるから,必要な処理を記述するコードは次のようになる。
ファイルを〔開く(O)〕メニューが選択されたとき,Openダイアログボックスを開き(呼び出し),ファイル名の欄に入力されたファイル名を取得し,それをフォーム1のタイトルバーに表示する。さらに簡易版メモ帳にそのファイルを読み込んで表示する。
procedure TForm1.FileOpen1Click(Sender: TObject);
begin
     if OpenDialog1.Execute then   //ファイル名が入力されたなら
     begin
        Caption := OpenDialog1.Filename ;    //ファイル名を取得し,タイトルバーに表示
        Memo1.Lines.LoadFromFile(Caption) ;  //ファイルの読み込み
     end;
end;
 
そもそも「簡易版メモ帳」を起動したとき,最初はまだメニューが選択されていない状態である。Table 1でMemoコンポーネントのプロパティを空白の編集画面を表示するように設定した。したがって,この状態ではForm1のCaptionに設定した"メモ帳"が新しいファイル名として表示される。
この"メモ帳”という用語をForm1のタイトルバーの先頭に常に表示し,開いたファイル名 MyFilename をその横に表示するようにしたい。そして,まだ何も編集が行なわれていない空白の画面の状態のときは,新しいファイル名(既定値)として「新しいメモ1」を表示させたいとする。
この3つの文字列はプログラムの別々のprocedureで参照されるであろう。そこでこれらをプログラムのimplementation部に共用データとして定義しておく。
implementation
{$R *.DFM}
const
     NewFilename = '新しいメモ1' ; // 新規ファイルのファイル名
     MyCaption = 'メモ帳: ' ;      // タイトルバーに付けるアプリケーション名
var
     MyFilename: String ;          // 編集中のファイル名
 
procedure TForm1.FormCreate(Sender: TObject);
begin
     Caption := MyCaption + NewFilename ;
     MyFilename := NewFilename ;
end;
メモ・コンポーネントにファイルを読み込むにはLoadFromFileメソッドを使う。引数には、読む込む(ロードする)ファイル名またはそれが記録されているファイル変数名を指定する。例えば、
procedure TForm1.FileOpen1Click(Sender: TObject);
begin
     if OpenDialog1.Execute then     //ファイル名が入力されたなら
     begin
        MyFilename := OpenDialog1.Filename;    //ファイル名の取得
        Caption := MyCaption + MyFilename;     //タイトルバーに表示
        Memo1.Lines.LoadFromFile(MyFilename);  //ファイルの読み込み
     end;
end;
ここまでの段階で、もし存在しないファイル名を「開く」と指定したらどうなるだろうか? Openダイアログボックスは,ほぼ自動的にファイルをロードし、かつ開けない場合にも簡単なエラー処理をすることも組込まれている。 エラー処理については後の「例外処理」の節で説明する。
xpage:[Next]