使用事件处理程序重绘 gl2 isigraphs

Redrawing gl2 isigraphs using event handler

我一直在玩 table 和 gl2 演示,并且多次遇到 "domain error: chkgl2"。

我想做的是在程序 运行 上初始化后通过选择/取消选择复选框来修改 isigraph。

我有以下代码:

demo_run=: 3 : 0
require 'gl2'
coinsert 'jgl2'
wd 'pc test closeok escclose'
wd 'pn "Tester"'
wd 'cc gs isigraph'
wd 'cc cb checkbox; cn "Test GUI"'
wd 'set cb value 0'

wd 'pmove 400 10 400 200'
wd 'pshow'
)

demo_cb_button=: 3 : 0
demo_gs_paint''
)

demo_gs_paint=: 3 : 0
'w h'=: glqwh''
glfill 0 0 0 255
glrgb 255 223 0
glpen 2 1
if. cb do.
    for_i. 250*i. >. h%250 do.
         gllines 0,i,w,i
    end.
end.
)

demo_run'' 

我期待的是更新 isigraph 的复选框。我得到的是 "domain error: chkgl2" 在线 "glfill 0 0 0 255".

如有任何帮助,我们将不胜感激!

我发现了几件事:

1) 你称你的 parent 'test' 但你给动词一个 'demo' 前缀。您可以为动词 demo_run 执行此操作,但如果您希望形式的 children 做出反应,则需要以 test_cb_button

的形式引用它们

2) cb 在你的测试中实际上是字符 '1' 而不是整数 1,所以为了让它作为条件工作,你需要将它更改为整数类型。我使用 Do (".) 进行了此更改 (". cb)

3) 我不确定您的代码 250*i. >. h%250 是否如您所愿,因此我将其替换为 i. >.h%15,然后将 gllines 命令更改为 gllines 0,i,w,i*15 以获得更有趣的效果。

4) 您使用的 isigraph 会自动触发屏幕绘制,我想知道您是否正在单击触发屏幕绘制的按钮以更改按钮图像,同时还明确要求使用 test_gs_paint 动词绘制屏幕导致 glfill 成为 运行 两次。第二次它可能处于创建域错误的上下文中。老实说,我不知道。我所知道的是,当我改用 isidraw 并使用 glpaint ''isidraw 需要)触发我自己的绘画命令时,事情似乎有效。

5) 我已经添加了与 isigraph 一起使用的第二个版本,看起来问题是通过直接用 test_gs_paint 调用绘画动词你确实调用了它两次。通过将操作更改为 glpaint '',表单会重新 运行 整个表单的绘制一次,这也会导致 test_gs_paint 更新。不过这一次它以更加协调的方式进行。我的第二个版本反映了变化。我留下的其他更正。

我的 isidraw 版本的代码如下:

demo_run=: 3 : 0
require 'gl2'
coinsert 'jgl2'
wd 'pc test closeok escclose'
wd 'pn "Tester"'
wd 'cc gs isidraw' NB. changed from isigraph
wd 'cc cb checkbox; cn "Test GUI"'
wd 'set cb value 0'

wd 'pmove 400 10 400 200'
wd 'pshow'
)

test_cb_button=: 3 : 0
test_gs_paint''
)

test_gs_paint=: 3 : 0
'w h'=: glqwh''
glfill 0 0 0 255
glrgb 255 223 0
glpen 2 1
if. (".cb) do.  NB. needed to test on an integer and not a character value
    for_i. i. >.h%15 do.    NB. changed to give a more noticeable effect
         gllines 0,i,w,i*15
    end.
end.
glpaint'' NB. added to accommodate isidraw requirement of explicit painting
)

demo_run'' 

我的 isigraph 版本的表格:

demo_run=: 3 : 0
require 'gl2'
coinsert 'jgl2'
wd 'pc test closeok escclose'
wd 'pn "Tester"'
wd 'cc gs isigraph'
wd 'cc cb checkbox; cn "Test GUI"'
wd 'set cb value 0'

wd 'pmove 400 10 400 200'
wd 'pshow'
)

test_cb_button=: 3 : 0
glpaint ''  NB. changed from test_gs_paint ''
)

test_gs_paint=: 3 : 0
'w h'=: glqwh''
glfill 0 0 0 255
glrgb 255 223 0
glpen 2 1
if. (".cb) do.
    for_i. i. >.h%15 do.
         gllines 0,i,w,i*15
    end.
end.
)

demo_run''