Ребол получает линию в области по позиции каретки

Как я могу получить линию в области, где расположена каретка? Например, поместив каретку в строку 0816 (в любом месте строки), как получить строку "0816 LEANYER NT DARWIN DELIVERY CENTER"? Спасибо

rebol []

sample-data: [
"0810 TIWI NT DARWIN DELIVERY CENTRE"
"0811 WAGAMAN NT DARWIN DELIVERY CENTRE"
"0812 WANGURI NT DARWIN DELIVERY CENTRE"
"0813 CASUARINA NT PO Boxes CASUARINA"
"0814 ANULA NT DARWIN DELIVERY CENTRE"
"0815 KARAMA NT DARWIN DELIVERY CENTRE"
"0816 LEANYER NT DARWIN DELIVERY CENTRE"
"0817 MALAK NT DARWIN DELIVERY CENTRE"
"0818 MARRARA NT DARWIN DELIVERY CENTRE"
"0819 SANDERSON NT DARWIN DELIVERY CENTRE"
"0820 WULAGI NT DARWIN DELIVERY CENTRE"
"0821 SANDERSON NT PO Boxes SANDERSON"
"0822 NIGHTCLIFF NT PO Boxes NIGHTCLIFF"
"0823 NIGHTCLIFF NT PO Boxes NIGHTCLIFF"
"0824 NIGHTCLIFF NT PO Boxes NIGHTCLIFF"
"0825 NIGHTCLIFF NT PO Boxes NIGHTCLIFF"
]


gui: layout [
b1: backcolor yellow
style fld field 300
across
c1: crit1: fld "hello"
return
ab: area 790x300 font-size 18 wrap []
return

button "Start" [       
        for counter 1 16 1 [ 
         append ab/text reduce [sample-data/(counter) newline]
         ]
         show ab
         ]

button "Quit" [quit]
]
view gui

2 ответа

Решение

Когда вы нажимаете на грань текста или области, указатель на текст там помещается в system/view/caret. Таким образом, как только курсор будет виден на вашей области лица, вы можете взять этот индекс каретки и вычислить, на какой строке он находится.

Однако, если вы не хотите, чтобы пользователи редактировали лицо области, я бы подумал, что использование лица списка будет несколько проще в использовании.

Вот некоторый рабочий код - добавьте эту кнопку

button "Find" [
    use [ before cnt ][
        if all [ 
            system/view/caret 
            find ab/text system/view/caret
            before: copy/part ab/text find ab/text system/view/caret
        ][
            parse/all before [ (cnt: 1 ) some [ thru newline ( cnt: cnt + 1 ) ]]
            alert pick sample-data cnt  
        ]
    ]
]

Итак, вот версия, которую вы спросили;

button "Find" [
    use [ before cnt ][
        if start: system/view/caret [
            ;find the previous newline char (if no this is the first line)
            start: either found? st: find/reverse/tail start newline [st] [head start]
            end: either found? st: find start newline [st] [tail start]
            probe copy/part start end
        ]
    ]
]

пожалуйста, примите ответ Грэма, я просто расширил его версию.

Другие вопросы по тегам