Страница 2 из 2

Re: Длина текстового поля

Добавлено: 20 Октябрь 2009, 16:37
kreator
Попробовать не слабо. EMBEDS для обработки любого события этого поля - это метод TakeFieldEvent, управление ему не передается, если событие не Selected или Accepted. EMBEDS для обработки события Selected - это метод TakeSelected, обработкой события NewSelection он не занимается. Есть еще метод TakeNewSelection, вот нам туда, но он к сожалению опять не работает для текстового поля.
Итак вопрос - куда вставлять обработку события NewSelection?

Re: Длина текстового поля

Добавлено: 21 Октябрь 2009, 2:11
WadimZapara
А где в теме есть указание на то, что пишешь под ABC ?
Я объяснил для стандарта, кстати и до меня уважаемый Admin приводил кусок кода на стандарте.

Под ABC тоже можно найти решение:
в EMBEDS "Window Manager" - "Init Procedure" вставляем

Код: Выделить всё

ALERT(1, 0FFFFh)
Window{PROP:Status, 1} = 50
Window{PROP:Status, 2} = 100
Window{PROP:Status, 3} = 100
Window{PROP:Status, 4} = 100
Window{Prop:StatusText, 1} = 'ok'
в EMBEDS "Window Events" - PreAlertKey

Код: Выделить всё

If Focus() = ?TextField Then  Post(Event:NewSelection, ?TextField).
Cycle
и в EMBEDS "Control Events" - ?TextField - "All Events" :

Код: Выделить всё

    of event:NewSelection
      Window{Prop:StatusText, 2} = ?txt{PROP:SelStart}
      Window{Prop:StatusText, 3} = ?txt{PROP:SelEnd}
      Window{Prop:StatusText, 4} = Len(?txt{PROP:ScreenText})
... и становишься счастливым до беспамятства - при press_any_key_include_mouse всегда:
во второй части статусной строки индекс начала выделения,
в третьей части - индекс конца выделения
в четвёртой - длина всей строки

P.S. Извини, что потратил время на изучение нужного не мне. Хочешь проще - копай глубже. Лезь в твои любимые шаблоны! :mrgreen:

Re: Длина текстового поля

Добавлено: 27 Октябрь 2009, 18:46
kreator
Да Alert работает. Даже Alert для данного поля.
Но самое интересное, что даже при "ручной" обработке окна событие NewSelection не происходит.

Re: Длина текстового поля

Добавлено: 04 Февраль 2011, 23:17
muskin
Clarion 6.0 (ABC)

Всем привет.
Столкнулся с этой проблемой, нашел этот раздел, прошерстил весь Help, но не нашел для себя ответа на вопрос - "А как все-таки определить текущую позицию курсора от начала в полях Entry иText и как установить курсор в нужную позицию вышеупомянутых полей (для корректной работы с Clipboard-ом)?". {PROP:SelStart} и {PROP:End} отпадают.
Кто знает - поделитесь знаниями.

Re: Длина текстового поля

Добавлено: 05 Февраль 2011, 4:17
Admin
muskin писал(а):{PROP:SelStart} и {PROP:End} отпадают.
Почему?

Re: Длина текстового поля

Добавлено: 05 Февраль 2011, 22:16
muskin
Насколько я понял, свойства PROP:SelStart и PROP:SelEnd применимы только для отмеченного блока, а не для свободно гуляющего по полю курсора.
Вставка из Clipboard-а через Ctrl-V в полях Entry и Text не совсем корректна - курсор встает в начале вставляемого фрагмента, а не в конце.
Хотелось бы, с текущей позиции курсора в поле вставить блок и переместить курсор в конец этого блока.

Re: Длина текстового поля

Добавлено: 06 Февраль 2011, 8:27
Игорь Столяров
muskin писал(а):Хотелось бы, с текущей позиции курсора в поле вставить блок и переместить курсор в конец этого блока.
Что мешает по ALERT перехвать на поле Ctrl+V, получить строку из буфера, "поженить" ее с строкой в поле, показать результат в том же поле и установить курсор куда нужно в строке ? Для юзера это все будет по нажатию Ctrl+V ...

Re: Длина текстового поля

Добавлено: 06 Февраль 2011, 22:30
muskin
Да я и пытаюсь это сделать, но для реализации этого механизма необходимо одно число и одно действие - координата курсора внутри поля ввода и как затем переместить его в нужную позицию.
Как определить первое и сделать второе - я не знаю? Пытался что-то выяснить Debug-ером, не помогло. Подскажите.

Re: Длина текстового поля

Добавлено: 07 Февраль 2011, 10:22
Admin
muskin писал(а):Насколько я понял, свойства PROP:SelStart и PROP:SelEnd применимы только для отмеченного блока, а не для свободно гуляющего по полю курсора.
Вставка из Clipboard-а через Ctrl-V в полях Entry и Text не совсем корректна - курсор встает в начале вставляемого фрагмента, а не в конце.
Хотелось бы, с текущей позиции курсора в поле вставить блок и переместить курсор в конец этого блока.
Ну вообще то все работает прекрасно
Ниже тупой пример на коленке

Код: Выделить всё

                  PROGRAM
                  MAP
                  END

loc:entry         CSTRING(255)
loc:selstart      LONG(4)
loc:demo          CSTRING('-DemoString-')

Window WINDOW('SelStartEnd'),AT(,,301,65),FONT('MS Sans Serif',8,,),CENTER,GRAY,DOUBLE
       BUTTON('Paste'),AT(128,36,45,14),USE(?Button3)
       ENTRY(@s255),AT(7,15,287,12),USE(loc:entry)
     END

  CODE
  OPEN(Window)
  loc:entry = 'DemoText'
  ACCEPT
  CASE ACCEPTED()
  OF ?Button3
    Len# = LEN(loc:demo)
    L" = SUB(loc:entry, 1, loc:selstart)
    R" = SUB(loc:entry, loc:selstart+1, LEN(loc:entry)-loc:selstart)
    loc:entry = CLIP(L") & loc:demo & CLIP(R")
    ?loc:entry{PROP:SelStart} = loc:selstart + Len#
    DISPLAY
    SELECT(?loc:entry, loc:selstart + Len# + 1)
  END
  END
  CLOSE(Window)

Re: Длина текстового поля

Добавлено: 07 Февраль 2011, 22:54
muskin
С согласия Admin-а добавил еще одну строчку в примере после OF ?Button3
OF ?Button3
loc:selstart=?loc:entry{Prop:selstart}-1
...
Все заработало, спасибо.
Никогда не обращал внимания, что у Select-а есть еще два дополнительных поля.

Re: Длина текстового поля

Добавлено: 21 Март 2011, 6:47
sgu66
Для этого нужно использовать WinAPI.
Сабклассить текстовое поле и отслеживать нажатие клавиши.
Для subClassEvent PROCEDURE(LONG hWnd, LONG uMsg, LONG wParam, LONG lParam) - это uMsg=256, а wParam
CASE wParam
OF 8 TO 9
OROF 32
OROF 65 TO 90
OROF 45 TO 46
OROF 48 TO 57
OROF 96 TO 105
OROF 186 TO 192
OROF 219 TO 222
OROF 106
OROF 109
OROF 111
OROF 256
END
Сам текст можно получить с помощью SendMessage сообщений WM_GETTEXTLENGTH и WM_GETTEXT. В таком случае не нужно для USE использовать какую-ту переменную, длина которой ограничена, а просто USE(?Text).