给出以下测试表(在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}}
为什么对话框会显示包含问号的过滤器,如下所示:
这是一个已知的错误还是我做错了什么?如果它是一个已知的bug,是否有一个解决方法(除了显而易见的遗漏'(bla?.dbf)'部分描述,这意味着我必须更改所有描述。)?
编辑:这是在Windows 8.1上。我还没有尝试过其他版本。如果它有所不同:我已禁用资源管理器选项"隐藏knonw文件类型的扩展名"。
答案 0 :(得分:6)
这里有几个因素。
正如我在评论中所写,我通常使用一个简单的过滤器,而不重复过滤器描述中的过滤器掩码:
OpenDialog1.Filter := 'blub|blub*.dbf|bla|bla?.dbf';
对我来说,这会产生:
blub (blub*.dbf)
bla (bla?.dbf)
但是当在Windows资源管理器中,我启用文件夹选项“隐藏已知文件类型的扩展名”时,{{1}中的组合框的下拉列表看起来像:
TOpenDialog
现在,不再显示过滤器遮罩。
为避免遗漏过滤掩码,您可以在说明中重复,如问题所示:
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他们想要查看所有扩展,他们将在组合框中自动显示过滤器掩码。