Перерисовка 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'' 
Другие вопросы по тегам