如何打开一个文件夹(10分)

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

hotplayboy

Unregistered / Unconfirmed
GUEST, unregistred user!
如何用DELPHI打开所指定路径的文件夹。
 
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(0,'explore','G:/123456',nil,nil,SW_SHOWNORMAL);
end;
 
;ShellExecute(0,'open','G:/',nil,nil,SW_SHOWNORMAL);
注意在uses中加入shellapi
 
用资源管理器打开是
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(0,'explore','G:/123456',nil,nil,SW_SHOWNORMAL);
end;
用我的电脑打开是
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(0,'open','G:/123456',nil,nil,SW_SHOWNORMAL);
end;
 
用shellexecute汉书还可以打开某个url,或者outlook那个撰写邮件的窗口
 
打开选择目录窗口的api是哪个?
 
selectDirectory(...)
 
to Happy3X:
不是这个,是树形结构的,像资源管理器左边的文件夹一样,只能选择目录的!
 
uses FileCtrl;

const
; SELDIRHELP = 1000;
procedure TForm1.Button1Click(Sender: TObject);
var
; Dir: string;
begin
; Dir := 'C:/MYDIR';
; if SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP) then
; ; Label1.Caption := Dir;
end;
这不行吗?
 
这不行。
应该是用SHBrowseForFolder函数,但这个函数在VB里好用,在Delphi中一样用,
窗口出来了,却不显示目录结构,为什么?该怎么用这个函数呢?
 
察看Delphi的win32sdk帮助文档,里面应该有具体使用说明
 
就是这个函数,他可以打开旧时的和现在的:
aPath := '';
; if SelectDirectory('请选择路径', '', aPath) then
; ; edtPath.Text := aPath;
 
唉,水平低,我是看了Delphi的win32sdk帮助文档的,但还是错,怎么办,谁帮我想想吧。
问题变成了SHGetPathFromIDList怎么用,怎么也出错,不用SHGetPathFromIDList是不会
出错,但得到的路径又不对。
多谢dcsdcs等,SelectDirectory我会用,但这是win16的风格,我要的是win32风格的。

use shlobj;

procedure TForm1.Button1Click(Sender: TObject);
var
; ; udtBI:browseinfo;
; ; lpIDList:pointer;
; ; dn:pchar;
; ; ddd:pchar;
begin
; ; udtBI.hWndOwner := Handle ;
; ; udtBI.iImage :=0;
; ; udtBI.lParam :=0;
; ; udtBI.lpfn :=nil;
; ; udtBI.lpszTitle := 'ssss';
; ; udtBI.pidlRoot:=nil;
; ; udtBI.pszDisplayName:=dn;
; ; udtBI.ulFlags :=BIF_RETURNONLYFSDIRS ;
; ; lpIDList := SHBrowseForFolder(udtBI);
{到这里都ok}
; ; if lpIDList=nil then
; ; ; ; ShowMessage('取消')
; ; else begin
; ; ; ; SHGetPathFromIDList(lpIDList,ddd);
{VB中是用这个函数得到路径的,但Delphi中就出错,}
; ; ; ; Application.MessageBox(dn,'消息',MB_OK);
; ; end;
end;

以下是VB的程序,谁能翻译一下吗?

Private Type BrowseInfo
; ; hWndOwner As Long
; ; pIDLRoot As Long
; ; pszDisplayName As Long
; ; lpszTitle As Long
; ; ulFlags As Long
; ; lpfnCallback As Long
; ; lParam As Long
; ; iImage As Long
End Type

Private Const BIF_RETURNONLYFSDIRS = 1
Private Const MAX_PATH = 260

Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long


Public Function BrowseForFolder(hWndOwner As Long, sPrompt As String) As String
'打开选择目录对话框,返回路径
Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo

With udtBI
; ; .hWndOwner = hWndOwner
; ; .lpszTitle = lstrcat(sPrompt, "")
; ; .ulFlags = BIF_RETURNONLYFSDIRS
End With

lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
; ; sPath = String$(MAX_PATH, 0)
; ; lResult = SHGetPathFromIDList(lpIDList, sPath)
; ; Call CoTaskMemFree(lpIDList)
; ; iNull = InStr(sPath, vbNullChar)
; ; If iNull Then
; ; ; ; sPath = Left$(sPath, iNull - 1)
; ; End If
End If

BrowseForFolder = sPath

End Function

to hotplayboy:
不好意思,借你的问题发挥一下。
 
var
; tmp:string;
; ...
; lpIDList:=SHBrowseForFolder(udtBI);
; if assigned(lpIDList) then
; Begin
; ; ;SetLength(tmp,100);
; ; ;SHGetPathFromIDList(lpIDList,PChar(tmp));
; ; ;Edit1.Text:=tmp;
; end;
这样就OK了。
 
多谢zfh大侠!
 
多人接受答案了。
 
后退
顶部