在显示保存对话框时,我想自动 Hook 用户的过滤器类型更改并更改文件扩展名。 (例如,像 MSPaint 的“另存为”操作。)
使用 TSaveDialog 并设置 UseLatestCommonDialogs := False, 我可以通过下面的代码来处理这个问题。 (当然,没有最新的通用对话框支持。)
procedure TForm1.SaveDialog1TypeChange(Sender: TObject);
var
FName, Ext: string;
begin
with TSaveDialog(Sender) do
begin
if DirectoryExists(FileName) then // FileName is Empty
exit;
case FilterIndex of
1: Ext := '.png';
2: Ext := '.bmp';
3: Ext := '.jpg';
end;
FName := ChangeFileExt(ExtractFileName(FileName), Ext);
SendMessage(Windows.GetParent(Handle), CDM_SETCONTROLTEXT, 1152, LongInt(PChar(FName)));
end;
end;
我想用 Delphi 2007 支持 XP 和 vista/7。
我应该使用 TFileSaveDialog 而不是带有内部包装器的 TSaveDialog 吗? (而且我必须使用 IFileDialogControlEvents 来进行 COM 编程?)
或者我可以使用 TFileSaveDialog 来实现这一点吗?它只是标准属性? (我的开发环境还是XP机器,所以没有尝试过。抱歉。)
我认为这是非常常见的任务,但我找不到任何支持 Vista/7 的示例代码...
最佳答案
据我所知,TFileSaveDialog 在 XP 上会引发异常。它需要 Vista 或更高版本。
更新:TFileSaveDialog的一些D2010代码改编自您的事件处理程序....
(我在 Vista 上没有 D2007;使用 PWideChar 而不是 PChar)
procedure TForm1.FileSaveDialog1TypeChange(Sender: TObject);
var
FName, Ext: string;
pName: PChar;
begin
with TFileSaveDialog(Sender) do
begin
if DirectoryExists(FileName) then // FileName is Empty
exit;
case FileTypeIndex of
1: Ext := '.png';
2: Ext := '.bmp';
3: Ext := '.jpg';
end;
Dialog.GetFileName(pName);
FName := ChangeFileExt(ExtractFileName(pName), Ext);
Dialog.SetFileName(PChar(FName));
end;
end;
FileSaveDialog 的位置:
object FileSaveDialog1: TFileSaveDialog
FavoriteLinks = <>
FileTypes = <
item
DisplayName = 'png files'
FileMask = '*.png'
end
item
DisplayName = 'bmp files'
FileMask = '*.bmp'
end
item
DisplayName = 'jpg files'
FileMask = '*.jpg'
end>
Options = []
OnTypeChange = FileSaveDialog1TypeChange
end
关于delphi - (保存对话框) 如何在 Vista/Win7 中更改文件过滤器时自动更改文件扩展名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2145299/