QUOTE(无尽天空 @ 2007年 03月 01日 00时 57分) [snapback]324377[/snapback]
Inno 有 GetOpenFileName 打开文件,但是却找不到哪个函数是创建保存文件对话框,请各位大虾指教。
INNO 本身没有提供相应的函数。tracky 说了要调用 API 来说实现。不过直接调用它还不是那么方便,所以我在编写 Easy UHARC 时为了方便调用,自己写了一个函数 GetMySaveFileName(),它的用法和 INNO 现有的 GetOpenFileName() 一样。供你参考:
QUOTE( getsavefilename.iss @ 2007年3月1日 8:25:38 )
[Code]
const
OFN_OVERWRITEPROMPT = $2;
type
TOpenFileName = record
lStructSize: Longint;
hwndOwner: Longint;
hInstance: Longint;
lpstrFilter: PChar;
lpstrCustomFilter: PChar;
nMaxCustFilter: Longint;
nFilterIndex: Longint;
lpstrFile: PChar;
nMaxFile: Longint;
lpstrFileTitle: PChar;
nMaxFileTitle: Longint;
lpstrInitialDir: PChar;
lpstrTitle: PChar;
Flags: Longint;
nFileOffset: Word;
nFileExtension: Word;
lpstrDefExt: PChar;
lCustData: Longint;
lpfnHook: Longint;
lpTemplateName: PChar;
end;
function GetSaveFileName(var lpofn: TOpenFileName): boolean;
external 'GetSaveFileNameA@comdlg32.dll';
function GetMySaveFileName(sTitle: string; var SaveFN: string; sStartDir, sFilter, sDefExt: string): boolean;
var
F: TOpenFileName;
S, Title, StartDir, Filter, DefExt: string;
z: Char;
iVal: boolean;
begin
S := ' ';
SetLength(S, 512);
Title := sTitle;
StartDir := sStartDir;
Filter := sFilter;
DefExt := sDefExt;
z := Chr(0);
F.hwndOwner := StrToInt(ExpandConstant('{wizardhwnd}'));
F.lStructSize := 76;
F.Flags := OFN_OVERWRITEPROMPT;
F.lpstrTitle := PChar(Title);
if StartDir <> '' then
F.lpstrInitialDir := PChar(StartDir);
if Filter <> '' then
begin
StringChangeEx(Filter, '|', z, True);
Filter := Filter + z + z;
F.lpstrFilter := PChar(Filter);
end;
F.nFilterIndex := 1;
if DefExt <> '' then
F.lpstrDefExt := PChar(DefExt);
F.lpstrFile := PChar(S);
F.nMaxFile := Length(S);
iVal := GetSaveFileName(F);
if iVal then
SaveFN := F.lpstrFile
else
SaveFN := '';
Result := iVal;
end;
procedure InitializeWizard();
var
yourfilename: string;
begin
if GetMySaveFileName('选择目标文件', yourfilename, ExpandConstant('{userdocs}'), '可执行程序文件 (*.exe)|*.exe|所有文件 (*.*)|*.*', 'exe') then
MsgBox('你将保存文件: ' + yourfilename, mbInformation, MB_OK);
end;
注意:如果你使用的不是最新的 INNO 版本,请将
StringChangeEx(Filter, '|', z, True);
改成
StringChange(Filter, '|', z);