明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 515|回复: 9

[提问] 对话框如何聚焦在第一个框里面

[复制链接]
发表于 2022-7-23 16:11 | 显示全部楼层 |阅读模式
25明经币
本帖最后由 世人皆醉 于 2022-7-24 22:47 编辑


圆管一键展开:dialog{ //定义名字为圆管一键展开的对话框
label= "圆管一键展开";//显示在对话框顶部的标签
:row{ //引用行
:edit_box{ //引用编辑框1
      label="圆的直径为(mm):"; //编辑框1的标签
      edit_width=8; //编辑框1的宽度
      key="d1";//编辑框1的关键字
      mnemonic="d1";//编辑框1的热键
             }}//编辑框1引用结束
:row{
:edit_box{ //引用编辑框2
      label="圆的长度为(mm):"; //编辑框2的标签&之后的字符是热键
      width=8; //编辑框2的宽度
      key="d2";//编辑框2的关键字
             }//编辑框2引用结束
}//行引用结束
ok_cancel;// 引用ok_cancel组合控件
}

数据如上图所示,如何能使首次填写的位置由“确定”转到“圆的直径为”的对话框上
另外一个数据填写完成后,如何用enter键切换到下一个数据该如何设置,而不是tab键,这种效果能达到吗

最佳答案

查看完整内容

