不小心散了分,含泪高分再求解?(200分)

  • 主题发起人 主题发起人 HaiChengruo
  • 开始时间 开始时间
H

HaiChengruo

Unregistered / Unconfirmed
GUEST, unregistred user!
函数GetDirectry用于取得桌面或网络任一路径,弹出系统提供的对话框供用户选择, 可有时行有时不行。请各位大虾帮忙看看代码哪里有误。
Function GetDirectry(handle:HWND;PromtStr:String):String;
var
m_strInitDir, szDirectory:pchar;
m_iImageIndex:integer;
hr:HRESULT;
chOlePath:Pwidechar;
pchEaten:DWORD;
dwAttributes:DWORD;
pDesktopFolder:IShellFolder;
browseInfo:_BROWSEINFO;
// lpItemList:****EMID;
lpItemList:PITEMIDLIST;
lpM:IMalloc;
begin
// chOlePath:=nil;
m_strInitDir:=StrAlloc(255*sizeof(char));
szDirectory:=StrAlloc(255*sizeof(char));
new(chOlePath);
// new(lpItemList);
ZeroMemory(Pointer(@browseInfo),sizeof(browseInfo));
hr:= SHGetMalloc(lpM);
if (FAILED(hr) ) then exit;
hr:=SHGetDesktopFolder(pDesktopFolder);
if (FAILED(hr) ) then exit;
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, m_strInitDir, -1,chOlePath, MAX_PATH);
hr:= pDesktopFolder.ParseDisplayName(handle,
nil,
chOlePath,
pchEaten,
lpItemList,
dwAttributes);
if (FAILED(hr)) then
begin
lpM.Free(lpItemList);
lpM._Release;
exit;
end;
browseInfo.pidlRoot:=nil;//lpItemList;
browseInfo.hwndOwner:=0;
browseInfo.pszDisplayName:=szDirectory;
browseInfo.lpszTitle:=pchar(PromtStr);
browseInfo.ulFlags:= BIF_RETURNFSANCESTORS and BIF_RETURNONLYFSDIRS;
browseInfo.lParam:=0;

lpItemList:=SHBrowseForFolder(browseInfo);
if (lpItemList= nil) then
begin
exit;;
end;
//szDirectory.ReleaseBuffer();
m_iImageIndex:= browseInfo.iImage;
if (SHGetPathFromIDList(lpItemList,szDirectory)) then
begin
// Get the selected directory name
// szDirectory.ReleaseBuffer();
end;
lpM.Free(lpItemList);
lpM:=nil;
Result:=String(szDirectory);
StrDispose(m_strInitDir);
StrDispose(szDirectory);
Dispose(chOlePath);
end;
 
最简单的办法如下:
uses FileCtrl;
var
Dir:string;
if SelectDirectory('选择保存下载文件的'+#13+#10+'位置:','',dir) then
FilePath.Text:=Dir;
 
就是,本来就有此函数,更简单的是Rx控件包里有个
filenameedit控件,连代码都不用写了。
 
同意无忌的说法!
 
来自:张无忌, 时间:2002-6-14 16:23:00, ID:1163498
最简单的办法如下:
uses FileCtrl;
var
Dir:string;
if SelectDirectory('选择保存下载文件的'+#13+#10+'位置:','',dir) then
FilePath.Text:=Dir;

我一直都是这样
 
又是shell编程,说不清楚。
张兄说得就挺好。用SaveDialog也可以阿。
你能说说你具体想做什么么??
也许大家能帮你。
 
在FileCtrl单元有SelectDirectory
参数第一个是提示信息,第二个是默认目录,第三个是所选目录输出
 
已经发过帖子,为什么又发?
peng_qs的代码可行!我试过,难道不行吗?

uses ShlObj, ActiveX, ComObj;

ItemIDList : PItemIDList;
logfilename : array[0..512] of Char;
savefilename : String;


SHGetSpecialFolderLocation(handle,CSIDL_DESKTOP,ItemIDList);
SHGetPathFromIDList(ItemIDList,logfilename);
savefilename := string(logfilename);
 
这个函数挺好的, 没想到有这样的好东东。在此谢谢各位了。
 
后退
顶部