Как установить режим сортировки в Open Dialog - PullRequest
1 голос
/ 03 июня 2010

Пользователь может вручную сортировать файлы в стандартном диалоговом окне Windows Open (в режиме просмотра «Сведения») по имени, дате или размеру, щелкнув заголовок соответствующего столбца.Как программно установить режим сортировки в Open Dialog (класс TOpenDialog в Delphi) в приложении, чтобы диалог открывался с предпочтительной сортировкой?

Ответы [ 4 ]

2 голосов
/ 03 июня 2010

TFileOpenDialog (D2009) внутренне использует интерфейс IFileDialog из Windows. Этот интерфейс не предлагает какой-либо способ настройки сортировки файлов. Однако он имеет SetClientGuid и ClearClientData. Они используются TFileOpenDialog через его свойство ClientGUID. Установка ClientGuid для вашего конкретного экземпляра заставляет окна сохранять состояние диалога. После этого Windows запомнит все, что было в последней открытой папке, порядок отображения файлов и сортировку.

Итак, если вы просто хотите разместить своих пользователей, вспомнив последний способ, которым они настраивали диалог при открытии файла, все, что вам нужно сделать, это установить ClientGUID для FileOpenDialog.

Чтобы получить GUID, нажмите Ctrl-Shft-G в редакторе кода. Просто не забудьте оставить квадратные скобки при вставке этого в свойство ClientGUID.

1 голос
/ 03 июня 2010

API GetOpenFileName () и интерфейс Vista IFileDialog не поддерживают это. Вы можете взломать диалог, как показано в этой журнальной статье . Остерегайтесь, что статья довольно устарела. И такие хаки хрупки, они могут перестать работать на следующей версии Windows.

0 голосов
/ 04 июня 2010

После поиска в теме я нашел несколько «магических чисел» и пришел к следующему решению (обработчик события 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" и т. д.

0 голосов
/ 04 июня 2010

Вы можете свернуть свой собственный, используя такой компонент, как DexExpress TcxShellListView.Позволяет сортировать файлы.

...