明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1713|回复: 4

大家帮忙看看,哪里错了?

[复制链接]
发表于 2005-3-14 13:25:00 | 显示全部楼层 |阅读模式
基础教程中的例题如下:
这是一个较为复杂的对话框设计,但亦是一个非常实用的程序。在对话框定义文件中,有一个清单选框,会显示出指定档案的内容(全是中文字)。当使用者选取清单中的项目时,该项目的中文字便会显示在下面的编辑框里(加在原有字符串的后面),当按下确定钮时,对话框结束,并使用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 CBOX () (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 " " 两天了,找不出是哪里错了。 请各位指教。
发表于 2005-3-14 14:33:00 | 显示全部楼层
看上面的过程说明这么详细,想必是一个做事很缜密的人,不过这样的错误找了两天找不出来,不应该啊 1. (WHILE (/= TMP_T NIL)
(SETQ TMP_L (APPEND TMP_L (LIST TMP_T)))
(SETQ TMP_L (READ-LINE F_ID))
) 仔细考虑一下循环过程,看看哪个变量写错了。。。 2.DCL中: :edit_box //编辑框组件
{ label="中文字" ;
key="LOBX_E" ; LISP中: (SETQ TMP_S (GET_TILE "LBOX_E")) 总有一个地方是错了吧。。。 3. (COMMAND "TEXT"
(GETPOINT \ "Select text insert point :")
"0"
TMP_S
) 仔细看看GETPOINT函数的用法,中间那个斜杆是不小心写的?应该能查出来吧,,仔细看看TEXT命令的过程,你没有字高输入部分,也就是说的当前的文本类型的字高必须不是0才行 修改完这几处后,程序能正确运行,并没有出现你说的那个错误
 楼主| 发表于 2005-3-15 09:02:00 | 显示全部楼层
本帖最后由 作者 于 2005-3-15 9:49:49 编辑

谢谢meflying!在你的指点下,终于找到了错误。 检查错误时应采用什么步骤呢?请介绍经验。
发表于 2005-3-15 18:44:00 | 显示全部楼层
高,越来越佩服fly版了。不介意顶你一下吧? ;)
发表于 2005-3-15 19:04:00 | 显示全部楼层
lixiaochun发表于2005-3-15 9:02:00谢谢meflying!在你的指点下,终于找到了错误。 检查错误时应采用什么步骤呢?请介绍经验。
看错误提示,觉得这个错误会出现在哪些地方,然后再去程序中找,这需要慢慢积累经验。 再就是利用VLISP编辑器的断点跟踪功能(怎么用看帮助),一般很容易就能查出问题所在
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 13:31 , Processed in 0.172164 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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