(defun c:c1(/ pt0 d3 p1 p2 p3 p4 p5 d4 p6 p7 d1s d2s) (vl-load-com) (setq cmd (getvar "cmdecho")) (setq osm (getvar "osmode")) (command "._undo" "_begin") (setvar "cmdecho"0) (setvar "osmode" 0) (setq Keys '("d1" "d2")) (setq ad1 548.5 ad2 3000) ;加载DCL对话框 (setq DcLwjm (make_YGZK_dcl)) ;生成DCL对话框 (setq dcl_id (load_dialog DcL ...
发表于 2022-7-23 16:11 | 显示全部楼层
(defun c:c1(/ pt0 d3 p1 p2 p3 p4 p5 d4 p6 p7 d1s d2s)
   (vl-load-com)
   (setq cmd (getvar "cmdecho"))
   (setq osm (getvar "osmode"))
  
   (command "._undo" "_begin")
   (setvar "cmdecho"0)
   (setvar "osmode" 0)

    (setq Keys '("d1" "d2"))
    (setq ad1 548.5 ad2 3000)
  
    ;加载DCL对话框
    (setq DcLwjm (make_YGZK_dcl))      ;生成DCL对话框
    (setq dcl_id (load_dialog DcLwjm)) ;加载DCL对话框

    ;激活DCL画面
    (if (not (new_dialog "圆管一键展开" dcl_id))
        (exit)
    )

    ;控件赋初值
    (mapcar '(lambda(Key Val) (set_tile Key Val))
             Keys
             (list (rtos ad1 2 2) (rtos ad2 2 2))
    )
    ;设置d1为焦点
    (mode_tile "d1" 2)

    ;控件相关操作
    (foreach Key Keys
        (action_tile Key "(set (read (strcat \"a\" $key)) (atof (get_tile $key)))
                          (cond ((= $key \"d1\") (mode_tile \"d2\" 2))
                                ((= $key \"d2\") (mode_tile \"accept\" 2))
                          )
                          "
        )
    )
  
    (action_tile "accept" "(done_dialog 1)")

    ;将控制权交给DCL
    (setq do_what (start_dialog))

    ;终止DCL: (done_dialog 0) (done_dialog 1)
    (cond ((= do_what 0)
              (princ "\n单击了取消按钮")
          )
          ((= do_what 1)
              (princ "\n单击了确定按钮")

              ;显示两编辑框中取得数值
              (princ "\n ad1=")(princ ad1)
              (princ "   ad2=")(princ ad2)
          
              ; 这里加入进行相应的处理部分
          )
    )

    (unload_dialog dcl_id)
    (vl-file-delete DCLwjm)
  
    (command "_undo" "e")
    (setvar "osmode" osm)
    (setvar "cmdecho" cmd)
    (princ)
  
)
; ;;=============   make_YGZK_dcl  ========================================================================================================
; ;;对话框生成并保存至临时文件
(defun make_YGZK_dcl (/ lst_str str file f)
  (setq lst_str
        (list
             "圆管一键展开:dialog { //定义名字为圆管一键展开的对话框"
             "     label= \"圆管一键展开\";//显示在对话框顶部的标签"
             "     :row{ //引用行"
             "           :edit_box{ //引用编辑框1"
             "               label=\"圆的直径为(mm):\"; //编辑框1的标签"
             "               edit_width=8; //编辑框1的宽度"
             "               key= \"d1\";//编辑框1的关键字"
             "               mnemonic = \"d1\";//编辑框1的热键"
             "            }} //编辑框1引用结束"
             "     :row{ "
             "           :edit_box{ //引用编辑框2"
             "           label = \"圆的长度为(mm):\"; //编辑框2的标签&之后的字符是热键"
             "           width=8; //编辑框2的宽度"
             "           key = \"d2\";//编辑框2的关键字"
             "           }//编辑框2引用结束"
             "     }//行引用结束"
             "     ok_cancel;// 引用ok_cancel组合控件"
             "}"
          )
  )
  (setq file (vl-filename-mktemp "DclTemp-YGZK.dcl"))
  (setq fff (open file "w"))
  (foreach str lst_str
      (write-line str fff)
  )
  (close fff)
  file
)
回复

使用道具 举报

 楼主| 发表于 2022-7-23 16:13 | 显示全部楼层


左边为现有调出的对话框
右边为我想要达到的对话框

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2022-7-23 16:49 | 显示全部楼层
默认聚焦2种方法
控件中is_default = true;
或者
lsp中(start_dialog)之前添加
(mode_tile k 2)(mode_tile k 3)
方法2优先级高于1

编辑框回车切换焦点
在lsp中定义控件动作
(action_tile k1 "(if ($reason = 1)(progn (mode_tile k2 2)(mode_tile k2 3)))")
注意k2中的"之前要加斜杠\
回复

使用道具 举报

 楼主| 发表于 2022-7-24 11:26 | 显示全部楼层
masterlong 发表于 2022-7-23 16:49
默认聚焦2种方法
控件中is_default = true;
或者

(defun c:c1(/ pt0 d3 p1 p2 p3 p4 p5 d4 p6 p7 d1s d2s)
   (command "._undo" "_begin")
  (setvar "cmdecho"0)
  (setvar "osmode" 0)
  (vl-load-com)


(defun getdata();定义getdata 函数,其功能是获取三个编辑框的最终数据
(setq ad1(atof(get_tile "d1")));获取编辑框的值,转换为实数后赋给变量
(setq d2(atof(get_tile "d2")));获取编辑框的值,转换为实数后赋给变量
)
  (setq sdt 0);设置状态参数sdt为0
  (setq id(load_dialog "D:\\插件\\DCL\\C1"));装入DCL文件,c1是对话框文件名
  (if (< id 0)(exit)) ;如果装入失败则退出
    (mode_tile k 2)(mode_tile k 3)
  (action_tile k1 "(if ($reason = 1)(progn (mode_tile k2 2)(mode_tile k2 3)))")
  (if(not ad1)
  (setq ad1 548.5 d2 3000))
  (if (not (new_dialog "圆管一键展开" id)) (exit));显示名字为yuan的对话框,如果失败则退出
    (set_tile "d1" (rtos ad1 2 2));设置编辑框d1初值
  (set_tile "d2" (rtos d2 2 2));设置编辑框d2初值
  (action_tile "accept" "(getdata) (done_dialog 1)");定义OK按钮的活动是执行getdata函数,然后以1为状态值关闭对话框
  (action_tile "cancel" "(done_dialog -1)");定义Cancel按钮时的活动是以-1为状态值关闭对话框
  
  (setq sdt(start_dialog));显示对话框,将得到关闭对话框时的状态值
  (unload_dialog id);卸载对话框文件
  
  (if (> sdt 0);判断关闭对话框时的状态值,即单击哪个按钮关闭的对话框
  (progn
大佬这是我的LISP函数,但是改了老是运行错误,能帮我看一下吗
回复

使用道具 举报

 楼主| 发表于 2022-7-24 16:55 | 显示全部楼层
yshf 发表于 2022-7-24 16:02
(defun c:c1(/ pt0 d3 p1 p2 p3 p4 p5 d4 p6 p7 d1s d2s)
   (vl-load-com)
   (setq cmd (getvar "cmdec ...

大佬,D2的值固定不变了,我对话框改掉但是实际并没有变,是怎么回事呢,对话框效果是可以的
回复

使用道具 举报

发表于 2022-7-24 21:36 | 显示全部楼层
怎么没变,请看录像。

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2022-7-24 22:47 | 显示全部楼层
yshf 发表于 2022-7-24 21:36
怎么没变,请看录像。

大佬,可以了,但是我运行是发现一个BUG,就是我输入第一行值之后跳到第二行的时候,如果这时候我发现第一行输错了,用鼠标点击,或者shift+tab键是返回不到第一行的,只能enter一个轮回才能再次回到第一行,能把这个bug修复吗
回复

使用道具 举报

发表于 2022-7-24 23:07 | 显示全部楼层
在第2编辑框内敲击回车,再在第一编辑框单击鼠标即可。
或者将这行:((= $key \"d2\") (mode_tile \"accept\" 2))  注释了,试试。

评分

参与人数 1明经币 +1 收起 理由
世人皆醉 + 1

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2022-7-24 23:25 | 显示全部楼层
yshf 发表于 2022-7-24 23:07
在第2编辑框内敲击回车,再在第一编辑框单击鼠标即可。
或者将这行:((= $key \"d2\") (mode_tile \"accep ...

可以了,谢谢大佬指点
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 02:55 , Processed in 0.347952 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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