世人皆醉 发表于 2022-7-23 16:11:56

对话框如何聚焦在第一个框里面

本帖最后由 世人皆醉 于 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键,这种效果能达到吗

yshf 发表于 2022-7-23 16:11:57

(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:49



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

masterlong 发表于 2022-7-23 16:49:23

默认聚焦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:57

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:42

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的值固定不变了,我对话框改掉但是实际并没有变,是怎么回事呢,对话框效果是可以的

yshf 发表于 2022-7-24 21:36:50

怎么没变,请看录像。

世人皆醉 发表于 2022-7-24 22:47:07

yshf 发表于 2022-7-24 21:36
怎么没变,请看录像。

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

yshf 发表于 2022-7-24 23:07:49

在第2编辑框内敲击回车,再在第一编辑框单击鼠标即可。
或者将这行:((= $key \"d2\") (mode_tile \"accept\" 2))注释了,试试。

世人皆醉 发表于 2022-7-24 23:25:31

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

可以了,谢谢大佬指点
页: [1]
查看完整版本: 对话框如何聚焦在第一个框里面