找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2281|回复: 14

[他山之石] Err_Routines

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-7-20 08:51:50 | 显示全部楼层 |阅读模式

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

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

×
  1. ;;;出错处理例程

  2. ;; (catch-error <Protected> <OnError>)
  3. ;;
  4. ;; (catch-error
  5. ;;   '(lambda () <code to protect>...)
  6. ;;   '(lambda (error) <error handling code>...)
  7. ;; )
  8. ;;
  9. ;; A wrapper for vl-catch-all-xxxxxxx
  10. ;;
  11. ;; This function provides a high-level exception-handling
  12. ;; construct that allows the programmer to factor out some
  13. ;; of the testing and flow control required when using the
  14. ;; vl-catch-all-xxxxx functions directly (which is messy).
  15. ;;
  16. ;; (catch-error) takes two arguments, both of which are
  17. ;; quoted function names or lambda lists:
  18. ;;
  19. ;; <Protected> is a function that takes no arguments
  20. ;; (usually a lambda list). It is evaluated, and if an
  21. ;; error occurs during its evaluation, then <OnError> is
  22. ;; called and passed the error string.
  23. ;;
  24. ;; <OnError> is a function that is called only if an error
  25. ;; occurs during the evaluation of <Protected>. In that case,
  26. ;; the message returned by (vl-catch-all-error-message) is
  27. ;; passed to <OnError> as its only argument.
  28. ;;
  29. ;; If no error occurs during evaluation of <Protected>, then
  30. ;; (catch-error) returns the result of <Protected>. If an error
  31. ;; occurs during evaluation of <Protected>, then (catch-error)
  32. ;; returns the result of <OnError> if supplied. If an error
  33. ;; occurs and <OnError> is not supplied (e.g., nil), then
  34. ;; (catch-error) returns the Visual LISP error object that
  35. ;; triggered the error.
  36. ;;
  37. ;; By default, errors are always handled. The only way to
  38. ;; re-raise the error is to call (exit) from within <OnError>,
  39. ;; and is generally what should be done in cases where the
  40. ;; error is unknown or the code in the <OnError> error handler
  41. ;; is not equipped to deal with a particular type of error.
  42. ;;
  43. ;; Note that calls to (catch-error) can be nested, such that
  44. ;; if a nested call does not handle an error (by calling exit
  45. ;; or vl-exit-with-error), then one or more outer calls can
  46. ;; also examine and/or handle the error, with the caveat that
  47. ;; the error message is not the same as the original one, if
  48. ;; you use (exit). If you use (vl-exit-with-error), then the
  49. ;; error message is correct, but in that case the outer most
  50. ;; call to (catch-all) must handle the error because it cannot
  51. ;; call (exit) to invoke the *error* function.
  52. ;;
  53. ;; In essence, you can think of each call to
  54. ;; catch error to be a temporary and locally-bound
  55. ;; redefinition of the *error* function (where the
  56. ;; <OnError> argument represents the body of *error*),
  57. ;; with the added benefit of being able to resume
  58. ;; execution if desired.
  59. ;;
  60. ;;
  61. ;; Example:
  62. ;;
  63. ;;   The following code obtains a point or the
  64. ;;   option keyword "foo", and traps the error
  65. ;;   that occurs if the user responds with the
  66. ;;   option keyword.
  67. ;;   
  68. ;;   If the error is not a result of the user
  69. ;;   entering the keyword, then something else
  70. ;;   has gone wrong. In that case, the error
  71. ;;   handler displays the error message, and
  72. ;;   aborts by calling (exit).
  73. ;;   
  74. ;;   If no error occurs, then the error handler
  75. ;;   is not called, and the user-supplied point
  76. ;;   is assigned to Result
  77. ;;
  78. ;; (defun C:CATCH-ERROR-TEST ()
  79. ;;   
  80. ;;   (setq eKeyWordInput
  81. ;;      "Automation Error. User input is a keyword"
  82. ;;   )
  83. ;;   
  84. ;;   (setq Util
  85. ;;      (vla-get-utility
  86. ;;         (vla-get-activeDocument
  87. ;;            (vlax-get-acad-object)
  88. ;;         )
  89. ;;      )
  90. ;;   )
  91. ;;   
  92. ;;
  93. ;;   (vla-InitializeUserInput Util 0 "Foo")
  94. ;;   
  95. ;;   (setq result
  96. ;;      (catch-error
  97. ;;       '(lambda ()
  98. ;;            (vla-Getpoint
  99. ;;               Util nil "Enter point/Foo: "
  100. ;;            )
  101. ;;         )
  102. ;;       '(lambda (error)
  103. ;;           (if (eq error eKeyWordInput)
  104. ;;              (vla-GetInput Util)
  105. ;;              (progn
  106. ;;                 (alert (strcat "Error: " errmsg))
  107. ;;                 (exit)
  108. ;;              )
  109. ;;           )
  110. ;;        )
  111. ;;     )
  112. ;;   )
  113. ;;        
  114. ;;   (if (eq (type Result) 'Str)
  115. ;;      (princ "\nUser entered 'FOO'")
  116. ;;      (princ "\nUser entered a point")
  117. ;;   )
  118. ;;   
  119. ;;   (princ)
  120. ;;
  121. ;; )
  122. ;;              
  123. (defun thisdrawing ()
  124.     (vlax-get-property (vlax-get-acad-object) 'activedocument)
  125. )
  126. (defun catch-error (catch:Protected catch:OnError / catch:err)
  127.   (setq catch:err (vl-catch-all-apply catch:Protected))
  128.   (if (and (vl-catch-all-error-p catch:err) catch:OnError)
  129.     (Apply catch:OnError (list (vl-catch-all-error-message catch:err)))
  130.     catch:err
  131.   ) ;_ end of if
  132. ) ;_ end of defun

  133. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  134. (defun DefaultOnError (s)        ;by Qiu Feng
  135.   (if
  136.     (not (member s '("Function cancelled" "console break" "quit / exit abort")))
  137.      (princ (strcat "\nError: " s))
  138.   )
  139.   (princ)
  140. )

  141. ;;;ChangeVars
  142. ;;;修改指定系统变量并返回其先前值
  143. ;;;参数
  144. ;;;一个包含要更改的系统变量和他们的新值的点对列表
  145. ;;;示例
  146. ;;;(setq ret (changevars '(("filedia" . 0)("cmdecho" . 0)("osmode" . 512))))
  147. ;;;注意
  148. ;;;CHANGEVARS 返回一个包含所有指定的系统变量和他们先前值的列表。要恢复他们,可简单地将该返回的列表提供给CHANGEVARS 函数。
  149. (defun changevars (lst)
  150.   (mapcar '(lambda (x / tmp var)
  151.          (setq tmp (cons (car x)
  152.                  (if (= (type (setq var (getvar (car x)))) 'list)
  153.                    (list var)
  154.                    var
  155.                  )
  156.                )
  157.          ) ;_ end of setq
  158.          (setvar (car x)
  159.              (if (= (type (cdr x)) 'list)
  160.                (cadr x)
  161.                (cdr x)
  162.              )
  163.          )
  164.          tmp
  165.        ) ;_ end of lambda
  166.       lst
  167.   ) ;_ end of mapcar
  168. ) ;_ end of defun
  169. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  170. ;;;
  171. ;;;  Error routine.
  172. ;;;
  173. (defun ai_error    (s)            ; If an error (such as CTRL-C) occurs
  174.   (if (not (member s '("Function cancelled" "console break")))
  175.     (princ (strcat "\nError: " s))
  176.   )
  177.   (vla-endundomark (thisdrawing))            ; Deal with UNDO
  178.   (if old_error
  179.     (setq *error* old_error)
  180.   )                    ; Restore old *error* handler
  181.   (if old_cmd
  182.     (setvar "cmdecho" old_cmd)
  183.   )                    ; Restore cmdecho value
  184.   (princ)
  185. )


  186. ;;; ====================================================================
  187. ;;; 出错处理包装函数: ErrorWrap
  188. ;;; 用法: (ErrorWrap MainFunction SysVariableListToProtect ErrorHandle)
  189. ;;; 例如: (ErrorWrap 'mymain '("osmode" "clayer" "highlight") 'myhandle)
  190. ;;; 如果没有给出errorhandle, 则用一个默认的处理程序代替
  191. ;;; 完整示例:
  192. ;;; (defun c:testErrorWrap ()
  193. ;;;   (ErrorWrap
  194. ;;;     '(lambda (/ pt1 pt2 pt3)        ; main program function
  195. ;;;        (setvar "osmode" 0)
  196. ;;;        (setvar "orthomode" 0)
  197. ;;;        (setq pt1 (getpoint "specify point 1:"))
  198. ;;;        (setq pt2 (getpoint pt1 "specify point 2:"))
  199. ;;;        (setq pt3 (getpoint pt2 "specify point 3:"))
  200. ;;;        (command "_line" pt1 pt2 pt3 "close")
  201. ;;;      )
  202. ;;;     '("osmode" "orthomode")        ; system variable to protect
  203. ;;;     '(lambda (s)            ; error handle, nil for default
  204. ;;;        (alert (strcat "错误:" s))
  205. ;;;      )
  206. ;;;   )
  207. ;;; )
  208. ;;; 默认的出错处理函数为
  209. ;;; (defun DefaultOnError (s)
  210. ;;;   (if
  211. ;;;     (not (member s
  212. ;;;          '("Function cancelled"
  213. ;;;            "console break"
  214. ;;;            "quit / exit abort"
  215. ;;;           )
  216. ;;;      )
  217. ;;;     )
  218. ;;;      (princ (strcat "\nError: " s))
  219. ;;;   )
  220. ;;;   (princ)
  221. ;;; )
  222. ;;; 说明:此函数在 Visual LISP 的下运行
  223. ;;; 作者:秋枫,19-Sep-02
  224. ;;; ====================================================================
  225. (defun ErrorWrap (EW:Main    EW:SysVarList EW:OnError    /
  226.           undo_on    undo_off      undo_push        undo_pop
  227.           undo_setting    undo_init     catch-error   DefaultOnError
  228.           modes        moder          mlst        old_cmd
  229.          )
  230.   
  231.   (defun catch-error (catch:Protected catch:OnError / catch:err)
  232.     (setq catch:err (vl-catch-all-apply catch:Protected))
  233.     (if    (and (vl-catch-all-error-p catch:err) catch:OnError)
  234.       (Apply catch:OnError (list (vl-catch-all-error-message catch:err)))
  235.       catch:err
  236.     ) ;_ end of if
  237.   ) ;_ end of defun

  238.   (defun DefaultOnError    (s)        ;by Qiu Feng
  239.     (if
  240.       (not (member s '("Function cancelled" "console break" "quit / exit abort"))
  241.       )
  242.        (princ (strcat "\nError: " s))
  243.     )
  244.     (princ)
  245.   )

  246.   (defun modes (a)
  247.     (setq MLST nil)
  248.     (repeat (length a)
  249.       (setq MLST (append MLST (list (list (car a) (getvar (car a))))))
  250.       (setq a (cdr a))
  251.     )
  252.   )

  253.   (defun moder ()
  254.     (repeat (length MLST)
  255.       (setvar (caar MLST) (cadar MLST))
  256.       (setq MLST (cdr MLST))
  257.     )
  258.   )

  259.   ;; ErrorWrap Main
  260.   ;; ====================================
  261.   (setq old_cmd (getvar "cmdecho"))
  262.   (setvar "cmdecho" 0)
  263.   (modes EW:SysVarList)
  264.   (vla-startundomark (thisdrawing))
  265.   (setvar "cmdecho" old_cmd)
  266.   (if EW:OnError
  267.     (catch-error EW:Main EW:OnError)
  268.     (catch-error EW:Main 'DefaultOnError)
  269.   )
  270.   (setvar "cmdecho" 0)
  271.   (vla-endundomark (thisdrawing))
  272.   (moder)
  273.   (setvar "cmdecho" old_cmd)
  274.   (princ)
  275.   ;; ====================================
  276. )


评分

参与人数 1D豆 +5 贡献 +1 收起 理由
xshrimp + 5 + 1

查看全部评分

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

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-7-20 09:12:10 | 显示全部楼层
总之,我觉得搞得很复杂,尽管错误处理是必要的。
我是在自定义函数内部,重新定义(defun *error* () ...),这样很简单,可否?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-20 09:34:23 来自手机 | 显示全部楼层
/db_自贡黄明儒_ 发表于 17&nbsp;分钟前
总之,我觉得搞得很复杂,尽管错误处理是必要的。
我是在自定义函数内部,重新定义(defun *error* () ...),这样很简单,可否?

catch的优点是其包裹的语句即使内部出现错误或中断仍旧执行后面的语句,这样对程序结构就可以简单化来自: Android客户端

点评

为什么函数ErrorWrap定义有那么多局部变量?  详情 回复 发表于 2013-7-20 13:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-7-20 13:29:34 | 显示全部楼层
Free-Lancer 发表于 2013-7-20 09:34
catch的优点是其包裹的语句即使内部出现错误或中断仍旧执行后面的语句,这样对程序结构就可以简单化

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-7-20 15:17:37 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2013-7-20 15:18 编辑

eachy一锅端上来,看起来费劲
  1. ;; ====================================================出错处理包装函数
  2. ;; 出错处理包装函数: ErrorWrap
  3. ;; 用法: (ErrorWrap MainFunction SysVariableListToProtect ErrorHandle)
  4. ;; 例如: (ErrorWrap 'mymain '("osmode" "clayer" "highlight") 'myhandle)
  5. ;; 如果没有给出errorhandle, 则用一个默认的处理程序代替
  6. ;; 完整示例:
  7. ;|(defun c:w1 ()
  8.   (ErrorWrap
  9.     '(lambda (/ pt1 pt2 pt3)                          ; main program function
  10.        (setvar "osmode" 0)
  11.        (setvar "orthomode" 0)
  12.        (setq pt1 (getpoint "specify point 1:"))
  13.        (setq pt2 (getpoint pt1 "specify point 2:"))
  14.        (setq pt3 (getpoint pt2 "specify point 3:"))
  15.        (command "_line" pt1 pt2 pt3 "close")
  16.      )
  17.     '("osmode" "orthomode")                          ; 保护的系统变量
  18.     '(lambda (s)                                  ; error handle, nil for default
  19.        (alert (strcat "错误:" s))
  20.      )
  21.   )
  22. )|;

  23. (defun ErrorWrap (EW:Main EW:SysVarList        EW:OnError / *DOC* OLD_CMD SYSVARLIST)
  24.   ;;1 (catch-error 不带参数的函数 出错处理函数)
  25.   (defun catch-error (catch:Protected catch:OnError / catch:err)
  26.     (setq catch:err (vl-catch-all-apply catch:Protected))
  27.     (if        (and (vl-catch-all-error-p catch:err) catch:OnError)
  28.       (Apply catch:OnError
  29.              (list (vl-catch-all-error-message catch:err))
  30.       )
  31.       catch:err
  32.     )
  33.   )
  34.   ;;2 默认的出错处理函数为
  35.   (defun DefaultOnError        (s)                          ;by Qiu Feng
  36.     (if
  37.       (not
  38.         (member        s
  39.                 '("Function cancelled" "console break" "quit / exit abort")
  40.         )
  41.       )
  42.        (princ (strcat "\nError: " s))
  43.     )
  44.     (princ)
  45.   )
  46.   ;;3 a为函数EW:Main中改变了的变量列表,如'("osmode" "orthomode"),返回(("osmode" 6311) ("orthomode" 0))
  47.   (defun modes (a / MLST)
  48.     (repeat (length a)
  49.       (setq MLST (append MLST (list (list (car a) (getvar (car a))))))
  50.       (setq a (cdr a))
  51.     )
  52.   )
  53.   ;;4 根据变量列表,恢复变量
  54.   (defun moder (MLST)
  55.     (repeat (length MLST)
  56.       (setvar (caar MLST) (cadar MLST))
  57.       (setq MLST (cdr MLST))
  58.     )
  59.   )
  60.   ;;5 (setq ret (changevars '(("filedia" . 0)("cmdecho" . 0)("osmode" . 512))))
  61.   ;;返回一个包含所有指定的系统变量和他们先前值的列表。要恢复他们,可简单地将该返回的列表提供给CHANGEVARS 函数
  62.   (defun changevars (lst / TMP VAR X)
  63.     (mapcar '(lambda (x / tmp var)
  64.                (setq tmp (cons (car x)
  65.                                (if (= (type (setq var (getvar (car x)))) 'list)
  66.                                  (list var)
  67.                                  var
  68.                                )
  69.                          )
  70.                )
  71.                (setvar (car x)
  72.                        (if (= (type (cdr x)) 'list)
  73.                          (cadr x)
  74.                          (cdr x)
  75.                        )
  76.                )
  77.                tmp
  78.              )
  79.             lst
  80.     )
  81.   )
  82.   ;;6 本程序主函数
  83.   (vl-load-com)
  84.   (setq *doc* (vlax-get-property (vlax-get-acad-object) 'activedocument))
  85.   (setq old_cmd (getvar "cmdecho"))
  86.   (setvar "cmdecho" 0)
  87.   (setq SysVarList (modes EW:SysVarList))
  88.   (vla-startundomark *doc*)
  89.   (setvar "cmdecho" old_cmd)
  90.   (if EW:OnError
  91.     (catch-error EW:Main EW:OnError)
  92.     (catch-error EW:Main 'DefaultOnError)
  93.   )
  94.   (setvar "cmdecho" 0)
  95.   (vla-endundomark *doc*)
  96.   (moder SysVarList)
  97.   (setvar "cmdecho" old_cmd)
  98.   (princ)
  99. )
  100. ;; ====================================================出错处理包装函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-20 22:12:28 | 显示全部楼层
秋枫写的?!  代码一多久头疼!

点评

这个用法前面有过多个帖子用这种方法,现在更习惯简化的  详情 回复 发表于 2013-7-20 22:32
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-7-20 22:32:39 | 显示全部楼层
wowan1314 发表于 2013-7-20 22:12
秋枫写的?!  代码一多久头疼!

这个用法前面有过多个帖子用这种方法,现在更习惯简化的
[pcode=lisp,true]
(defun c:tt (/ oldos activedocument);_主程序的局部变量在 lambda 处定义
   (setq oldos (getvar "osmode"));_后面程序中要用到的系统先行保存
   (setq activedocument (vla-get-activedocument (vlax-get-acad-object)))
   (vl-startundomark activedocument);_ Undo begin
   (vl-catch-all-apply (function (lambda (/ ...)  ....));_主程序部分,要设置的变量在内部根据需要设置,用 Funciton可以在 Lambda 内部设置断点方便调试
   (vla-endundomark activedocument);_Undo end
   (vlax-release-object activedocument)
   (setvar "osmode" oldos);_恢复系统变量
   (princ)
)[/pcode]

点评

嗯。自用的错误处理现在都成套路了。我直接用了caoyin写的。没仔细看。估计跟这种差不多。  发表于 2013-7-20 23:12
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-20 22:50:53 | 显示全部楼层
错误机制的处理也是LISP和C++和.NET程序相比的一个重要的缺陷,要是将ON ERROR GO的功能实现在LISP就好了

点评

vl-catch-all-apply不是可以捕捉错误然后继续吗?!  详情 回复 发表于 2013-7-20 23:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-20 23:10:22 | 显示全部楼层
snsj 发表于 2013-7-20 22:50
错误机制的处理也是LISP和C++和.NET程序相比的一个重要的缺陷,要是将ON ERROR GO的功能实现在LISP就好了

vl-catch-all-apply不是可以捕捉错误然后继续吗?!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-20 23:42:12 | 显示全部楼层
本帖最后由 snsj 于 2013-7-20 23:55 编辑

当按ESC时,LISP会中断程序,C++和.NET可以跳转GO TO到程序的下个地方继续运行程序,可以把烂摊子收拾干净再走,比如用PLINE画一根线,当用户按取消退出程序时候想把这个线删了,LISP就需要重新定义错误函数去处理这个事情(错误函数写多了也容易乱),VBA或.NET只需要跳出来,把这个线删除了再退出程序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2212个

财富等级: 金玉满堂

发表于 2013-7-21 02:11:16 | 显示全部楼层
下载下来,慢慢研究,太多了,我的水平一下子看不懂。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 10:35 , Processed in 0.274957 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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