找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4557|回复: 47

[教学] ODCL中使用Asynchronous事件

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-3 07:38:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 st788796 于 2014-12-3 07:40 编辑

在 ODCL 控件中引发事件包括 0 - Synchronous ( 异步)1 - Asynchronous ( 同步)两种模式,异步事件就是控件中定义的 Events只有在该控件操作完成后才会执行定义的 c:xxx_form1_xxxx_Onxxxx 函数,同步事件是控件内容修改的同时就执行事件函数,这样说的比较抽象,看看下面的一个简单例子,一个加法计算,只要在等号前面的框内随着前面数字的修改,和自动变换而不等你完成输入离开
  1. (defun c:cal_form1_textbox1_OnEditChanged (newvalue /)
  2.   (dcl_control_settext
  3.     cal_form1_textbox3
  4.     (vl-princ-to-string
  5.       (+ (distof newvalue)
  6.          (distof (dcl_control_gettext cal_form1_textbox2))
  7.       )
  8.     )
  9.   )
  10. )
  11. (defun c:cal_form1_textbox2_OnEditChanged (newvalue /)
  12.   (dcl_control_settext
  13.     cal_form1_textbox3
  14.     (vl-princ-to-string
  15.       (+ (distof newvalue)
  16.          (distof (dcl_control_gettext cal_form1_textbox1))
  17.       )
  18.     )
  19.   )
  20. )
  21. (defun c:test (/ strl)
  22.   (setq        strl
  23.          '("YWt6A5gVAACuinKABuKTKTUx7T9qQ2GuTHT8SF9PDy1rHV1oNT9gWMSOa91e9ljETtfqyN6MTrhW"
  24.            "D72oOqnEruGeTY9rKXpJxB2XvGEe3JawZmGqRS2WTvk+0yY0Mpm1qbLnRYmwssMNMKWkijJkzREH"
  25.            "QYROenG+KlvOOAkaxsBzd7pvP0Ukz2U3+tvh6s9Al8veNy40BA+XW7tgOE3cHDW27WwlKkDlGiBC"
  26.            "zTIkOaqPhBvKa2McEW3hKAdMDyS6QVydH/evH6h3teL6pp0YgxiP9bTS6sIAKpfeGN2szne0PWcY"
  27.            "5eYC+U/0tWZoYYt4/0e1kmqr9XSyFRSi+kyT/botFydfrULD8MQwhmCfIfrRbOD6sSdRHqlF3I8F"
  28.            "5AHzDseZkIn7i0mGZ5+Z+uFswDuPkW6APwbyzqENjzHlMcPupMQWT6BEaNbuoyc2BNjSRAjrYKe5"
  29.            "GyvZmhzyn3SINbrPO/QleOtDllBUChqPvAGp+9HO+0x5l8iI82SFlp7xV6BtvEswnMiKHXFMGvW/"
  30.            "WFt4QChyo2a/X8eDmRuKfni7GXp9+GuUX2udf5/LKvI3RK149bVLYA8sIqP77Xa0RVbVc7dtuj+H"
  31.            "Yv7E7vMVDNw4d3EZDZsDq8fCNohfvNESENmLggi0I/4MAeWwqz6ZxD8H9m1AM8awuKlpOIsmYurg"
  32.            "pDfad23AN4/s+gmuByBtwDWNMaaGkcqDUqdJRQuMXC7zqJ2lxgaypnLl8gLY8jEZXRpcAFpMAM9r"
  33.            "So1B36y/i5rB81QKopz2uFdEv0+0HlmfULw5dwkueCcyyK1z51lQJBjNnCzTOQz3NYqBaukWv7q7"
  34.            "ktdaUHW6m2wiDwf3nPT1pzE3InRbUJWKNlAPF7A5IrIMb7xVVVBbH77BafhXxrwOeLtr+ItWdz3/"
  35.            "+j8FqpbvOGh4AdkCg7iz07GDCfiB2Shut+aKAMkGc3Ub3mQBUnWYDvGM6vuFB7S6FO/7fq/c/4gn"
  36.            "OcqTXyRNM5mvEny7WzNuUBc8ZFHpWgfuPJlNNfQkQ8xqVwyBciFYV4joNo9p2k7nIvxqbQ43T/bb"
  37.            "Nw9w1Y7lGns3TwnjAX3KivnN"
  38.           )
  39.   )
  40.   (dcl_project_import strl)
  41.   (dcl_form_show cal_form1)
  42.   (princ)
  43. )
