【问题标题】:Delphi 7 OnTypeChange not updatingDelphi 7 OnTypeChange 未更新
【发布时间】:2012-05-31 19:20:17
【问题描述】:

我正在使用 TOpenDialog 来允许用户打开 3 种不同类型的文件。当显示初始目录时,它仅列出与所选的当前扩展类型匹配的文件,这是我想要的。但是,当用户选择其他类型之一时,与该类型匹配的文件名永远不会出现。如果我在文件名框中键入 *.ext,那么该扩展名的所有文件名都会显示。当用户更改文件类型时如何获得该结果?

【问题讨论】:

    标签: delphi delphi-7 topendialog


    【解决方案1】:

    如果在编辑框中输入了通配符掩码,则对话框仅显示与该掩码匹配的文件,而不管在下拉列表中选择了哪种文件类型。当用户从列表中选择不同的文件类型时,掩码不会自动更新为新的文件扩展名。您必须在 OnTypeChange 事件中手动执行此操作,例如:

    uses
      ..., Dlgs, Commdlg;
    
    procedure TForm1.OpenDialog1TypeChange(Sender: TObject);
    const
      Extensions : array[1..4] of PChar = ('', 'ext1', 'ext2', 'ext3');
    var
      s : String;
      i : Integer;
    begin
      OpenDialog1.DefaultExt := Extensions[OpenDialog1.FilterIndex];
      if OpenDialog1.FilterIndex = 1 then Exit;
      i := SendMessage(GetParent(OpenDialog1.Handle), CDM_GETSPEC, 0, 0);
      if i > 1 then
      begin
        SetLength(s, i-1);
        SendMessage(GetParent(OpenDialog1.Handle), CDM_GETSPEC, i, LPARAM(PChar(s)));
        s := ChangeFileExt(s, '.' + Extensions[OpenDialog1.FilterIndex]);
        SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT, edt1, LPARAM(PChar(s)));
      end;
    end;
    

    【讨论】:

    • 谢谢。但是,delphi 不能识别字符串 CDM_GETSPEC 或 CDM_SETCONTROLTEXT 常量。他们在哪里?
    • 什么是 edt1。感谢您的帮助。
    • edt1 是 Windows 定义的 ID 号,表示对话框的文件名编辑控件。它在Dlgs 单元中定义。请参阅msdn.microsoft.com/en-us/library/windows/desktop/ms646960.aspx 的“Explorer-Style Control Identifiers”部分。
    • 您所描述的正是对话框本机操作的方式,而无需您做任何额外的事情。如果它没有为您这样做,那么您必须在代码中做一些事情来防止它。我展示的额外编码只是为了让用户输入的文件名在更改时与所选过滤器保持同步,仅此而已。该代码对列表框显示的内容没有影响,过滤器会这样做。让我开始怀疑您的过滤器配置不正确。能否请您显示您的实际过滤器数据?
    • @user - 您的过滤器错误,请从文件扩展名中删除空格以使其按您的意愿工作(最好删除所有不必要的空格)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多