乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 65|回复: 15

[编程交流] 有自己的想法

[复制链接]

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 14:36:45 | 显示全部楼层 |阅读模式
大家好。
 
我试图向命令行发送一个提示(很简单),然后用户可以在命令行中键入内容并向程序的其余部分发送命令。通常,要实现这一点,需要使用(getwhatever)函数。我认为这不能用在这种情况下。
 
这是我的代码:
 
如您所见,当用户键入“a”(目前是小写字母..稍后会更改)时终止的while循环将重复更新,无论用户输入或缺少输入。当用户键入除“a”之外的任何字母时,字符串将被追加,如果用户点击“backspace”,字符串将被删除一个字符。使用这个概念,我可以在程序运行时获得任何类型的用户输入,而无需暂停。这是我的目标。
 
我就快到了,但如果你运行代码,你会发现(记住,键入“a”取消它,或者只是混合ESC)我被卡住了。我可以添加到文本字符串中,也可以删除信息,但提示拒绝更改,我不知道为什么。
 
我知道我的整个问题可能还有其他解决方案,但我想找出这个解决方案,如果只是为了满足我的好奇心的话。
 
非常感谢您抽出时间^
 
编辑:哦,如果你用(princ(strcat“\n”meuStr))替换(displayMenu meuStr)行,你会确切地看到我的意思,尽管它会将它粘贴到新行。我可以正确编辑字符串;我的代码就是这样做的。它的展示似乎给了我一个问题。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:43:01 | 显示全部楼层
我相信您的问题是因为打印退格“\ 010”不会删除文本,而只是将光标位置移到左侧:
 
我稍微修改了一下,但没有修改太多:
 
  1. (defun c:menumsg (/ data)
  2. (prompt (setq meuStr "Enter option (Abort/Retry/Cheerios): "))
  3. (while (not (and (eq 2 (car (setq data (grread nil 13 1))))
  4.                   (member (cadr data) '(97 65))))
  5.    (cond
  6.      ((and (= (car data) 2) (= (cadr data) )
  7.       (setq meuStr (substr meuStr 1 (1- (strlen meuStr)))))
  8.      ((= (car data) 2)
  9.       (setq meuStr (strcat meuStr (chr (cadr data))))))
  10.    (displayMenu meuStr))
  11. (princ))
  12. (defun displayMenu (string / strDel)
  13. (setq strDel "")
  14. (repeat (1+ (strlen string)) (setq strDel (strcat strDel "\010")))
  15. (prompt (strcat strDel string))
  16. (princ))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:45:12 | 显示全部楼层
这个怎么样:
 
  1. (defun c:menumsg  (/ data Str)
  2. (princ "Enter option (Abort/Retry/Cheerios): \n")
  3. (setq Str "")
  4. (while (not (and (eq 2 (car (setq data (grread nil 13 1))))
  5.                   (member (cadr data) '(97 65))))
  6.    (cond
  7.      ((and (= (car data) 2) (= (cadr data) 13))
  8.       (princ "\n")
  9.       (setq Str (strcat Str "\n")))
  10.      ((= (car data) 2)
  11.       (princ (chr (cadr data)))
  12.       (setq Str (strcat Str (chr (cadr data)))))))
  13. (princ))
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 14:50:44 | 显示全部楼层
李,似乎还是不行。您的操作与我的操作相同:字符串本身确实已修改,但显示它似乎是一个问题;退格按原样删除字符串上的最后一个字符,但命令行上的显示不变。至少对我来说不是这样。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:52:53 | 显示全部楼层
在我的最新版本中,整个连接的字符串存储为变量,稍后可以使用,但单个字符打印到命令行。
 
至于退格——正如我在前面的帖子中所说,退格不会在字符打印到命令行后删除字符,而只是将光标位置向左移动。
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 14:57:31 | 显示全部楼层
啊,我现在明白了。。我测试了它:
 
  1. (princ (strcat "hello" "\010" "\010" "hi"))(princ)

返回的
 
  1. helhi
  1. helho
。似乎它只是覆盖了已经存在的内容。
 
那么,有没有办法删除命令行上显示的内容?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:04:09 | 显示全部楼层
试一试:
 
  1. 7
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:06:55 | 显示全部楼层
我不知道这有什么用在“getstring”上,但是。。。
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 15:10:39 | 显示全部楼层
快到了,李。。你让我想起了一些非常基本的事情,我觉得自己像个忘记的白痴。再一次,你是一个灵感。给我一分钟!:3.
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:15:59 | 显示全部楼层
 
我感到荣幸
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 00:03 , Processed in 0.473845 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表