« ■コードエディタが・・・。 | トップページ | ■ナッキーのDelphiはじめて奮戦記 »

☆ファイルを扱うときのテンプレート?

ファイルを開いたり、保存したりという処理の中で、ファイルの内容が変更されている場合は、その処理をユーザーに選択させますよね。 今回、その一連の流れをまとめてみました。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ActnList;

type
  TForm1 = class(TForm)
    ActionList1: TActionList;
    acNew: TAction;
    acSaveAs: TAction;
    acOpen: TAction;
    acSave: TAction;
    procedure FormCreate(Sender: TObject);
    procedure acNewExecute(Sender: TObject);
    procedure acOpenExecute(Sender: TObject);
    procedure acSaveAsExecute(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure acSaveExecute(Sender: TObject);
  private
    FN: String;        // 作業中のファイル名
    Modified: Boolean; // データが更新されたときにTrueに設定する。
    function ConfirmingDialog : Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// 現在作業中のファイルをどうするのかをユーザーに示して処理させます。
function TForm1.ConfirmingDialog : Boolean;
var
  I: Integer;
begin
  Result := True;
  if not Modified then Exit;

  Result := False;

  // 現在のデータが変更されている場合の確認
  I := MessageDlg(Format('%sは変更されています。保存しますか?', [FN]),
          mtConfirmation, [mbYes, mbNo, mbCancel], 0);

  case I of
    id_Yes: begin
              acSaveExecute(Self);
              if Modified then Exit; // 保存されなかった場合
            end;
    id_Cancel: Exit;
    id_No: ;  // id_Noは保存しないという選択なので処理不要です。
  end;
  Modified := False;
  Result := True;
end;



// 初期設定
procedure TForm1.FormCreate(Sender: TObject);
begin
  FN := '';
  Modified := False;
end;



// 新規作成
procedure TForm1.acNewExecute(Sender: TObject);
begin
  if not ConfirmingDialog then Exit;
  FN := '';
  { 処理 }
end;



// 開く
procedure TForm1.acOpenExecute(Sender: TObject);
begin
  if not ConfirmingDialog then Exit;
  FN := '開いたファイル名';
  { 処理 }
end;



// 名前を付けて保存
procedure TForm1.acSaveAsExecute(Sender: TObject);
begin
  if not ConfirmingDialog then Exit;
  FN := '名前を付けたファイル名';
  { 処理 }
end;



// 保存
procedure TForm1.acSaveExecute(Sender: TObject);
begin
  if FN = '' then
  begin
    acSaveAsExecute(Self);
    Exit;
  end;

  { 処理 }
  Modified := False;
end;



// 終了してもよいかどうか
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := ConfirmingDialog;
end;

end.



確認ダイアログが表示されるかどうか確かめるために、次の処理をします。
procedure TForm1.Button1Click(Sender: TObject);
begin
  Modified := True;
  Close;
end;


よく見るこんなダイアログです。

Save

デフォルトのファイル名が空白のため、ファイル名部分が表示されていませんが、 実際のアプリケーションでは「Untitled」や「無題」を設定しています。

|

« ■コードエディタが・・・。 | トップページ | ■ナッキーのDelphiはじめて奮戦記 »