Ramana 发表于 2022-7-6 08:09:01

使用dcl和lisp的计算器

朋友们好,
 
问候语,
 
我正在尝试基本计算器的DCL编程。我为所有数字和函数定义了按钮。我能够在编辑框中显示一个数字,如何控制所有选中按钮的显示,直到我按下任何功能按钮。
 
请给我一个基本的想法继续与lisp程序
 
提前感谢
 
拉马纳

BlackBox 发表于 2022-7-6 08:20:45

你这样做只是为了做吗?
 
我只是问,因为AutoCAD已经包含了一个很好的计算器。。。使用Ctrl+8切换视图。

Lt Dan's l 发表于 2022-7-6 08:34:23

另一种方式
(startapp "calc")

Dadgad 发表于 2022-7-6 08:39:40

 
或者你可以在右键快捷菜单的底部找到它。如果您将其展开以查看整个内容,您可以在那里设置并保存自己的常量或基于函数的变量和自定义,以及各种快速预设转换。

MSasu 发表于 2022-7-6 08:49:03

为了解决您的DCL问题,恐怕无法确定用户在填写编辑框时是否输入了运算符(+、-、*或/)。这是因为DCL没有关键事件;唯一的事件是当用户移动到其他互动程序时发生的ACTION_互动程序。因此,您只需要依靠按钮来输入运算符。
 
当做
米尔恰

MSasu 发表于 2022-7-6 08:53:51

仔细考虑一下,我会说有一个解决方案-当用户在编辑框中输入时按下,也会触发ACTION\u TILE事件;因此,如果指示用户在操作数键后按,则可以读取互动程序的内容,保留最后一个字符(如果是可接受的操作数,则验证它,如果不是),作为使用中的函数,并将互动程序清理到下一个输入。但是,如果用户忘记在操作数后按,事情就会变得复杂。
 
当做
米尔恰

BlackBox 发表于 2022-7-6 09:08:47

我知道如何在LISP中成功监视击键的唯一方法是为自己编写一个。NET LispFunction方法,该方法使用该系统。窗户。为按键或按键事件形成命名空间以返回键枚举。

pBe 发表于 2022-7-6 09:13:16

然而,你可以使用slide_图像作为按钮,一年前我试图创建一个DCL计算器只是为了好玩。我放弃了这个想法,因为我无法绕过所有这些算术函数,尤其是“除法”
 
附件是我失败的尝试,也许你会有更好的运气。
 

 
(defun c:calD ( / _operand _values curV STotal nums)
(vl-load-com)      
(defun _operand (lst sym/ a)
   (set_tile "Total"
   (setq a (if (>= (length lst) 2)
          (rtos (eval (cons (eval (read sym)) (mapcar 'atof lst))) 2)
         (car lst))))
      a
   )
(defun _values(var str)
   (setq var (strcat var
                     (if (and (wcmatch var "*.*")
               (eq str "."))"" str)))
   )      
(setq curV "" STotal "" nums nil)
(setq Dcl_sm (load_dialog "CALCD.DCL"))
(new_dialog "Numbers" Dcl_sm)
      (set_tile "Title" " pBe Calculator")
(start_image "Title")
(foreach slnm (setq vls '("1" "2" "3" "4" "5" "6" "7"
                  "8" "9" "0" "iplus" "iminus" "idivide"
                  "iequal" "imultiply" "idot" "iCan"))
(setq _X (dimx_tile slnm))
(setq _Y (- (dimy_tile slnm) 2))(end_image)
(start_image slnm)(slide_image 1 1 _X _Y slnm)

)(end_image)
(foreach dgt '("1" "2" "3" "4" "5" "6" "7" "8" "9" "0" )
      (action_tile dgt
(vl-prin1-to-string
         (quote (progn
                        (setq curV (_values curv $key))
                        (set_tile "Total" curV)))))
)   
(action_tile "idot"
   "(setq curV (_values curV \".\"))
(set_tile \"Total\" curV)")
(action_tile "iminus"
   "(setq nums (cons curV nums))
      (setq STotal (_operandnums(setq sy \"-\")) curV \"\") ")
(action_tile "imultiply"
   "(setq nums (cons curV nums))
      (setq STotal (_operandnums (setq sy \"*\")) curV \"\") ")   
(action_tile "iplus"
   "(setq nums (cons curV nums))
      (setq STotal (_operandnums(setq sy \"+\")) curV \"\") ")      
(action_tile "iequal"
   "(set_tile \"T\" (setq STotal (_operand(cons curV nums) sy)))(setq curV \"\" nums nil)")
(action_tile "iCan" "(setq curV \"\" nums nil)(set_tile \"Total\" \"\") ")      
(action_tile "accept" "(done_dialog 1)")
(start_dialog)
(unload_dialog Dcl_sm)
STotal
)


 
由于某些原因,您必须将自己的幻灯片装入板条箱,因为它不接受将其作为附件
 
HTH公司
计算。DCL
页: [1]
查看完整版本: 使用dcl和lisp的计算器