ホーム >プログラム >Delphi 6 ローテクTips

Unicode対応のTSaveDialog

Unicode対応のTSaveDialog。

ソースコード

gfnbSaveFileDialogのコンポーネント化です。

{ TMySaveFileDialog }
type
  TMySaveFileDialog = class(TMyOpenFileDialog)
  public
    function Execute: Boolean; override;
  end;

TMyOpenFileDialogから派生させます。
Executeメソッドだけをオーバーライドします。

function TMySaveFileDialog.Execute: Boolean;
var
  lr_Info: TOpenFilenameW;
begin
  FillChar(lr_Info, SizeOf(lr_Info), 0);  //0で初期化
  with lr_Info do begin
    lStructSize := SizeOf(lr_Info);
    if (F_Owner = nil) then begin
      hwndOwner := Application.Handle;
    end else begin
      hwndOwner := F_Owner.Handle;
    end;
    hInstance  := SysInit.HInstance; //カスタムダイアログで必要。
    lpstrTitle := PWideChar(F_sTitle);
    if (Filter <> '') then begin
      lpstrFilter := PWideChar(WideString(StringReplace(Filter, '|', #0, [rfReplaceAll])));
    end;
    nFilterIndex := FilterIndex;
    if (F_sDefaultExt <> '') then begin
      lpstrDefExt  := PWideChar(F_sDefaultExt);
    end else begin
      lpstrDefExt := nil;
    end;
    if (F_sInitialDir <> '') and (gfnbFolderExists(F_sInitialDir)) then begin
      lpstrInitialDir := PWideChar(F_sInitialDir);
    end else begin
      lpstrInitialDir := nil;
    end;

    if (ofReadOnly            in Options) then Flags := Flags or OFN_READONLY;
    if (ofOverwritePrompt     in Options) then Flags := Flags or OFN_OVERWRITEPROMPT;
    if (ofHideReadOnly        in Options) then Flags := Flags or OFN_HIDEREADONLY;
    if (ofNoChangeDir         in Options) then Flags := Flags or OFN_NOCHANGEDIR;
    if (ofShowHelp            in Options) then Flags := Flags or OFN_SHOWHELP;
    if (ofNoValidate          in Options) then Flags := Flags or OFN_NOVALIDATE;
//複数選択は無効
//    if (ofAllowMultiSelect    in Options) then Flags := Flags or OFN_ALLOWMULTISELECT;
    if (ofExtensionDifferent  in Options) then Flags := Flags or OFN_EXTENSIONDIFFERENT;
    if (ofPathMustExist       in Options) then Flags := Flags or OFN_PATHMUSTEXIST;
    if (ofFileMustExist       in Options) then Flags := Flags or OFN_FILEMUSTEXIST;
    if (ofCreatePrompt        in Options) then Flags := Flags or OFN_CREATEPROMPT;
    if (ofShareAware          in Options) then Flags := Flags or OFN_SHAREAWARE;
    if (ofNoReadOnlyReturn    in Options) then Flags := Flags or OFN_NOREADONLYRETURN;
    if (ofNoTestFileCreate    in Options) then Flags := Flags or OFN_NOTESTFILECREATE;
//古いタイプは無効
//    if (ofNoNetworkButton     in Options) then Flags := Flags or OFN_NONETWORKBUTTON;
//    if (ofNoLongNames         in Options) then Flags := Flags or OFN_NOLONGNAMES;
//    if (ofOldStyleDialog      in Options) then Flags := Flags or OFN_EXPLORER;
    if (ofNoDereferenceLinks  in Options) then Flags := Flags or OFN_NODEREFERENCELINKS;
    if (ofEnableIncludeNotify in Options) then Flags := Flags or OFN_ENABLEINCLUDENOTIFY;
    if (ofEnableSizing        in Options) then Flags := Flags or OFN_ENABLESIZING;
    if (ofDontAddToRecent     in Options) then Flags := Flags or OFN_DONTADDTORECENT;
    if (ofForceShowHidden     in Options) then Flags := Flags or OFN_FORCESHOWHIDDEN;
    //エクスプローラ風は必須(古いタイプのとでは区切りが違うので)
    Flags := Flags or OFN_EXPLORER;

    //メッセージフックのため
    Flags     := Flags or OFN_ENABLEHOOK;
    lpfnHook  := l_fniCallbackFileDialog;
    lCustData := LPARAM(Self); //自身のアドレスを代入

    if (ofExNoPlacesBar in OptionsEx) then FlagsEx := FlagsEx or OFN_EX_NOPLACESBAR;

    //カスタムダイアログ。
    if (Template <> nil) then begin
      Flags := Flags or OFN_ENABLETEMPLATE;
      lpTemplateName := PWideChar(WideString(AnsiString(Template)));
    end;

    nMaxFile  := 1024;  //ファイルは一つだけ
    lpstrFile := AllocMem((nMaxFile +2) * 2);
    try
      //ファイル名を表示
      lstrcpyw(lpstrFile, PWideChar(gfnsFileNameGet(F_sFileName)));

      Result := GetSaveFileNameW(lr_Info);
      if (Result) then begin
        F_slFiles.Clear;
        F_sFileName := WideString(lpstrFile);
        F_slFiles.Add(F_sFileName);
      end;
    finally
      FreeMem(lpstrFile);
    end;
  end;
end;

myFileDialog.pas

使い方はTSaveDialogと大体同じです。

関数版

{ OpenFileDialog }
function gfnbOpenFileDialog(slFiles: TMyWStrings; sDir: WideString; Opt: TOpenOptions): Boolean; overload;
var
  ldlg_OpenFile: TMyOpenFileDialog;
begin
  ldlg_OpenFile := TMyOpenFileDialog.Create(nil);
  with ldlg_OpenFile do begin
    try
      if (slFiles.Count > 0) then FileName := slFiles[0];
      InitialDir := sDir;
      Options    := Opt;
      Result     := Execute;
      if (Result) then begin
        slFiles.Assign(Files);
      end;
    finally
      Free;
    end;
  end;
end;
{SaveFileDialog}
function gfnbSaveFileDialog(var sFile: WideString; sDir: WideString; Opt: TOpenOptions): Boolean;
var
  ldlg_SaveFile: TMySaveFileDialog;
begin
  ldlg_SaveFile := TMySaveFileDialog.Create(nil);
  with ldlg_SaveFile do begin
    try
      //複数選択は不可
      if (ofAllowMultiSelect in Opt) then Exclude(Opt, ofAllowMultiSelect);
      FileName   := sFile;
      Options    := Opt;
      InitialDir := sDir;
      Result     := Execute;
      sFile      := FileName;
    finally
      Free;
    end;
  end;
end;

2009-07-31:カスタムダイアログ作成のために手直し。OnCloseやOnShowなどのイベントが発生するように修正。
2008-12-28:TMyOpenFileDialogとTMySaveFileDialogの両方lr_Info.lpstrFileまわりを簡素化。
2008-11-15:TMySaveFileDialogで
・ファイル名の後ろに余計なゴミがついてしまっていた不具合を修正
・FileNameプロパティにセットした文字列がダイアログのファイル名欄に表示されない不具合を修正。
2008-08-09: 前回選択したファイルをクリアしていなかった不具合を修正。
2008-07-24: