如何指定SelectDirectory的起始目录(50分)

  • 主题发起人 主题发起人 CathyEagle
  • 开始时间 开始时间
C

CathyEagle

Unregistered / Unconfirmed
GUEST, unregistred user!
用SelectDirectory可以调用windows的标准选择目录对话框,请问在Delphi中如何让SelectDirectory打开时定位到指定的目录,如d:/aaa
 
var
Dir: string;

Dir := 'd:/yystar';
if SelectDirectory(Dir, [],SELDIRHELP) then
Label1.Caption := Dir;
 
我需要的是windows的“标准“浏览目录对话框,就像Winamp中设置Skin目
录时一样。这种风格的对话框我试过了。(Sorry,上次忘了回车)
 
好象不行,不过Dir = 0 为‘桌面’
=1为‘我的电脑’
 
帮助文档中有:
function SelectDirectory(const Caption: string; const Root:
WideString; out Directory: string): Boolean; overload;
照着此方式调用SelectDirectory就行了,Caption指定对话框的标题,Root就是
你需要的指定目录的参数,用户选择的目录返回在Directory参数中。
 
用ShellAPI函数——“SHBrowseForFolder”调用windows的标准选择目录对话框

==================
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, shlobj;

var
info: TBrowseinfo;
Dir: array[0..266] of char;
Itemid: PitemIDList;
begin
with info do
begin
hwndOwner := self.Handle;
pidlRoot := nil;
pszDisplayName := nil;
lpszTitle := '请选择xxx文件的目录';
ulFlags := 0; {“0”表示返回控制面板、回收站等目录,“1”则反之}
lpfn := nil;
lParam := 0;
iImage := 0;
end;

ItemId := SHBrowseForFolder(info);
if ItemId <> nil then
begin
SHGetPathFromIDList(ItemId, @Dir);
label3.Caption := string(Dir);
end
else label3.Caption := '';

 
xinglong的方法我试了,和SelectDirectory效果一样。
再重复一遍我的问题,就像Winamp中设置Skin目录时一样,标准选择目录对话框
中以“桌面”为根,“我的电脑”、“我的文档”等全部都有,而目录就展开到
c:/program files/winamp/skin。
 
给那个窗口发消息可以设置路径:
SendMessage(Hwnd,BFFM_SETSELECTION,Ord(TRUE),Longint(PChar(Path)));

关键是如何得到该窗口的句柄?
borland在写selectdirectory函数时省略了BrowseInfo的lpfn属性,
这个属性指向一个CallBack函数,可以实现你的程序和该对话框窗口的
通讯.该Callback函数声明为:
int BrowseCallbackProc(
HWND hwnd,
UINT uMsg,
LPARAM lParam,
LPARAM lpData
);
其中,HWND参数就是传递过来的该对话框的句柄,得到这个句柄,你就可以
用我前面说的sendmessage设置路径了.

还有一点,你应该在BrowseCallbackProc函数理判断当接受到BFFM_INITIALIZED
消息时设置路径,也就是说:uMsg:=BFFM_INITIALIZED的时候.
 
BrowseCallbackProc函数我在SDK帮助里可以找到,但是Delphi并不认识,需要
自己写吗?请给例子。
 
>>但是Delphi并不认识

什么意思?
 
我按照cAkk兄的方法,非常棒!!!
 
这种控件满大街都是,你到深度历险去找,至少有10个
,呵呵我都写过一个
 
不认识的意思就是Delphi找不到它的函数原型,我查过Delphi目录下的所有文件,没
有这个函数。
 
老兄啊!老兄! Callback的函数都这样的!
这只是一个函数模型,你要自己写一个函数,声明格式和他一样就可以了!
 
Very sorry,昨天才有时间按cAkk的方法试验了,非常棒。
不过不能用SelectDirectory函数,只能直接调用SHBrowseForFolder,让
lpfn :=@BrowseCallbackProc;
lParam :=BFFM_INITIALIZED
 
to cAKK:
>>>老兄啊!老兄! Callback的函数都这样的!
>>>这只是一个函数模型,你要自己写一个函数,声明格式和他一样就可以了!
怎么写,我是新手。对于API函数不知如何在delphi处理。能给个代码片断吗,只要能讲明这
如何在delphi中写这个BrowseCallbackProc。万分感谢。
 

Similar threads

后退
顶部