zoukankan      html  css  js  c++  java
  • delphi 选择文件夹目录保存


    Windows目录对话框是一个标准的WindowsUI控件,其可以列出一个目录列表,并且可以显示新增按钮。由于Delphi中并没有提供对于该控件的封装,所以打开它是个问题。网上有多种方法,试举几例:

    1、使用Win31目录下的DriverList、DirectoryList、FileList和FileFilterList四个控件进行组合来获取当前目录,操作复杂,也不美观,对程序EXE体积影响明显

    2、使用Samples下的ShellTreeView,效果很好,但对程序EXE体积也是增加明显

    3、让用户直接定位文件,通过对话框OpenDialog来实现,但无法限制用户定位文件的权限,而且可能在程序中使用相对目录时冲突报错

    4、利用FileCtrl单元中的SelectDirectory函数定位到文件夹,且可以用Root参数限定根目录上限,但总是弹出在右下角

    5、我个人是使用以下方法直接调用Windows目录对话框,向原作者表示衷心感谢!

    unit BrowseForFolderU;

    interface

    function BrowseForFolder(const browseTitle:string;
      const initialFolder:string=''):string;

    implementation

    uses Windows,shlobj;

    var
      lg_StartFolder:string;

    function BrowseForFolderCallBack(Wnd:HWND;uMsg:UINT;
      lParam,lpData:LPARAM):Integer stdcall;
    begin
      if uMsg=BFFM_INITIALIZED then
        SendMessage(Wnd,BFFM_SETSELECTION,1,Integer(@lg_StartFolder[1]));
      result:=0;
    end;

    function BrowseForFolder(const browseTitle:string;
      const initialFolder:string=''):string;
    const
      BIF_NEWDIALOGSTYLE=$40;
    var
      browse_info:TBrowseInfo;
      folder:array[0..MAX_PATH] of char;
      find_context:PItemIDList;
    begin
      FillChar(browse_info,SizeOf(browse_info),#0);
      lg_StartFolder:=initialFolder;
      browse_info.pszDisplayName:=@folder[0];
      browse_info.lpszTitle:=PChar(browseTitle);
      browse_info.ulFlags:=BIF_RETURNONLYFSDIRS or BIF_NEWDIALOGSTYLE;
      if initialFolder<>'' then
        browse_info.lpfn:=BrowseForFolderCallBack;
      find_context:=SHBrowseForFolder(browse_info);
      if Assigned(find_context) then
      begin
        if SHGetPathFromIDList(find_context,folder) then
          result:=folder
        else
          result:='';
        GlobalFreePtr(find_context);
      end
      else
        result:='';
    end;

    end.

    调用代码:

    uses
     BrowseForFolderU;

    procedure TForm1.Button1Click(Sender: TObject);
    var opath,dpath,omsg:String;
    begin
      dpath:='c:';
      omsg:='请选择路径:';
      opath:=BrowseForFolder(omsg,dpath);
      if opath<>'' then Edit1.Text:=opath
      else
        Application.MessageBox('没有选择路径','系统提示',MB_OK+MB_ICONERROR);
    end;

    参考:

    http://blog.sina.com.cn/s/blog_7d8514840101d1is.html

  • 相关阅读:
    附加数据库 对于 服务器“00-PC”失败
    SQL 语句转换格式函数Cast、Convert
    sql语句:union
    ISNULL-sqlserver语句
    SQL中的CASE WHEN语句
    SQL SELECT INTO 语句
    Sql语句中IN等方面的用法
    combobox的不常用的方法和将txt文本内容加到textbox中显示
    程序员:“菜鸟”和“大神”差距在哪
    过劳死离我们有多远?
  • 原文地址:https://www.cnblogs.com/yangxuming/p/6892625.html
Copyright © 2011-2022 走看看