文件夹的选定(50分)

  • 主题发起人 主题发起人 fuku
  • 开始时间 开始时间
F

fuku

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟想知道如何用OpenDialog实现文件夹的选定,
而不是文件的选定,就象安装程序一样,谢谢!
 
这个没有这个功能,自己做个对话框用drivercombox,directory listbox。。。。等
 
试试这个
uses FileCtrl;

procedure TForm1.Button1Click(Sender: TObject);
var dir:String;
begin
if SelectDirectory(dir,[],500) then
Edit1.text := Dir;
end
 
To robertcool:
drivercombox可是无法选定网上邻居的呀!
 
不过要做到Word的那个功能,就太难了。
if opendialog.execute then
ResultPath=ExtractFilePath(OpenDialog.FileName)
 
用这个API吧:SHBrowseForFolder
不过DFS(http://www.delphifreestuff.com)上还有个更好的东东,
叫TdfsBrowseDirectoryDlg。
 
To Kingron
如果文件夹下没有文件怎么办?
 
To doxpix
小弟在Delphi 5下安装了TdfsBrowseDirectoryDlg后,
发现其属性和方法和帮助中的说明不一致,竟然连execute
方法都没有,怎么做啊???
 
不会吧。我刚刚装了一试。有Excute的呀。
不信跑到我这来看看呀。

安装控件应该装那个BrowseDrReg.pas吧。
不会怪我没告诉你吧。
 
look,这个是可以指定初始文件夹的
unit Unit1;
interface
uses
  ……shlobj,ActiveX;
  ……

var
   Form1: TForm1;
   Path: string;   //起始路径

implementation

{$R *.DFM}

function BrowseCallbackProc(hwnd: HWND;uMsg: UINT;lParam: Cardinal;lpData: Cardinal): integer; stdcall;
begin
  if uMsg=BFFM_INITIALIZED then
    result :=SendMessage(Hwnd,BFFM_SETSELECTION,Ord(TRUE),Longint(PChar(Path)))
  else
    result :=1
end;

function SelDir(const Caption: string; const Root: WideString; out Directory: string): Boolean;
var
  WindowList: Pointer;
  BrowseInfo: TBrowseInfo;
  Buffer: PChar;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;
begin
  Result := False;
  Directory := '';
  FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
  if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
  begin
    Buffer := ShellMalloc.Alloc(MAX_PATH);
    try
      RootItemIDList := nil;
      if Root <> '' then begin
        SHGetDesktopFolder(IDesktopFolder);
        IDesktopFolder.ParseDisplayName(Application.Handle, nil, POleStr(Root), Eaten,           RootItemIDList, Flags);
      end;
      with BrowseInfo do begin
        hwndOwner := Application.Handle;
        pidlRoot := RootItemIDList;
        pszDisplayName := Buffer;
        lpszTitle := PChar(Caption);
        ulFlags := BIF_RETURNONLYFSDIRS;
        lpfn :=@BrowseCallbackProc;
        lParam :=BFFM_INITIALIZED;
      end;
      WindowList := DisableTaskWindows(0);
      try
        ItemIDList := ShBrowseForFolder(BrowseInfo);
      finally
        EnableTaskWindows(WindowList);
      end;
      Result := ItemIDList <> nil;
      if Result then begin
        ShGetPathFromIDList(ItemIDList, Buffer);
        ShellMalloc.Free(ItemIDList);
        Directory := Buffer;
      end;
    finally
      ShellMalloc.Free(Buffer);
    end;
  end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  Path1: string;
begin
  Path :=Edit1.Text;
  SelDir('SelectDirectory Sample','',Path1);
  Edit1.Text :=Path1
end;

end.
 
多人接受答案了。
 
后退
顶部