【问题标题】:TSaveDialog and 2 formats with same extensionTSaveDialog 和 2 种具有相同扩展名的格式
【发布时间】:2019-10-28 17:15:07
【问题描述】:

在 TSaveDialog 中,我添加了 2 种具有相同扩展名的格式:

Format A|*.form
Format B|*.form
Format C|*.diff

现在我想确定用户选择了哪种格式:

var Ext: String;
begin
  if not SaveDialog1.Execute then Exit;

  Ext := LowerCase(ExtractFileExt(SaveDialog1.FileName));

这样我可以区分“格式 B”和“格式 C”,但不能区分“格式 A”和“格式 B”。

【问题讨论】:

  • 如果用户在文件名中手动输入“.form”会怎样?
  • A和B有什么区别?是基于扩展名/文件名还是它们只是内容不同?
  • @JerryDodge 这是个好问题!
  • @Ancaron 是的,不同的内容。我想将图像导出为汇编程序代码,因此扩展名为 .asm,但适用于 3 个不同的汇编程序

标签: delphi save-dialog tsavedialog


【解决方案1】:

使用FilterIndex 属性来确定在操作对话框时选择了哪个过滤器。

【讨论】:

  • 有趣的是,该属性似乎是基于 1 而不是基于 0。这有点奇怪。
  • @JerryDodge 直接反映了OPENFILENAME的底层winapi nFilterIndex字段
  • 我就是这么想的。然而,考虑到德尔福试图让一切都成为标准的倾向,这仍然有点奇怪。我可以理解新的 Delphi 开发人员如何对如何做事如此困惑——期待顶级编程,但随后意识到他们必须在他们转向的任何地方进行更深入的挖掘。
【解决方案2】:

虽然 David 的回答与所提出的问题直接相关,但在确定用户意图时还需要考虑更多因素。您不一定只依靠文件扩展名来了解用户想要做什么。毕竟用户可以自己手动在文件名中输入.form,那你该怎么办呢?

相反,此类选项不应在此级别上实施。以我的经验,这些事情是在中间水平上实现的。例如,想想视频编辑/制作。用户可能希望将视频呈现为MP4 视频。或者也许是AVI。但是,这些可能的格式中的每一种都有各种各样的其他特定选项,例如视频编解码器、质量等等。

在这种情况下需要做的是在保存文件之前提供一层额外的用户选项。让它成为某种意义上的“项目”的一部分。用户对他们的内容做他们需要做的事情,并且这个过程的一部分是决定他们打算产生什么类型的输出格式。当用户决定保存时,在提示他们输入文件名之前,首先提示他们输入其他特定格式选项,具体取决于您的应用程序支持的格式。

长话短说,不要依赖文件扩展名本身来识别用户的所有意图。在选择输出扩展名之前,应该有一个中间级别的用户选择文件的格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2017-04-03
    • 2017-06-23
    相关资源
    最近更新 更多