ユーザーは、標準の Windows 開くダイアログ (「詳細」表示モード) で、対応する列ヘッダーをクリックして、名前、日付、またはサイズでファイルを手動で並べ替えることができます。アプリケーションでプログラムで Open Dialog (Delphi の TOpenDialog クラス) で並べ替えモードを設定して、ダイアログが優先される並べ替えで開くようにする方法は?
4 に答える
TFileOpenDialog (D2009) は、Windows の IFileDialog インターフェイスを内部的に使用します。そのインターフェイスは、ファイルの並べ替えを設定する方法を提供しません。ただし、SetClientGuid と ClearClientData はあります。これらは ClientGUID プロパティを通じて TFileOpenDialog によって使用されます。特定のインスタンスに ClientGuid を設定すると、ダイアログの状態を保持するようにウィンドウに指示されます。Windows は、最後に開いたフォルダー、ファイルの一覧表示方法、並べ替えなどを記憶します。
そのため、ユーザーがファイルを開くときに最後にダイアログを設定した方法を記憶してユーザーに対応したい場合は、FileOpenDialog の ClientGUID を設定するだけです。
GUID を取得するには、コード エディターで Ctrl-Shft-G を押します。これを ClientGUID プロパティに貼り付けるときは、角かっこを忘れないようにしてください。
GetOpenFileName() API と Vista の IFileDialog インターフェイスは、これをサポートしていません。この雑誌の記事に示されているように、ダイアログをハックすることができます。記事がかなり古いことに注意してください。そして、このようなハッキングはもろく、次のバージョンの Windows で機能しなくなる可能性があります。
DexExpress の TcxShellListView のようなコンポーネントを使用して独自のものを作成できます。ファイルのソートを可能にします。
件名をグーグルで調べた後、いくつかの「マジックナンバー」を見つけ、次の解決策にたどり着きました(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;
最初のメッセージは「詳細」表示モードを設定し、2 番目は「属性別」、3 番目は「名前別」のソートを設定します。最終ソートが昇順であることを保証するために、2 つの異なる「ソート」メッセージが必要です。
上記のコードは Win XP では正常に動作しますが、並べ替え部分は Win 2000 SP4 では動作しません。Win 7 では、「ソート マジック ナンバー」がシフトされます。つまり、「ByName = $7603」などです。