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

时间:2010-06-03 10:52:49

标签: delphi winapi topendialog

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

4 个答案:

答案 0 :(得分:2)

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

因此,如果您只是想通过记住打开文件时设置对话框的最后方式来容纳您的用户,您只需设置FileOpenDialog的ClientGUID。

要获取GUID,请在代码编辑器中按Ctrl-Shft-G。只需记住在将其粘贴到ClientGUID属性时不要使用方括号。

答案 1 :(得分:1)

GetOpenFileName()API和Vista IFileDialog接口不支持此功能。您可以按照this magazine article中的说明破解对话框。请注意,这篇文章已经过时了。而那些像这样的黑客很脆弱,他们可能会停止在下一版本的Windows上工作。

答案 2 :(得分:0)

您可以使用像DexExpress的TcxShellListView这样的组件来自己动手。它允许对文件进行排序。

答案 3 :(得分:0)

在Google搜索主题后,我发现了一些“神奇的数字”,并且已经找到了以下解决方案(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;

第一个消息设置“详细信息”视图模式,第二个消息设置排序“按属性”和第三个“按名称”排序;两个不同的“排序”消息需要两个保证,即最终排序是升序。

以上代码在Win XP上运行正常,但排序部分在Win 2000 SP4上不起作用;在Win 7上,“分类魔术数字”被移位,即“ByName = $ 7603”等等。