马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
使用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}"。在程序中,我们需要将其转换成真正选中的位置名称(不是文件夹)。
示例的代码可以打开含有选定文本框的界面并正确返回选定的文件夹或位置名称。

- ;| Perform Windows browse folder dialog interface
- Syntax: (vldos-browsedir PromptString[STRING])
- (vldos-writefile NIL)
- ARG1: The prompt string, if it is nil, use default prompt string of "Select Folder"
- Description:
- Display windows browse folder interface sna let user select a folder
- Return Value:
- [Success]: The selected folder path. If user pick cancel, return NIL
- [F a i l]: NIL
- |;
- (Defun vldos-browsedir (msg / WinShell shFolder path catchit rtn)
- (if (null MSG)
- (setq MSG "Select folder")
- )
- (if (and (setq winshell (vlax-create-object "Shell.Application"))
- (setq shFolder
- (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 48)
- )
- )
- (progn
- (setq catchit
- (vl-catch-all-apply
- '(lambda ()
- (setq shFolder (vlax-get-property shFolder 'self))
- (setq path (vlax-get-property shFolder 'path))
- )
- )
- )
- (vlax-release-object shFolder)
- (vlax-release-object winshell)
- (if (vl-catch-all-error-p catchit)
- (setq rtn nil)
- (progn
- (setq rtn path)
- (cond ((and (= (substr rtn 1 3) "::{")
- (= (substr rtn (strlen rtn)) "}")
- )
- (setq
- rtn (vl-registry-read
- (strcat "HKEY_CLASSES_ROOT\\CLSID\"
- (substr rtn 3)
- )
- )
- )
- )
- ((and (= (substr rtn 1 1) "\")
- (/= (substr rtn 1 2) "\\\")
- )
- (setq rtn (strcat "\" rtn))
- )
- )
- )
- )
- )
- )
- rtn
- )
|