如何让 OpenDialog 只能选择目录,并且只返回目录名?(40分)

  • 主题发起人 主题发起人 jimyho
  • 开始时间 开始时间
J

jimyho

Unregistered / Unconfirmed
GUEST, unregistred user!
如何让 OpenDialog 只能选择目录,并且只返回目录名?

记得在dos下用 dir *. 就可列出目录.但我把 *. ; .. ; .
等放到 filter去却一点效也没有.
 
不用 OpenDialog, 可以用 SelectDirectory.
 
我建议用Win31页TDirectoryListBox组件
 
是啊!可以用Win31页TDirectoryListBox组件
也可以用OpenDialog,但须要外加一个FILELISTBOX组件。
你可将其设置为不可视:
filelistbox.filename:=opendialog.filename;
然后,label.caption:=filelistbox.directory;
怎么样,满意吗?
 
to SuperMMX
那么创建一个目录该如何做?如何检测一个目录的存在?
 

if not DirExists(ExtractFilePath(Application.ExeName) + 'xlsbak') then //检测目录是否存在?
try
MkDir(ExtractFilePath(Application.ExeName) + 'xlsbak');//创建目
//录
except
;
end;


function DirExists(Name: string): Boolean;
{$IFDEF WIN32}
var
Code : Integer;
begin
Code := GetFileAttributes(PChar(Name));
Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
end;
{$ELSE}
var
SR : TSearchRec;
begin
if Name[Length(Name)] = '/' then Dec(Name[0]);
if (Length(Name) = 2) and (Name[2] = ':') then
Name := Name + '/*.*';
Result := FindFirst(Name, faDirectory, SR) = 0;
Result := Result and (SR.Attr and faDirectory <> 0);
end;
{$ENDIF}

 
同意superMMX
浏览SelectDirectory
判断目录是否存在DirectoryExists
创建目录ForceDirectories
将目录分成盘符,目录,文件名ProcessPath
 
//agree superMMX
另外,SelectDirectory有两种形式,其中一种是可以自动创建目录的,无须再写代码!
 
可以用 SelectDirectory
或用Win31页TDirectoryListBox组件
 
DO NOT FORGET DELPHI HELP
 
SelectDirectory显示的对话框未免太古老了吧。下面这个unit 封装了win95/98的
SHBrowseFolder()函数。另外我还做了一个tcomponent,增加几个onevent的功能


unit MyBrowseFolder;

interface

uses Windows,SysUtils;

function BrowseFolder(const Hwnd:THandle;const Title,Root,InitPath:String):String;

//root 指定最顶层的目录 initpath指定初始目录

implementation
uses ShlObj;

function BrowseProc(hwnd:HWND; uMsg:UINT;
lParam, lpData :LPARAM):Integer;stdcall;
begin
if uMsg <> bffm_selchanged then
SendMessage(hwnd,BFFM_SETSELECTIONA,Ord(False),lpData);
Result:=0;
end;

function BrowseFolder(const Hwnd:THandle;const Title,Root,InitPath:String):String;
var
fFolder :TBrowseInfo;
fPath :pchar;
fItemID :PItemIDList;
fRootItem :PItemIDList;
fInitpathItem:PItemIDList;
fDispName :array[0..MAX_PATH] of Char;
slFolder :IShellFolder;
A ,B :Cardinal;
begin
Result:='';
SHGetDesktopFolder(slFolder);
slFolder.ParseDisplayName(Hwnd,nil,
StringToOleStr(Root),
A,fRootItem,B);
slFolder.ParseDisplayName(Hwnd,nil,
StringToOleStr(InitPath),
A,fInitpathItem,B);
with fFolder do
begin
hwndOwner :=Hwnd;
pidlRoot :=fRootItem;
pszDisplayName :=@fdispname;
lpszTitle :=PChar(Title) ;
lpfn :=@BrowseProc;
ulFlags :=0;
lParam :=Integer(fInitpathItem);
end;

fItemID :=SHBrowseForFolder(fFolder);
if Assigned(fItemID)then
begin
Getmem(fPath,MAX_PATH );
try
if SHGetPathFromIDList(fItemID,fPath) then Result:=String(fPath);
finally
freeMem(fPath,MAX_PATH);
end;
end;
end;

end.
 
>>SelectDirectory显示的对话框未免太古老了吧

?????????
SelectDirectory就是用的SHBrowseForFolder来实现的呀!

 
cAKK:承蒙指教,刚刚看了selectdirectory的函数,它有两种类型,其中一种确实
是封装了 SHBrowseForFolder 。 但是我试用了一下,认为这个函数有两个地方不足。
1、不能设定 root 路径,我设了,好像无效
2、初始路径也无法设定,每次都是从我得电脑开始
 
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
s:='';
SelectDirectory('Hello', 'c:/', s);
label1.caption:=s;
end;

Delphi5,中文windows98
 
用ExtractFilePath(opendialog1.fileName) 比较简单,
>>jimyho:
它不可能实现你说的功能。
 
你教我该怎么分呢?
 
To elan:
  到我的主页上“资料库”看看就知道了,cAkk解答的。
eagleboost.myrice.com
 
to CathyEagle: 我看了一下,跟我得代码差不多,只不过我的设初始目录的方式是在:
with fFolder do
begin
......
lParam :=Integer(fInitpathItem);
end;

这是我很早写的,有点糊涂了,:-(,等我从广西回来再仔细对比一下有什么区别。


 
用SelectDirectory最方便
 
是啊,SelectDirectory的帮助里说的多简单啊!就用它吧
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
433
import
I
后退
顶部