首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

是否有这样一种对话框,既可以选择文件也可以选择文件夹,该如何处理

2012-02-09 
是否有这样一种对话框,既可以选择文件也可以选择文件夹如标题所示,可完成如下功能:1.可在一个对话框中显示

是否有这样一种对话框,既可以选择文件也可以选择文件夹
如标题所示,可完成如下功能:

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.

热点排行