是否有这样一种对话框,既可以选择文件也可以选择文件夹
如标题所示,可完成如下功能:
1. 可在一个对话框中显示某目录下所有的文件和文件夹。
2. 可双击某文件夹显示其内的子文件夹及文件。
3. 选择某文件或文件夹后点击确定返回该文件/文件夹的路径。
求实现代码或控件,谢谢!
[解决办法]
封装一下 SHBrowseForFolder 即可
同时显示文件,要在bsi.ulFlags 上加上 BIF_BROWSEINCLUDEFILES 标志。
//------------------------------------------
function DirDlgProc(hwnd : HWND ; uMsg : UINT ;
lParam, lpData : integer) : integer; stdcall;
begin
Result := 0;
if (uMsg=BFFM_INITIALIZED) then
Windows.SendMessage(hwnd, BFFM_SETSELECTION, 1, lpData);
end;
//------------------------------------------
function SelectDirDlg(const hWinHandle : HWND ;
const sInitDirName : string;
var sRetDirName : string;
const sTitle : string = '选择文件夹 ') : boolean;
var
bsi : BROWSEINFO;
item , root : PItemIDList;
idn, tlt : string;
dpn, buf : array [0..MAX_PATH-1] of Char;
begin
Result := False;
sRetDirName := ' ';
FillChar(bsi, SizeOf(BROWSEINFO), 0);
item := nil; root := nil;
idn := sInitDirName+#0#0;
tlt := sTitle+#0#0;
FillChar(dpn, MAX_PATH, 0);
FillChar(buf, MAX_PATH, 0);
shlobj.SHGetSpecialFolderLocation(0, CSIDL_DRIVES, root);
if (Windows.IsWindow(hWinHandle)) and (Windows.IsWindowVisible(hWinHandle)) then
bsi.hwndOwner:=hWinHandle
else
bsi.hwndOwner:=Windows.GetActiveWindow;
bsi.pidlRoot := root;
bsi.pszDisplayName := @dpn;
bsi.lpszTitle := PChar(tlt);
bsi.ulFlags := BIF_DONTGOBELOWDOMAIN or BIF_RETURNFSANCESTORSor BIF_RETURNONLYFSDIRS or BIF_NEWDIALOGSTYLE or BIF_USENEWUI or BIF_BROWSEINCLUDEFILES;
bsi.lpfn := @DirDlgProc;
bsi.lParam := integer(PChar(idn));
try
ComObj.CoInitializeEx(nil,COINIT_APARTMENTTHREADED);
item := shlobj.SHBrowseForFolder(bsi);
if item <> nil then
begin
Windows.GlobalLock(Windows.GlobalHandle(item));
if shlobj.SHGetPathFromIDList(item, buf) then
begin
sRetDirName := buf;
Result := True;
end;
end;
finally
Windows.GlobalUnlock(Windows.GlobalHandle(item));
Windows.GlobalFree(Cardinal(item));
Windows.GlobalFree(Cardinal(root));
CoUninitialize;
end;
end;
[解决办法]
SelectDirectory函数可以在它的模式窗口里分别显示目录和目录下的文件,但文件们是灰色的,我不知道如何选择。 ^_^
[解决办法]
用ShellListView1自己做一个对话框
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ShellCtrls, Unit1;
type
TForm2 = class(TForm)
ShellListView1: TShellListView;
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
Form2:=nil;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
if ShellListView1.Selected <> nil then
Form1.Edit1.Text:=ShellListView1.Folders[ShellListView1.Selected.Index].PathName;
Close;
end;
end.