C-4 TStringList

ここまで作ってきた名簿検索プログラムでは、生データ (右上のメモ) や検索過程 (右下のメモ) が利用者に丸見えでした。これらは、フォーム上の面積を有効に使うため、また利用者がデータに勝手に手を加えたり出来ないようにするために、画面上から消してしまうべきです。Visible プロパティを False にすることによって画面上から消してしまっても良いのですが、もっと根本的な解決法として、(これら作業用メモコンポーネントを) より単純な変数へと格下げしてしまいましょう。

【練習問題】

メモコンポーネントは、TStringList 型の変数で代用することが出来ます。フォームから MemoRawData を削除し、代わりに次の1行を付け加えてください。

type
  TForm1 = class(TForm)
    ButtonNew: TButton;
    EditSearch: TEdit;
    ButtonSearch: TButton;
    ButtonOpen: TButton;
    ButtonSave: TButton;
    EditAdd: TEdit;
    ButtonAdd: TButton;
    EditOrgName: TEdit;
    Label1: TLabel;
    MemoMemberList: TMemo;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure ButtonOpenClick(Sender: TObject);
    procedure ButtonSaveClick(Sender: TObject);
    procedure ButtonNewClick(Sender: TObject);
    procedure ButtonAddClick(Sender: TObject);
    procedure ButtonSearchClick(Sender: TObject);
  private
    { Private 宣言 }
    RawData: TStringList; // 右上のメモの代わり
  public
    { Public 宣言 }
  end;

そして、プログラム中の MemoRawData.Lines という記述を全て RawData へと置換してください。例えば、「開く」ボタンのイベントハンドラは次のようになります。

// 「開く」ボタン
procedure TForm1.ButtonOpenClick(Sender: TObject);
begin
  if (OpenDialog1.Execute = true)
    then
      begin
        RawData.LoadFromFile(OpenDialog1.FileName); // ファイル読み込み
      end
  ;
end;

また、メモコンポーネントを TStringList 型の変数に置き換えた場合、フォームをクラスに退化させた時のように Create メソッドが必要です。「新規」ボタンのイベントハンドラに次のように書き加えて下さい。

// 「新規」ボタン
procedure TForm1.ButtonNewClick(Sender: TObject);
begin
  // 生データを保持する入れ物を作る
  RawData := TStringList.Create;
  RawData.Clear;
  RawData.Add('団体名:' + EditOrgName.Text); // 団体名を設定
end;

同様に、「検索」ボタンのイベントハンドラに次のように書き加えて下さい。

// 「検索」ボタン
procedure TForm1.ButtonSearchClick(Sender: TObject);
var
  MemberList: TStringList; // 右下のメモの代わり
  temp: String; // 1行取り出し用変数
  i: Integer; // for 文用カウンタ
begin
  MemberList := TStringList.Create;
  // 行頭が「メンバー:」である行を抽出、結果は複数行出てくる
  〔後略〕

全ての置換が終わったら、プログラムを実行して、今まで通りに動作することを確認しましょう。

【基礎課題 C-6】

MemoRawData と同様に MemoMemberListMemberList という変数へ置き換えてください。

【練習問題】

変数 MemberList は「検索」ボタンのイベントハンドラにしか登場しません。そのため、グローバル変数ではなく、「検索」ボタンのイベントハンドラのローカル変数にすることが出来ます。また、ローカル変数で済むものは可能な限りローカル変数にする、という原則から言って、その方が望ましいのです。

type
  TForm1 = class(TForm)
    ButtonNew: TButton;
    EditSearch: TEdit;
    ButtonSearch: TButton;
    ButtonOpen: TButton;
    ButtonSave: TButton;
    EditAdd: TEdit;
    ButtonAdd: TButton;
    EditOrgName: TEdit;
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure ButtonOpenClick(Sender: TObject);
    procedure ButtonSaveClick(Sender: TObject);
    procedure ButtonNewClick(Sender: TObject);
    procedure ButtonAddClick(Sender: TObject);
    procedure ButtonSearchClick(Sender: TObject);
  private
    { Private 宣言 }
    RawData: TStringList; // 右上のメモの代わり
    MemberList: TStringList; // 右下のメモの代わり
  public
    { Public 宣言 }
  end;

の行を削除し、代わりに「検索」ボタンのイベントハンドラの冒頭部に

// 「検索」ボタン
procedure TForm1.ButtonSearchClick(Sender: TObject);
var
  MemberList: TStringList; // 右下のメモの代わり
  temp: String; // 1行取り出し用変数
  i: Integer; // for 文用カウンタ
begin

と付け加えてください。

ここまでのプログラムをダウンロード(D)