cal.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2014-12-3 09:21:29 | 显示全部楼层
{:soso_e179:}                                                   
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-12-3 15:41:42 来自手机 | 显示全部楼层
守仁格竹GM 发表于 2014-12-3 09:21

你写个简单的文字编辑的同步试试,DCL实际都是异步事件(action)

点评

textbox1和textbox2有一个设置就都同步了,这是为什么呢。 另外还有一个疑问。就是我把名称改为cal1后里面读取都正常,但是外面定义函数就要cad 见下面,这样就能运行,假如 改成c:cal1_form1_textbox1_OnEditChan  详情 回复 发表于 2014-12-6 11:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-5 16:27:03 | 显示全部楼层
st788796 元老,正好有个问题和您的示例有些相近,请教下如何处理。
一个form中有textbox1和textbox2两个控件,设置textbox1的最大输入字符数为5,当在textbox1输入字符数超过5,焦点跳到textbox2,在textbox2中继续输入。需要设置哪些属性,和相关的触发事件。谢谢

点评

把 1 设同步事件,函数里 if strlen newvalue 大于5 设焦点为 2 你试试这样  详情 回复 发表于 2014-12-5 16:32
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-12-5 16:32:00 来自手机 | 显示全部楼层
13808843088 发表于 2014-12-5 16:27
st788796 元老,正好有个问题和您的示例有些相近,请教下如何处理。
一个form中有textbox1和textbox2两个 ...

把 1 设同步事件,函数里 if strlen newvalue 大于5 设焦点为 2
你试试这样

点评

谢谢,不过找不到设置焦点的函数  详情 回复 发表于 2014-12-5 16:45
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-5 16:45:39 | 显示全部楼层
csharp 发表于 2014-12-5 16:32
把 1 设同步事件,函数里 if strlen newvalue 大于5 设焦点为 2
你试试这样

谢谢,不过找不到设置焦点的函数{:soso_e101:}

点评

[attachimg]11902[/attachimg] dcl-control-setfocus  详情 回复 发表于 2014-12-5 17:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-12-5 16:53:06 来自手机 | 显示全部楼层
dcl-control-setfocuse不知道对不对

点评

是的,谢谢但是我这么处理是不行的,已经设置了Text Limit为5  详情 回复 发表于 2014-12-5 17:00
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-5 17:00:57 | 显示全部楼层
st788796 发表于 2014-12-5 16:53
dcl-control-setfocuse不知道对不对

