找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 536|回复: 3

[求助] [求助]:大家帮忙看看是哪里错了。

[复制链接]
发表于 2005-3-14 16:16:45 | 显示全部楼层 |阅读模式

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

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

×
以下是Autolisp、对话框基础中的例题。

这是一个较为复杂的对话框设计,但亦是一个非常实用的程序。在对话框定义文件中,有一个清单选框,会显示出指定档案的内容(全是中文字)。当使用者选取清单中的项目时,该项目的中文字便会显示在下面的编辑框里(加在原有字符串的后面),当按下确定钮时,对话框结束,并使用TEXT指令将编辑框内的文字插入至绘图屏幕上。

注意:程序另须建立一纯文字文件(名称为TEXT1.TXT,存于C盘根目录),其内容可自订一些常用的中文字,每行文字不宜过长。而每行文字即成为选框中的一个项目。在插入中文字之前,必须先行设定中文字的样式。
***********************
我建的TEXT1.TXT

1技术要求
2木材
3热处理
4看看
5理科
6命令
7进化
***********************

建立新的对话框定义档LBOX.DCL,存于C盘的根目录中,其定义如下:

LBOX:dialog  
{  label="Create chinese" ;  
:list_box  //清单选框组件  
{  label="中文字" ;  
  key="LBOX_L" ;  
  width=25;  
  height=8;  
  fixed_width=true;  
  fixed_height=true;  
}  
:edit_box  //编辑框组件  
{  label="中文字" ;  
  key="LOBX_E" ;  
  width=25;  
  fixed_width=true;  
}  
ok_cancel ;  
}


定义说明:
1  定义对话框名称为LBOX,以冒号开始设定dialog组件。
2  开大括号属于上一行的dialog组件,属性label的设定值会显示在对话框的标题列。
3  以冒号开始,设定一个清单选框list_box组件。
4  开大括号属于上一行的清单选框组件,其属性label的设定值会显示在选框的左上角。
5  以key属性设定清单选框组件的操作关键词为LBOX_L。
6,7  设定清单选框组件的宽度(属性width)及高度(属性height)。
8,9  设定清单选框组件以固定的宽度(属性fixed_width)及固定的高度(属性fixed_height)显示。
10  关大括号是对应第4行的开大括号,此对大括号同属于第3行的清单选框组件。
11  以冒号开始,设定一个编辑框组件。
12  开大括号属于上一行的编辑框组件,属性label的设定值会显示在编辑框的左边。
13  以key属性设定编辑框组件的操作关键词为LBOX_E。
14  以width属性设定编辑框组件的宽度。
15  将fixed_width属性设定为true,使编辑框以固定的宽度显示。
16  关大括号是对应第12行的开大括号,此对大括号同属于第11行的编辑框组件。
17  在对话框的底部设定一确定钮及取消钮,以结束对话框。
18  关大括号是对应第2行的开大括号,此对大括号同属于第1行的dialog组件。

建立新的程序文件LBOX.LSP,存于C盘的根目录中,其中包含一个主程序和两个辅助程序.主程序的程序代码如下:

