代码之家  ›  专栏  ›  技术社区  ›  kludg

如何在打开对话框中设置排序模式

  •  1
  • kludg  · 技术社区  · 16 年前

    用户可以通过单击相应的列标题,按名称、日期或大小在标准Windows打开对话框(在“详细信息”视图模式下)中手动对文件进行排序。如何在应用程序中以编程方式在opendialog(Delphi中的TOpenDialog类)中设置排序模式,以便以首选排序打开对话框?

    4 回复  |  直到 16 年前
        1
  •  1
  •   Hans Passant    16 年前

    GetOpenFileName()API和Vista IFileDialog接口对此不支持。如中所示,可以对对话框进行黑客攻击 this magazine article

        2
  •  2
  •   Marjan Venema    16 年前

    TFileOpenDialog(D2009)在内部使用Windows的IFileDialog接口。该接口不提供任何设置文件排序的方法。但是它有SetClientGuid和ClearClientData。TFileOpenDialog通过其ClientGUID属性使用这些属性。为特定实例设置ClientGuid将指示windows保持对话框的状态。Windows将记住最后打开的文件夹、文件的列表方式和排序。

        3
  •  0
  •   yozey    16 年前

        4
  •  0
  •   kludg    16 年前

    在搜索了这个主题之后,我发现了一些“幻数”,并得出了以下解决方案(TOpenDialog.OnFolderChange事件处理程序):

    procedure TDM.OpenDlgFolderChange(Sender: TObject);
    const
      FCIDM_SHVIEW_LARGEICON = $7029;
      FCIDM_SHVIEW_SMALLICON = $702A;
      FCIDM_SHVIEW_LIST = $702B;
      FCIDM_SHVIEW_REPORT = $702C;
      FCIDM_SHVIEW_THUMBNAIL = $702D;
      FCIDM_SHVIEW_TILE = $702E;
    
      ByName = $7602;
      BySize = $7603;
      ByType = $7604;
      ByModified = $7605;
      ByAttributes = $7608;
    
    var
      Handle: THandle;
    
    begin
      Handle:= FindWindowEx(GetParent(OpenDlg.Handle), 0, 'SHELLDLL_DefView', nil);
      SendMessage(Handle, WM_COMMAND, FCIDM_SHVIEW_REPORT, 0);
      SendMessage(Handle, WM_COMMAND, ByAttributes, 0);
      SendMessage(Handle, WM_COMMAND, ByName, 0);
    end;
    

    上面的代码在winxp上运行良好,但是排序部分在win2000sp4上不起作用;在Win7上,“排序幻数”被移位,即“ByName=$7603”等。

    推荐文章