是的,谢谢但是我这么处理是不行的,已经设置了Text Limit为5
  1. (defun c:tt ()
  2.   (gxl-AutoLoadODclArx)
  3.   (gxl-Load_ODCL_Project "textboxtest.odcl" t nil nil)
  4.   (dcl-Form-Show textboxtest/Form1)
  5.   )
  6. (defun c:textboxtest/Form1/TextBox1#OnMaxText (/)
  7.   (dcl-Control-SetFocus textboxtest/Form1/TextBox2)
  8.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2014-12-5 17:02:36 | 显示全部楼层
13808843088 发表于 2014-12-5 16:45
谢谢,不过找不到设置焦点的函数

QQ截图20141205170113.png

dcl-control-setfocus
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-12-5 17:23:48 来自手机 | 显示全部楼层
13808843088 发表于 2014-12-5 17:00
是的,谢谢但是我这么处理是不行的,已经设置了Text Limit为5

限制不会触发事件,按csharp的方法再把 1 加上editchanged事件并设为同步事件

点评

采用非模态以后可以,但是有两个问题:一、设置text limit为5,它无论中英文都是5个字符,这个可能就要用csharp兄的方案,不用MaxText事件。[/backcolor] 二、当输入第六个字符的时候,跳出textbox1,进入textbox2  详情 回复 发表于 2014-12-5 17:55
谢谢,前面我搞错了,我用的模态对话框,我试试非模态  详情 回复 发表于 2014-12-5 17:39
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-5 17:39:13 | 显示全部楼层
st788796 发表于 2014-12-5 17:23
限制不会触发事件,按csharp的方法再把 1 加上editchanged事件并设为同步事件

谢谢,前面我搞错了,我用的模态对话框,我试试非模态
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-12-5 17:54:43 来自手机 | 显示全部楼层
13808843088 发表于 2014-12-5 17:39
谢谢,前面我搞错了,我用的模态对话框,我试试非模态

这个和模态、非模态无关

点评

我用模态对话框怎么都不能成功,能否给个模态的例子,谢谢  发表于 2014-12-5 17:56
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-5 17:55:13 | 显示全部楼层
st788796 发表于 2014-12-5 17:23
限制不会触发事件,按csharp的方法再把 1 加上editchanged事件并设为同步事件

采用非模态以后可以,但是有两个问题:一、设置text limit为5,它无论中英文都是5个字符,这个可能就要用csharp兄的方案,不用MaxText事件。
二、当输入第六个字符的时候,跳出textbox1,进入textbox2的时候将第六个字符截掉了,这个也要用csharp兄的方案,不用MaxText事件。
谢谢各位的指导
  1. (defun c:tt (/ strl)
  2.   (setq strl'("YWt6A0wLAAB6Y3+sBuK76MUQbT9q+AFZD0w0Unrv7lZW/Ox+fPKTevwzP/9ue268M9zf91Ff/CJa"
  3. "9l7cN/V6S2qOdF7uxjbqrj65fY5+Nm6WbpxsDRicBsPhciU+utColRGZsuJNzZmCzWWVVQtL0MB7"
  4. "q8rWe+tLYZBLI8uh6trJQyzRgR0YPTubKyo3hZPiKjsnTdIWKiuFybGQexW15Du74PH7qMynB5X8"
  5. "2EocSFtFOSmjqIP27ajJErG5kiBNpdKn6Au+UEEcq7YFjzEUuCfFafPUaPnJZUtkdyBE63c/pF8T"
  6. "6zXXPfO9otrxpMLQFqi8DtGrwaisTg8ZqtvovVP75/mdw3OWlJQQHrQ5kBD+kf0B/NH/IVRjjalh"
  7. "h7UFAHmFlZ6wKk0goa9D8YT5j+D84f/h/hEdgsWekZ47DglUsEFq8RGOyVG935nl5tuisFasF8VM"
  8. "oERtjm6hz0Wptp+9X/k5mqxmgn+8AHagfuAXMF16n1D9GeW/28CGSuc5hVsOZ52heuF5qb7Jvom+"
  9. "ab61s4snm+tW4I4kQF/A8ZT3j26EAfCYZaTZntEzGwu200MMRxo7YKIsC6GCDAg7K2ykWe7L8S7L"
  10. "8U8gUeYryXdCaTXZssawFL7QFzXVZ0V5CroAUbTD9pwmiA9obzk1SxGPAnkPkvihs+ap1wawxUMW"
  11. "sfwJv4FVjhemETVW5cPvg6lbzYH+5GK4gjD88b2hd45GhmbG+obXd0XO4JNK3FEe7DjKoXOoVxm9"
  12. "pC7s7Azm7Dq33NrTKbAttFYL6jw0W9uKIalu2+osNReDpeTdarnbBAU7eauA7VTZFom195dG1nez"
  13. "F6LA/WjlE/eLsxP+i7ATn/GLIfarwSGauhP9pXKL/KU4rEhN8oYlilsCYw+lh7EEnfEh+Y0ejA=="))
  14.   (dcl-project-import strl)
  15.   (dcl-Form-Show textboxtest/Form1)
  16.   )
  17. (defun c:textboxtest/Form1/TextBox1#OnMaxText (/)
  18.   (dcl-Control-SetFocus textboxtest/Form1/TextBox2)
  19.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-12-5 18:01:02 来自手机 | 显示全部楼层
13808843088 发表于 2014-12-5 17:55
采用非模态以后可以,但是有两个问题:一、设置text limit为5,它无论中英文都是5个字符,这个可能就要用 ...

limits是内部检测,不会给你设置焦点,所以就要自己去设置引发事件

点评

实验了一下模态对话框,在设置了text limit 5,触发EditChanged事件,设置(> (strlen NewValue) 4)的时候可达到我想要的效果,如不设置text limit则不触发EditChanged(> (strlen NewValue) 4)事件。以上两个方案均未  详情 回复 发表于 2014-12-5 18:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-5 18:30:36 | 显示全部楼层
st788796 发表于 2014-12-5 18:01
limits是内部检测,不会给你设置焦点,所以就要自己去设置引发事件

实验了一下模态对话框,在设置了text limit 5,触发EditChanged事件,设置(> (strlen NewValue) 4)的时候可达到我想要的效果,如不设置text limit则不触发EditChanged(> (strlen NewValue) 4)事件。以上两个方案均未设置maxtext事件。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-26 16:20 , Processed in 0.466180 second(s), 68 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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