(DEFUN C:LBOX ()     (SETQ DCL_ID (LOAD_DIALOG "C:/LBOX.DCL") CHK 0)
(NEW_DIALOG "LBOX" DCL_ID)
(ADDL)
(ACTION_TILE "LBOX_L" "(SETQ TMP_R (ATOI (GET_TILE \"LBOX_L\")))(SETC)")
(ACTION_TILE "accept" "(SETQ CHK 1
   TMP_S (GET_TILE \"LBOX_E\"))(DONE_DIALOG)")
(START_DIALOG) (UNLOAD_DIALOG DCL_ID)
(IF (= CHK 1)
   (COMMAND "TEXT" (GETPOINT \"Select text insert point :") "0" TMP_S)
)
(PRINC))

主程序(LBOX)说明:
1  用DEFUN函数设定程序名称为LOBX,用LOAD_DIALOG函数加载指定的对话框定义档,并将返回的档案处理码存入变量DCL_ID。设定另一变量CHK为0,此变量用于决定使用者是否按下确定钮。
2  用NEW_DIALOG函数,显示指定档案(变量DCL_ID储存定义文件的处理码)里的LBOX对话框。
3  执行ADDL辅助程序(作用是开启并读取档案中的各行字符串,并加进清单选框中)。
4  用ACTION_TILE函数,设定选取清单选框组件(关键词LBOX_L)中项目的指定动作。先以GET_TILE函数取得清单中的选项之索引号(字符串型),用ATOI函数转为整数型,再用SETQ函数存入变量TMP_R,最后执行SETC辅助程序(取得档案中对应行号的字符串,并显示在编辑框中)。
5  用ACTION_TILE函数,设定关键词"accept"的组件(预设为确定钮)的动作。先用SETQ函数,设定变量CHK为1(在结束对话框后建立文字)。
6  为第5行ACTION_TILE函数的延续,用GET_TILE函数取得编辑框(关键词LBOX_E)的内容,存入变量TMP_S,再以DONE_DIALOG函数结束对话框。
7  用START_DIALOG函数启动对话框并开始接受使用者输入,以UNLOAD_DIALOG函数结束对话框并释放内存。
8  用IF函数检查变量CHK是否等于1(使用者按下确定钮,在第5行设定),若变量等于1,执行下一行的指令。
9  用COMMAND函数,执行TEXT指令其插入点以GETPOINT函数取得。文字的角度为0,字符串为变量TMP_S(在第6行的确定按钮动作中取得)。
10  关括号是关闭第8行的IF函数。
11  以一个不带参数的PRINC函数,抑制多余的返回值及显示;最右边的关括号,是对应第1行DEFUN函数左边的开括号。

辅助程序ADDL的程序代码如下:

(DEFUN ADDL()  (SETQ F_ID (OPEN "C:/TEXT1.TXT" "r"))  
(SETQ TMP_T (READ-LINE F_ID) TMP_L (LIST ""))  
(WHILE (/= TMP_T NIL)  
    (SETQ TMP_L (APPEND TMP_L (LIST TMP_T)))  
  (SETQ TMP_L (READ-LINE F_ID))  
)  
(CLOSE F_ID)  
(SETQ TMP_L (LIST (CDR TMP_L)))  
(START_LIST "LBOX_L" 3 0)  
(MAPCAR 'ADD_LIST (CAR TMP_L))  
(END_LIST))

辅助程序(ADDL)说明:
1  用DEFUN函数设定程序名称为ADDL。用OPEN函数开启指定的纯文字文件,开启模式为"r"(读取),将返回的档案处理码,用SETQ函数存入变量F_ID。
2  用READ-LINE函数读取档案(变量F_ID储存的档案处理码)里,第1行的字符串,存入变量TMP_T,再将一空的串行,存入变数TMP_L。
3  以WHILE函数设定循环的开始,进入循环的条件为变量TMP_T(从档案中读取的字符串)不等于NIL(空值)。
4  将变量TMP_T(字符串),用APPEND函数,加在第2行所建立的空串行之后,将新串行存回变量TMP_L中,即以新串行(巳增加新的字符串元素)覆盖原有串行。
5  使用READ-LINE函数,从档案中(变量F_ID)读取下一行的字符串,存入变量TMP_T中并覆盖原值。
6  关括号是对应第3行WHILE函数左边的开括号,以封闭循环;循环会不断执行,直至读取档案中所有字符串,并将巳读取的字符串不断加进变量TMP_L的串行中。
7  用CLOSE函数,将指定档案处理码(变量F_ID)的档案关闭。
8  用CDR函数,删去串行(变量TMP_L)中第一个元素(空字符串),并将余下的元素存回变量TMP_L覆盖原值。
9  用START_LIST函数开始处理指定选框组件(关键词LBOX_L)。选项参数3表示删除旧选框中的项目并建立新的选框项目,最后的项目索引值为0,表示选框中第一个项目。
10  使用MAPCAR函数,使串行(变量TMP_L)中逐个元素,代入ADD_LIST函数中,作为项目加入选框中。
11  以END_LIST函数结束清单选框组件的处理,最右边的关括号是对应第1行DEFUN函数左边的开括号。

辅助程序SETC的程序代码如下:

(DEFUN SETC()  (SETQ F_ID (OPEN "C:/TEXT1.TXT" "r"))  
(IF (> TMP_R 0)  
        (REPEAT TMP_R (READ-LINE F_ID)))  
(SETQ TMP_S (GET_TILE "LBOX_E"))  
(SETQ TMP_S (STRCAT TMP_S (READ-LINE F_ID)))  
(CLOSE F_ID)  
(SET_TILE "LBOX_E" TMP_S))

辅助程序(SETC)说明:
1  用DEFUN函数设定程序名称为SETC,用OPEN函数开启指定的纯文字文件,开启模式为"r"(读取),将返回的档案处理码,用SETQ函数存入变量F_ID。
2  用IF函数检查变量TMP_R是否大于0,若是(表示不是选取了第一个项目)则执行第3行的叙述。注意,变量TMP_R是在主程序第4行中取得的选框索引值,该值表示选取了选框中第几个项目,项目索引号0表示第一个项目,其它依次递增。
3  用REPEAT函数,使其后的READ-LINE函数重复执行TMP_R次,直至读取字符串至所选项目的对上一行(因为项目索引号从0开始,例如选取第5个项目,REPEAT函数便会重复5次,读取档案中0至4行的字符串)。
4  使用GET_TILE函数,取得编辑框组件(关键词LBOX_E)目前的内容,存入变量TMP_S。
5  使用READ-LINE函数,读取档案中的字符串(在第3行中,巳使用REPEAT函数,读取至所选项目的对上一行,再使用此函数读取下一行时,即为所选的项目),并用STRCAT函数与变量TMP_S(在上一行中取得的编辑框内容)合拼为新字符串,存回变量TMP_S中并覆盖原字符串。
6  使用CLOSE函数,将指定的档案(变量F_ID为该档案的处理码)关闭。
7  使用SET_TILE函数,更新编辑框(关键词LBOX_E)的内容为新合拼的字符串(在第5行中取得),最右边的关括号是对应第1行DEFUN函数左的开括号。


执行后,产生错误
; 错误: 参数类型错误: listp " "

请介绍查错的方法。
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-3-15 11:22:47 | 显示全部楼层
辅助程序ADDL中(SETQ TMP_L (READ-LINE F_ID)) 错误码,应该为(SETQ TMP_T(READ-LINE F_ID))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-15 12:45:37 | 显示全部楼层
楼主的思路不错。
做这类程序,不如在用VBA做,界面可以轻松实现,并且看起来非常专业;数据文件最好不要用TXT文件,改用数据库比较好一些;程序应增加数据入库功能。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-16 00:56:13 | 显示全部楼层
lijiao说的好,
可是怎么我该如何把已编好的LISP程序和VBA宏很好地结合起来呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 00:36 , Processed in 0.167955 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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