秋枫 发表于 2003-4-25 22:21:00

[原创函数]使用标准vlisp显示选择文件夹对话框的方法


;; 本代码仅提供作为应用上的参考, 而未声明或隐含任何保证; 对于任何特殊
;; 用途之适应性, 以及商业销售所隐含作出的保证, 在此一概予以否认.
;; ==================================================================
;; 作者:秋枫,参考了灯火的VBA程序
;; 用法:(qf_getFolder msg)
;; 例子:(qf_getFolder "选择文件夹:")
;; 返回值:字符串,文件夹路径,如果点了cancel, 返回nil

(defun qf_getFolder (msg / WinShell shFolder path catchit)
(vl-load-com)
(setq winshell (vlax-create-object "Shell.Application"))
(setq shFolder (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 1))
(setq
    catchit (vl-catch-all-apply
              '(lambda ()
               (setq shFolder (vlax-get-property shFolder 'self))
               (setq path (vlax-get-property shFolder 'path))
             )
          )
)
(if (vl-catch-all-error-p catchit)
    nil
    path
)
)

锋十七 发表于 2024-7-22 17:06:30

谢谢楼主,需要消化一下

灰石Jeremy 发表于 2020-5-13 23:05:25

不错不错,多谢大神

龙龙仔 发表于 2003-4-26 08:08:00

;;再提供"选择档夹"别一方法,配合Expresstool

;;再提供"选择档夹"别一方法,配合Expresstool
(arxload "acetutil.arx" NIL)
(setq PREFIX_DWG
       (strcat
       (strcase (acet-ui-pickdir
                  "选择目录"
                  (vl-string-right-trim "\\" (getvar "dwgprefix"))
                  "移除未使用之具名参考"
                  )
       )
        ; "\\"
       )
)

龙龙仔 发表于 2003-4-26 08:20:00

可有"Shell.Application"的其他使用說明,(vlax-dump-object winshell t)看不出來

秋枫 发表于 2003-4-26 10:56:00

这个方法不错。关于Shell.Application的说明

这个程序是从灯火同志的vbscript程序改写过来的。即activex方法的vlisp表达。所以我对这个对象并不多了解一点。关于这点我猜也许可以向论坛上的南子或河伯求教吧?他们都是高手,呵呵。

我用vba自带的对象查看器查了一下,见附件,也许有点用。

秋枫 发表于 2003-4-26 10:57:00

附件

龙龙仔 发表于 2003-4-26 16:06:00

谢谢你!!但像程序中shFolder对象性质数据要查询那里??那些物件才会有传回值???

谢谢你!!但像程序中shFolder对象性质数据要查询那里??那些物件才会有传回值???

像以下都沒有傳回值,看來大部份函數都不合vlisp用
(setq computer(vlax-invoke-method WINSHELL 'findcomputer))
(setq explore(vlax-invoke-method WINSHELL 'explore "c:"))
(setq findfiles(vlax-invoke-method WINSHELL 'findfiles))

秋枫 发表于 2003-4-26 21:21:00

无能为力。sorry.

efan2000 发表于 2003-4-28 13:12:00

关于VL中的vlax-invoke-method

VL中的vlax-invoke-method,如果调用ActiveX对象时,相当于VB中的调用过程和函数的用法。VB中的过程是没有返回值的,则在VL中仅这样调用就可以:(vlax-invoke-method WINSHELL 'findcomputer),而函数有返回值,用setq computer(vlax-invoke-method WINSHELL 'findcomputer))获取返回值。

龙龙仔 发表于 2003-4-28 16:20:00

這個我當然知道,但那些物件才会有传回值???像shFolder对象性质数据要到那裡查询??

河伯 发表于 2003-5-5 01:29:00

Windows文件系统有两道暗门...

Windows文件系统有两道暗门,一道是Scripting.FileSystemObject,另一道是Shell.Application,应用Vlisp的朋友有时为不能使用Windows API而遗憾,实际上用AcitiveX走暗门更简单有趣,Shell.Application是API的AcitiveX实现形式,一般在脚本编程的书里讲到,如果不怕脑袋瓜疼,下面这本可以看看:

微软公司核心技术书库:Win32开发人员参考库第5卷Windows Shell
出版社:机械工业出版社
译作者:(美)David Iseminger著
页: [1] 2 3
查看完整版本: [原创函数]使用标准vlisp显示选择文件夹对话框的方法