Как использовать вкладку для перемещения по списку полей на красном языке

Это похоже на мой предыдущий вопрос ( Использование TAB для перемещения между полями на красном языке). Поскольку у меня много полей, я хочу использовать список полей. Однако следующий код не работает:

Red []

view [
    text "Value of x:"  f1: field "" on-key [handle-key event] return
    text "Value of y:"  f2: field "" on-key [handle-key event] return
    text "Third: " f3:  field "" on-key [handle-key event] return
    text "Fourth:" f4:  field "" on-key [handle-key event] return
    text "Read Sum:"    tt: text ""  on-key [handle-key event] return
    do[
        fldlist: [f1 f2 f3 f4]
        focusnum: 1
        maxfocusnum: length? fldlist
        handle-key: function [e] [
            print rejoin ["focusnum = " focusnum]   ; OUTPUT: "focusnum = none"
            k: e/key
            if k = tab [
                either e/shift? 
                    [   focusnum: focusnum - 1
                        if focusnum < 1 [focusnum: maxfocusnum]
                        win/selected: fldlist/:focusnum]
                    [   focusnum: focusnum + 1
                        if focusnum > maxfocusnum [focusnum: 1]
                        win/selected: fldlist/:focusnum]
                        ] ] ]

    button "Calculate" [
        tt/text: to-string ((to-integer f1/text) + (to-integer f2/text))      
    ]
    button "Quit" [quit]  
    do [win: self win/selected: f1]
]

focusnum выдается как none. Где проблема и как это можно решить.


person rnso    schedule 25.10.2017    source источник


Ответы (2)


Две модификации заставят ваш скрипт работать

fldlist: [f1 f2 f3 f4] -> fldlist: reduce [f1 f2 f3 f4

Вам нужны «лица», а не слова, указывающие на лица.

handle-key: function [e] [ 

->

 handle-key: func [e] [
     focusnum: index? find fldlist win/selected

функция автоматически делает все заданные слова локальными. Поэтому локальный focusnum не инициализируется значением, но глобальный focusnum по-прежнему имеет начальное значение. Динамическое нахождение focusnum должно вылечить «нарушение». Наверное, есть более эффективные способы.

А вот и почти окончательный вариант с правильным форматированием

view [
    text "Value of x:"  f1: field "" on-key [handle-key event]  on-focus [handle-focus face event] return
    text "Value of y:"  f2: field "" on-key [handle-key event] on-focus [handle-focus face event] return
    text "Third: " f3:  field "" on-key [handle-key event] on-focus [handle-focus face event] return
    text "Fourth:" f4:  field "" on-key [handle-key event] on-focus [handle-focus face event] return
    text "Read Sum:"    tt: text ""  on-key [handle-key event] return
    do[
        fldlist:  reduce [f1 f2 f3 f4]
        focusnum: 1
        maxfocusnum: length? fldlist
        handle-key: func [e] [
            print rejoin ["focusnum = " focusnum]  
            k: e/key
            if k = tab [
                either e/shift?   [   
                    focusnum: focusnum - 1
                    if focusnum < 1 [focusnum: maxfocusnum]
                    set-focus  fldlist/:focusnum
                ] [   
                    focusnum: focusnum + 1
                    if focusnum > maxfocusnum [focusnum: 1]
                    set-focus  fldlist/:focusnum
                ]
            ]
        ] 
        handle-focus: func [f e] [ probe focusnum: index? find fldlist f]
    ]
    button "Calculate" [
        tt/data:  f1/data + f2/data      
    ]
    button "Quit" [quit]  
    do [win: self win/selected: f1]
]
person sqlab    schedule 26.10.2017
comment
Да, это работает, но все нарушается, если какое-то поле выбрать вручную, щелкнув по нему мышью. Любой способ исправить эту проблему? Я не могу заставить find или select fldlist win/selected работать для этого. - person rnso; 26.10.2017
comment
Это работает очень хорошо. Отлично. Я надеюсь, что эта функция появится в будущих версиях самого языка. - person rnso; 26.10.2017

Мне удалось еще больше упростить код:

view [
    text "Value of x:"  f1: field "" on-key [handle-key event] return
    text "Value of y:"  f2: field "" on-key [handle-key event] return
    text "Third: " f3:  field ""    on-key [handle-key event] return
    text "Fourth:" f4:  field ""    on-key [handle-key event] return
    text "Read Sum:"    tt: text "" on-key [handle-key event] return
    button "Calculate" [
        tt/data:  f1/data + f2/data   
    ]
    button "Quit" [quit]  

    do[ fldlist:  reduce [f1 f2 f3 f4]
        mafocusnumfocusnum: length? fldlist
        handle-key: func [e] [
            if e/key = tab [
                focusnum: index? find fldlist win/selected
                either e/shift?
                    [   focusnum: focusnum - 1    
                        if focusnum < 1 [focusnum: mafocusnumfocusnum] ]
                    [   focusnum: focusnum + 1    
                        if focusnum > mafocusnumfocusnum [focusnum: 1] ]
                set-focus fldlist/:focusnum 
            ]   
        ]
        win: self win/selected: f1
    ] 
]

функция handle-focus здесь не нужна.

person rnso    schedule 26.10.2017
comment
ручка-фокус не нужна, как я показал в своем ответе сначала, но настройка focusnum при каждом нажатии клавиши неэффективна по сравнению с решением настройки при изменении фокуса. - person sqlab; 27.10.2017