Delphi的SelectDirectory(版本1)中使用问题?(100分)

O

ow

Unregistered / Unconfirmed
GUEST, unregistred user!
SelectDirectory调用Windows浏览对话框的那个版本中,
如何能使对话框打开时就选中当前的目录?
 
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.
 
用这个 SelDir('SelectDirectory Sample','',Path1); 代替 SelectDirectory
 
to beta:
你给的程序能保证在95/98/NT4.0/2000下兼容吗?
 
试一试不就知道了!你的问题已过期,要继续请结束,否则请提前,谢谢
 
接受答案了.
 
顶部