使用SHBrowseForFolder定位指定文件

时间:2010-01-27 09:04:34  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:er="1">implementation uses ShlObj, ShellApi; function BrowseCallBack ( Hwnd : THandle; uMsg : UINT; lpParam, lpData : LPARAM): integer; stdcall; var Buffer : Array[0..255] of char; Buffer2 : Array[0..255] of char; TmpStr : String; begin   // 初始化缓冲区...
  正文:

这里是一个定位包含指定文件的文件夹的例子,其中使用到了SHBrowseForFolder和一个BrowseCallBack函数。



implementation

uses ShlObj, ShellApi;

function BrowseCallBack ( Hwnd : THandle; uMsg : UINT; lpParam, lpData : LPARAM): integer; stdcall;
var
Buffer : Array[0..255] of char;
Buffer2 : Array[0..255] of char;
Tmphotoshop/ target=_blank class=infotextkey>pstr : String;
begin
  // 初始化缓冲区
  FillChar(Buffer,SizeOf(Buffer),#0);
  FillChar(Buffer2,SizeOf(Buffer2),#0);
  
  // 状态行
  TmpStr := 'Locate folder containing '+StrPas(PChar(lpData));
  
  // 将状态行文本复制为PChar
  StrPCopy(Buffer2,TmpStr);
  
  // 发消息通知BrowseForDlg状态行文本已改变
  SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,Integer(@Buffer2));
  
  // BrowswForDlg中的目录是否改变?
  if uMsg = BFFM_SELCHANGED then begin
    // 获取新目录名
    SHGetPathFromIDList(PItemIDList(lpParam),Buffer);
    // 检查文件是否存在
    {$IFDEF RX_D3}  //RxLib - extentions
    if FileExists(NormalDir(StrPas(Buffer))+StrPas(PChar(lpData)))
    and (StrLen(Buffer) > 0) then                            
    {$ELSE}
    if Length(StrPas(Buffer)) <> 0 then
    if Buffer[Length(StrPas(Buffer))-1] = '' then
    Buffer[Length(StrPas(Buffer))-1] := #0;
    if FileExists(StrPas(Buffer)+''+StrPas(PChar(lpData))) and
    (StrLen(Buffer) > 0) then
    {$ENDIF}
    // 找到 : 发消息使OK按钮有效
      SendMessage(hwnd,BFFM_ENABLEOK,1,1)
    else
    // 发消息使OK按钮失效
      SendMessage(Hwnd,BFFM_ENABLEOK,0,0);
  end;
  result := 0
end;


function BrowseforFile(Handle : THandle; Title : String; Filename : String) : String;
var
BrowseInfo : TBrowseInfo;
RetBuffer,
FName,
ResultBuffer : Array[0..255] of char;
PIDL : PItemIDList;
begin
  StrPCopy(Fname,FileName);
  //初始化缓冲区
  FillChar(BrowseInfo,SizeOf(TBrowseInfo),#0);
  Fillchar(RetBuffer,SizeOf(RetBuffer),#0);
  FillChar(ResultBuffer,SizeOf(ResultBuffer),#0);
  
  BrowseInfo.hwndOwner := Handle;
  BrowseInfo.pszDisplayName := @Retbuffer;
  BrowseInfo.lpszTitle := @Title[1];
  
  // 我们想要显示状态行文本
  BrowseInfo.ulFlags := BIF_StatusText;
  
  // 我们的回调函数,用于检查文件是否存在
  BrowseInfo.lpfn := @BrowseCallBack;
  BrowseInfo.lParam := Integer(@FName);
  
  // 显示 BrowseForDlg
PIDL := SHBrowseForFolder(BrowseInfo);
  // 返回文件的完整路径名
  if SHGetPathFromIDList(PIDL,ResultBuffer) then
  result := StrPas(ResultBuffer)
  else
  Result := '';
  
  GlobalFreePtr(PIDL);  //释放

"使用SHBrowseForFolder定位指定文件"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/2010-01-27/12467.html


关键字:

关于《使用SHBrowseForFolder定位指定文件》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td