明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: iceberg2509

vlisp如何打开多重选择文件对话框

  [复制链接]
发表于 2005-10-8 10:50:00 | 显示全部楼层

Ea兄,烦把你联系方式告诉我好吗?我编程序涉及这方面问题,急想问你!急盼解决,几乎随时都在关心你们的答复,因为没有这方面的相关中文帮助目前我解决不了!

我的邮箱cwafeng@163.com

发表于 2005-10-9 21:06:00 | 显示全部楼层

2K跟XP可以调试通过,98好象还有问题!

(DEFUN GETFILES (MSG WL / X)
  (VL-LOAD-COM)
  (IF (NOT (VLAX-CREATE-OBJECT "MSCOMDLG.COMMONDIALOG"))
    (VL-REGISTRY-WRITE
      "HKEY_CLASSES_ROOT\\LICENSES\\4D553650-6ABE-11CF-8ADB-00AA00C00905"
      ""
      "GFJMRFKFIFKMKFFFRLMMGMHMNLULKMFMQKQJ"
    )
  )
  (IF (SETQ X (VLAX-CREATE-OBJECT "MSCOMDLG.COMMONDIALOG"))
    (PROGN
      (IF (NOT PATH)
 (SETQ PATH "")
      )
      (VLAX-PUT-PROPERTY X "DIALOGTITLE" MSG)
      (VLAX-PUT-PROPERTY X "FILENAME" WL)
      (VLAX-PUT-PROPERTY X "FILTER" WL)
      (VLAX-PUT-PROPERTY X "INITDIR" PATH)
      (VLAX-PUT-PROPERTY X "MAXFILESIZE" 10000)
      ;; IN LISP UNBEDINGT NOTWENDIG, SONST KOMMT NE  ;;FEHLERMELDUNG VON WEGEN ZU WENIG SPEICHER
      (VLAX-PUT-PROPERTY X "FLAGS" 512)
      (VLAX-PUT-PROPERTY X "ACTION" 1) ;_ SHOWOPEN-DIALOG
      (SETQ ERG (VLAX-GET-PROPERTY X "FILENAME"))
    )
  )
  (IF (AND ERG (/= ERG WL))
    (SETQ ERG (STTOLST ERG))
    (SETQ ERG NIL)
  )
)

(DEFUN STTOLST (STR / F F2 LST I)
  (SETQ I 1)
  (SETQ F2 "")
  (WHILE (/= (SETQ F (SUBSTR STR I 1)) "")
    (IF (= F " ")
      (PROGN
 (SETQ LST (APPEND LST (LIST F2)))
 (SETQ F2 "")
      )
      (SETQ F2 (STRCAT F2 F))
    )
    (SETQ I (1+ I))
  )
  (SETQ LST (APPEND LST (LIST F2)))
)

调用命令:(GETFILES "选择需要批处理打印的文件"  "*.PLT")

