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: