找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1038|回复: 6

[密技]:ActiveX BrowseForFolder 秘技

[复制链接]
发表于 2005-1-12 09:26:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
使用Shell.Application的BrowseForFolder方法可以打开浏览文件夹对话。在Windows中,这种对话有两种界面:含有选定文本框的和没有文本框的。在调用中区别这两种界面的方法可以通过控制BrowseForFolder方法的第三个变量来实现。

; 1 RestrictToFilesystem = &H1 ' BIF_RETURNONLYFSDIRS
; 2 RestrictToDomain = &H2 ' BIF_DONTGOBELOWDOMAIN
; 8 RestrictToSubfolders = &H8 ' BIF_RETURNFSANCESTORS
; 16 ShowTextBox = &H10 ' BIF_EDITBOX  含有选定的文本框
; 32 ValidateSelection = &H20 ' BIF_VALIDATE
; 64 NewDialogStyle = &H40 ' BIF_NEWDIALOGSTYLE 新型的对话类型
; 4096 BrowseForComputer = &H1000 ' BIF_BROWSEFORCOMPUTER  浏览计算机
; 8192 BrowseForPrinter = &H2000 ' BIF_BROWSEFORPRINTER 浏览打印机
; 16384 BrowseForEverything = &H4000 ' BIF_BROWSEINCLUDEFILES 包括桌面上的快捷方式,但是返回值不是路径

上面这些数值可以单独或逻辑相加来控制BrowseForFolder方法

由于在浏览文件夹时,我们可能选中一些没有实际地址的文件夹,如:网上邻居、我的电脑等,BrowseForFolder方法在这种情况下回返回一个含有GUID的字符串如"::{4662DAAD-D393-11D0-9A56-00C04FB68BF7}"。在程序中,我们需要将其转换成真正选中的位置名称(不是文件夹)。

示例的代码可以打开含有选定文本框的界面并正确返回选定的文件夹或位置名称。

  1. ;|  Perform Windows browse folder dialog interface
  2. Syntax: (vldos-browsedir PromptString[STRING])
  3.         (vldos-writefile NIL)
  4.   ARG1: The prompt string, if it is nil, use default prompt string of "Select Folder"
  5. Description:
  6.     Display windows browse folder interface sna let user select a folder
  7. Return Value:
  8. [Success]: The selected folder path. If user pick cancel, return NIL
  9. [F a i l]: NIL
  10. |;
  11. (Defun vldos-browsedir (msg / WinShell shFolder path catchit rtn)
  12.   (if (null MSG)
  13.     (setq MSG "Select folder")
  14.   )
  15.   (if (and (setq winshell (vlax-create-object "Shell.Application"))
  16.            (setq shFolder
  17.                   (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 48)
  18.            )
  19.       )
  20.     (progn
  21.       (setq catchit
  22.              (vl-catch-all-apply
  23.                '(lambda        ()
  24.                   (setq shFolder (vlax-get-property shFolder 'self))
  25.                   (setq path (vlax-get-property shFolder 'path))
  26.                 )
  27.              )
  28.       )
  29.       (vlax-release-object shFolder)
  30.       (vlax-release-object winshell)
  31.       (if (vl-catch-all-error-p catchit)
  32.         (setq rtn nil)
  33.         (progn
  34.           (setq rtn path)
  35.           (cond        ((and (= (substr rtn 1 3) "::{")
  36.                       (= (substr rtn (strlen rtn)) "}")
  37.                  )
  38.                  (setq
  39.                    rtn (vl-registry-read
  40.                          (strcat "HKEY_CLASSES_ROOT\\CLSID\"
  41.                                  (substr rtn 3)
  42.                          )
  43.                        )
  44.                  )
  45.                 )
  46.                 ((and (= (substr rtn 1 1) "\")
  47.                       (/= (substr rtn 1 2) "\\\")
  48.                  )
  49.                  (setq rtn (strcat "\" rtn))
  50.                 )
  51.           )
  52.         )
  53.       )
  54.     )
  55.   )
  56.   rtn
  57. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-1-12 11:13:55 | 显示全部楼层
; error: no function definition: VLDOS-FORMATPATH

運行發現 VLDOS-FORMATPATH 涵數沒有定義.不知這個涵數主要實現什麼?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-12 15:09:34 | 显示全部楼层
少一个vldos-formatpath函数,需补上
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-12 20:30:39 | 显示全部楼层
vldos-formatpath没有什么大作用,主要是将路径的/改成\\
在这个函数中可不用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-1-16 00:28:57 | 显示全部楼层
以前秋枫贴过

我就是不明白,为什么指定了起始目录,要去它的上级就不行,为什么?!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-17 09:37:38 | 显示全部楼层
According with the last (4th) argument for BrowseForFolder method, it is a string shows the RootFolder. So when you indicate the start location for BrowseForFolder, the RootFolder will be the placed on the top. By indicating the 4th argument, you have told the program to select folder within the RootFolder,  so you can not go outside the RootFolder to select folders.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 773个

财富等级: 财运亨通

发表于 2017-7-22 23:47:52 | 显示全部楼层
非常棒!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 02:27 , Processed in 0.178531 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表