【问题标题】:Why does TOpenDialog display a duplicate file filter mask if it contains a question mark?如果 TOpenDialog 包含问号,为什么它会显示重复文件过滤器掩码?
【发布时间】:2016-07-13 08:52:30
【问题描述】:

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

object Form1: TForm1
  Caption = 'Form1'
  ClientHeight = 340
  ClientWidth = 639
  object b_Test: TButton
    Caption = 'Test'
    OnClick = b_TestClick
  end
  object od_test: TOpenDialog
    Filter = 'blub (blub*.dbf)|blub*.dbf|bla (bla?.dbf)|bla?.dbf'
  end
end

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

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.

为什么对话框会像这样两次显示包含问号的过滤器:

这是一个已知的错误还是我做错了什么?如果这是一个已知的错误,是否有解决方法(除了明显的省略描述中的“(bla?.dbf)”部分,这意味着我必须更改所有描述。)?

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

【问题讨论】:

  • 无法在 Windows 8.1 上使用 Delphi 10.1 Berlin 进行复制。也许是一些操作系统问题?
  • 我希望过滤器字符串是:'blub|blub*.dbf|bla|bla?.dbf'。不需要在名称中重复掩码。所以在你的设置中,bla (...) (...) 实际上是正确的,但blub 也应该是blub (...) (...)
  • @RudyVelthuis,如果您想在描述中看到过滤器掩码,您必须编写它。它不会自动添加。过滤器字符串是正确的,图片中显示的加倍是不正确的,虽然我不能说它来自哪里,因为我不能在这里重现它。
  • 好的,在 Windows 10 上我可以重现它。如果我的过滤器字符串是'blub (xxx)|blub*.dbf|bla (yyy)|bla?.dbf',那么我得到blub (xxx) (blub*.dbf)bla (yyy) (bla?.dbf)。但是,如果我指定与问题中相同的字符串,我会得到相同的结果。显然,打开的对话框会扫描过滤器名称以查找此类 () 条目,如果它们与过滤器相同,则它们仅显示一次。它显然识别*,但不是?作为通配符,因此它不会删除 bla 的双重条目。
  • @Uwe:如果过滤器是'blub|blub*.dbf|bla|bla?.dbf',那么对话框会显示'blub (blub*.dbf)''bla (bla?.dbf)',至少在10.1 Berlin 和Windows 10 中。据我所知,这一直是情况就是这样,我总是这样定义过滤器。过滤器名称中无需重复掩码。

标签: delphi


【解决方案1】:

这里有几个因素。

因素 1

正如我在我的cmets中所写,我通常使用一个简单的过滤器,过滤器描述中没有重复过滤器掩码:

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

对我来说,这会产生:

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

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

blub
bla

所以现在,过滤器掩码不再显示了。

因素 2

为避免过滤器掩码的遗漏,您可以在描述中重复它,如问题中:

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

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

这就是你得到的原因:

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

blub 的描述后过滤器掩码的自动显示被抑制,但 bla 没有。

结论

因此,ISTM 建议您要么避免使用带有问号的过滤器掩码,要么如果确实必须,则不应在描述中包含这些:

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

但是,如果您的文件夹选项隐藏已知文件类型的扩展名,这将承担bla 描述根本不显示过滤器掩码的风险。那么,您的组合框下拉列表可能如下所示:

blub (blub*.dbf)
bla

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

更新

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

这可以从 HKEY_CURRENT_USER\Software 的注册表中更改/读取 \Microsoft\Windows\CurrentVersion\Explorer\Advanced 与密钥 隐藏文件分机。逻辑当然是相反的:设置为 0 以显示所有 extensions,设置为 1 以隐藏已知的扩展名。


个人而言,

我会继续定义简单的过滤器,比如

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

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

【讨论】:

  • 根据windowsitpro.com/systems-management/…,这可以使用 HideFileExt 键从 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced 的注册表中更改/读取。逻辑当然是相反的:设置为 0 以显示所有扩展名,设置为 1 以隐藏已知的扩展名。
  • @dummzeuch:谢谢,将其添加到答案中,以便可以找到。
猜你喜欢
  • 2010-12-31
  • 2012-03-31
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 2016-06-08
相关资源
最近更新 更多