delphi - (保存对话框) 如何在 Vista/Win7 中更改文件过滤器时自动更改文件扩展名?

标签 delphi windows-7 windows-vista savefiledialog save-as

在显示保存对话框时,我想自动 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/

相关文章:

Delphi FMX编辑控件不一致——如何制作快速录入表单?

excel - 将应用程序数据导出到 Excel 对某些用户有效,但对其他用户无效

winapi - 为什么 CreateProcessAsUser 需要 Vista/Windows 7 上的交互式窗口站?

windows - Git 从 index.lock 重命名为索引失败

c# - 更改打印机默认纸张尺寸

delphi - Adobe X 在启动时启用保护模式 - 通过代码禁用

wpf - WPF是否可以在XP和Vista上运行?

Delphi XE2 64 位字符串例程的运行时性能极慢

delphi - TStream.Position 与 TStream.Seek 比较

windows - 如何摆脱 Windows 更新重启提示?