如果TOpenDialog包含问号,为什么会显示重复的文件过滤器掩码?

时间:2016-07-13 08:52:31

标签: delphi

给出以下测试表(在Delphi 10.1和Delphi 2007中测试):

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    od_test: TOpenDialog;
    b_Test: TButton;
    procedure b_TestClick(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.b_TestClick(Sender: TObject);
begin
   od_test.Execute;
end;

end.

(我省略了一些默认属性,基本上它是带有TOpenDialog和按钮的表单。唯一重要的部分是TOpenDialog.Filter属性。)

{{1}}

为什么对话框会显示包含问号的过滤器,如下所示:

duplicate filter

这是一个已知的错误还是我做错了什么?如果它是一个已知的bug,是否有一个解决方法(除了显而易见的遗漏'(bla?.dbf)'部分描述,这意味着我必须更改所有描述。)?

编辑:这是在Windows 8.1上。我还没有尝试过其他版本。如果它有所不同:我已禁用资源管理器选项"隐藏knonw文件类型的扩展名"。

1 个答案:

答案 0 :(得分:6)

这里有几个因素。

因子1

正如我在评论中所写,我通常使用一个简单的过滤器,而不重复过滤器描述中的过滤器掩码:

OpenDialog1.Filter := 'blub|blub*.dbf|bla|bla?.dbf';

对我来说,这会产生:

blub (blub*.dbf)
bla (bla?.dbf)

但是当在Windows资源管理器中,我启用文件夹选项“隐藏已知文件类型的扩展名”时,{{1}中的组合框的下拉列表看起来像:

TOpenDialog

现在,不再显示过滤器遮罩。

因子2

为避免遗漏过滤掩码,您可以在说明中重复,如问题所示:

blub
bla

如果上面描述的文件夹选项在因子1下已禁用(IOW,如果显示所有扩展名),则打开的对话框显然会检查过滤器是否过滤掩码包含在说明中,然后它不会再次显示在括号中。但这仅适用于包含星号的过滤器,但似乎不适用于包含问号的过滤器

这就是你得到的原因:

OpenDialog1.Filter := 'blub (blub*.dbf)|blub*.dbf|bla (bla?.dbf)|bla?.dbf';

blub (blub*.dbf) bla (bla?.dbf) (bla?.dbf) 的描述被禁止后自动显示过滤器模板,但blub没有。

结论

所以ISTM你应该避免带有问号的过滤器面具,或者如果你真的必须,你不应该在描述中包含那些:

bla

但是,如果您的文件夹选项隐藏已知文件类型的扩展名,则存在根本不显示OpenDialog1.Filter := 'blub (blub*.dbf)|blub*.dbf|bla|bla?.dbf'; 描述的过滤器掩码的风险。那么,你的组合框下拉列表可以看起来像这样:

bla

我想你必须做出决定。我不知道你是否或如何查询文件夹选项(这将是一个很好的新问题)。如果可以,您可以提供不同的过滤字符串,具体取决于选项。

更新

根据@dummzeuch,有关该选项的信息可以在(surprise!)注册表中找到。链接:windowsitpro.com/systems-management/…

  

可以在HKEY_CURRENT_USER \ Software的注册表中更改/读取   \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Advanced使用密钥   HideFileExt。当然,逻辑是颠倒的:设置为0表示全部   扩展名,设置为1以隐藏已知扩展名。

就个人而言,

我将继续定义简单的过滤器,例如

blub (blub*.dbf)
bla

如果人们认为他们不想在文件夹中看到已知的扩展名,他们将无法自动显示过滤器掩码。如果他们决定告诉Windows他们想要查看所有扩展,他们将在组合框中自动显示过滤器掩码。