Перерисовка gl2 isigraphs с помощью обработчика событий
Я играл с таблицами и демонстрациями gl2 и несколько раз сталкивался с "ошибкой домена: 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. То, что я получаю, это "ошибка домена: chkgl2" в строке "glfill 0 0 0 255".
Любая помощь будет оценена!
1 ответ
Несколько вещей, которые я заметил:
1) вы звоните родителю 'test'
но вы даете глаголы 'demo'
префикс. Вы можете сделать это для глагола demo_run
, но если вы хотите, чтобы дети формы реагировали, вам нужно обратиться к ним в форме test_cb_button
2) cb
в вашем тесте на самом деле используется символ "1", а не целое число 1, поэтому, чтобы он работал как условный, необходимо изменить его на целочисленный тип. Я использовал До (".
) чтобы сделать это изменение (". 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''