2010-06-03 29 views
1

用戶可以通過單擊相應的列標題,按名稱,日期或大小手動對標準Windows打開對話框(在「詳細信息」視圖模式下)中的文件進行排序。如何在應用程序中以編程方式在Open Dialog(Delphi中的TOpenDialog類)中設置排序模式,以便該對話框以首選排序方式打開?如何在打開的對話框中設置排序模式

回答

1

GetOpenFileName()API和Vista IFileDialog接口不支持此操作。您可以按照this magazine article中的演示來破解對話框。注意文章是相當過時的。而像這樣的黑客很脆弱,他們可能會停止在下一個版本的Windows上工作。

2

TFileOpenDialog(D2009)內部使用Windows的IFileDialog接口。該接口不提供任何設置文件排序的方式。但它確實有SetClientGuid和ClearClientData。 TFileOpenDialog通過它的ClientGUID屬性使用它們。爲特定實例設置ClientGuid將指示窗口保持對話狀態。然後Windows會記住最後打開的文件夾,文件列出方式和排序方式。

因此,如果您只想通過記住打開文件時設置對話框的最後一種方式來滿足您的用戶,您只需設置FileOpenDialog的ClientGUID即可。

要獲取GUID,請在代碼編輯器中按Ctrl-Shft-G。只要記住將它粘貼到ClientGUID屬性中時不要使用方括號。

0

你可以使用像DexExpress'TcxShellListView這樣的組件來推出自己的產品。它允許對文件進行排序。

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」等。

相關問題