发表于 2005-10-12 14:39:00 | 显示全部楼层
mccad发表于2005-9-30 21:46:00虽然可以改成(vlax-put-property x \"Flags\" (+ 512 524288))来调用新的打开文件对话框,但返回值一直都调不出来。但用同样的方法在VBA中使用则没有问...

这个问题是可以解决的!

先让网友想想!!

 

;;test OK with XP
;;(mjtd-getfiles DialogTitle filter)
;;(mjtd-getfiles "选择图形文件" "Drawing Files|*.dwg|All Files|*.*")

 

本帖子中包含更多资源

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

x
发表于 2005-10-12 15:37:00 | 显示全部楼层

龙版主的作品就是不一样啊!!!

发表于 2005-10-12 16:01:00 | 显示全部楼层

;;;说明:                                                       
;;;本函数使用MsComDlg.Commondialog对象                         
;;;可以进行多文件选取                                          
;;;功能上类同于dos_getfilem                                    
;;;返回值为"C:\\CAD\\DWG\000ct7b.dwg\000ct7c.dwg\000ct8.dwg"   
;;;其中"\000"为空字符;                                        
;;;(setq maxfs   32767                                         
;;;      flags    (+ 4 512 524288 1048576 1024)                
;;;      diatl   "请选择"                                      
;;;      filter  "图形文件(*.dwg)|*.dwg|所有文件(*.*)|*.*"     
;;;      initdir ""                                            
;;;)                                                           
;;;调用方式 (Ms_getfilem maxfs flags diatl filter initdir)     
;;;适用于cadR15以上任何本                                      
;;;引用时请保留本明                                            
;;;by cs 2005.8.15                                             


(defun Ms_getfilem (maxfs flags diatl filter initdir / wincomdlg filem)
  (vl-load-com)
  (setq wincomdlg (vlax-create-object "MSComDlg.CommonDialog"))
  (vlax-put-property wincomdlg 'CancelError :vlax-true)
  (vlax-put-property wincomdlg 'MaxFileSize maxfs)
  (vlax-put-property
    wincomdlg
    'Flags
    flags
  )
  (vlax-put-property wincomdlg 'DialogTitle diatl)
  (vlax-put-property
    wincomdlg
    'Filter
    filter
  )
  (vlax-put-property wincomdlg 'InitDir initdir)
  (vlax-invoke-method wincomdlg 'ShowOpen)
  (setq filem (vlax-get wincomdlg 'filename)) 
  (vlax-release-object wincomdlg)
  filem
)

本帖子中包含更多资源

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

x
发表于 2005-10-12 16:07:00 | 显示全部楼层

不知道龙龙仔是怎么解决的,

我尝试了很多次才试出来的

用 (vlax-get wincomdlg 'filename)

替换(comdlgp-get-FileName wincomdlg)

但是其实还是不知道两种表达方式的真正差别?

请龙龙仔指导咯。

发表于 2005-10-12 16:21:00 | 显示全部楼层

;;返回值为"C:\\CAD\\DWG\000ct7b.dwg\000ct7c.dwg\000ct8.dwg"

;;你是指去除"\000"吗?那再简单不过!    函数:vl-string->list

发表于 2005-10-13 22:38:00 | 显示全部楼层
龙老大,对话框打开后若取消会出错?能不能返回是NIL就好了,这样可执行相应后面操作!
发表于 2005-10-13 22:41:00 | 显示全部楼层

你是指去除"\000"吗?那再简单不过!    函数:vl-string->list
好象不那么简单,我是这样解决的!

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(DEFUN MS_GETFILEM (MAXFS FLAGS DIATL FILTER INITDIR / WINCOMDLG)
  (VL-LOAD-COM)
  (IF (NOT (VLAX-CREATE-OBJECT "MSCOMDLG.COMMONDIALOG"))
    (VL-REGISTRY-WRITE
      "HKEY_CLASSES_ROOT\\LICENSES\\4D553650-6ABE-11CF-8ADB-00AA00C00905"
      ""
      "GFJMRFKFIFKMKFFFRLMMGMHMNLULKMFMQKQJ"
    )
  )
  (SETQ WINCOMDLG (VLAX-CREATE-OBJECT "MSCOMDLG.COMMONDIALOG"))
  (VLAX-PUT-PROPERTY WINCOMDLG 'CANCELERROR :VLAX-TRUE)
  (VLAX-PUT-PROPERTY WINCOMDLG 'MAXFILESIZE MAXFS)
  (VLAX-PUT-PROPERTY
    WINCOMDLG
    'FLAGS
    FLAGS
  )
  (VLAX-PUT-PROPERTY WINCOMDLG 'DIALOGTITLE DIATL)
  (VLAX-PUT-PROPERTY
    WINCOMDLG
    'FILTER
    FILTER
  )
  (VLAX-PUT-PROPERTY WINCOMDLG 'INITDIR INITDIR)
  (VLAX-INVOKE-METHOD WINCOMDLG 'SHOWOPEN)
  (SETQ FILEM (VLAX-GET WINCOMDLG 'FILENAME))
  (VLAX-RELEASE-OBJECT WINCOMDLG)
  (FSTR->LST FILEM)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(DEFUN FSTR->LST (FM / N)
  (SETQ FF NIL)
  (IF (VL-STRING-POSITION (ASCII "\000") FM)
    (PROGN
      (WHILE (VL-STRING-POSITION (ASCII "\000") FM)
 (SETQ N (VL-STRING-POSITION (ASCII "\000") FM))
 (SETQ FF (APPEND FF (LIST (SUBSTR FM 1 N))))
 (SETQ FM (SUBSTR FM (+ N 2) (- (STRLEN FM) N 1)))
      )
      (SETQ FF (APPEND FF (LIST FM)))
    )
    (PROGN
      (SETQ FF (VL-FILENAME-DIRECTORY FM))
      (SETQ FF (LIST FF (VL-STRING-SUBST "" FF FM)))
    )
  )
调用命令
(DEFUN AA()
(SETQ MAXFS   32767
      FLAGS   (+ 4 512 524288 1048576 1024)
      DIATL   "请选择"
      FILTER  "打印文件(*.plt)|*.plt|所有文件(*.*)|*.*"
      INITDIR ""
)
(IF PATH
  (SETQ INITDIR PATH)
  (SETQ INITDIR "")
)
(MS_GETFILEM MAXFS FLAGS DIATL FILTER INITDIR))

发表于 2005-10-14 11:19:00 | 显示全部楼层

没有,我指的是

为什么用 (vlax-get wincomdlg 'filename)可以得到返回值,

而 (comdlgp-get-FileName wincomdlg) 却只有路径没有文件名呢?

这两个到底有什么差别?

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-6-1 06:38 , Processed in 0.188039 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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