Длина текстового поля
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- ✯ Ветеран ✯
- Сообщения: 5163
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Длина текстового поля
Попробовать не слабо. EMBEDS для обработки любого события этого поля - это метод TakeFieldEvent, управление ему не передается, если событие не Selected или Accepted. EMBEDS для обработки события Selected - это метод TakeSelected, обработкой события NewSelection он не занимается. Есть еще метод TakeNewSelection, вот нам туда, но он к сожалению опять не работает для текстового поля.
Итак вопрос - куда вставлять обработку события NewSelection?
Итак вопрос - куда вставлять обработку события NewSelection?
We are hard at work… for you. 

- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Длина текстового поля
А где в теме есть указание на то, что пишешь под ABC ?
Я объяснил для стандарта, кстати и до меня уважаемый Admin приводил кусок кода на стандарте.
Под ABC тоже можно найти решение:
в EMBEDS "Window Manager" - "Init Procedure" вставляем
в EMBEDS "Window Events" - PreAlertKey
и в EMBEDS "Control Events" - ?TextField - "All Events" :
... и становишься счастливым до беспамятства - при press_any_key_include_mouse всегда:
во второй части статусной строки индекс начала выделения,
в третьей части - индекс конца выделения
в четвёртой - длина всей строки
P.S. Извини, что потратил время на изучение нужного не мне. Хочешь проще - копай глубже. Лезь в твои любимые шаблоны!
Я объяснил для стандарта, кстати и до меня уважаемый 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'
Код: Выделить всё
If Focus() = ?TextField Then Post(Event:NewSelection, ?TextField).
Cycle
Код: Выделить всё
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})
во второй части статусной строки индекс начала выделения,
в третьей части - индекс конца выделения
в четвёртой - длина всей строки
P.S. Извини, что потратил время на изучение нужного не мне. Хочешь проще - копай глубже. Лезь в твои любимые шаблоны!

Последний раз редактировалось WadimZapara 10 Ноябрь 2009, 0:37, всего редактировалось 1 раз.
Компьютер имеет то преимущество перед мозгом, что им пользуются...
-
- ✯ Ветеран ✯
- Сообщения: 5163
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Длина текстового поля
Да Alert работает. Даже Alert для данного поля.
Но самое интересное, что даже при "ручной" обработке окна событие NewSelection не происходит.
Но самое интересное, что даже при "ручной" обработке окна событие NewSelection не происходит.
We are hard at work… for you. 

Re: Длина текстового поля
Clarion 6.0 (ABC)
Всем привет.
Столкнулся с этой проблемой, нашел этот раздел, прошерстил весь Help, но не нашел для себя ответа на вопрос - "А как все-таки определить текущую позицию курсора от начала в полях Entry иText и как установить курсор в нужную позицию вышеупомянутых полей (для корректной работы с Clipboard-ом)?". {PROP:SelStart} и {PROP:End} отпадают.
Кто знает - поделитесь знаниями.
Всем привет.
Столкнулся с этой проблемой, нашел этот раздел, прошерстил весь Help, но не нашел для себя ответа на вопрос - "А как все-таки определить текущую позицию курсора от начала в полях Entry иText и как установить курсор в нужную позицию вышеупомянутых полей (для корректной работы с Clipboard-ом)?". {PROP:SelStart} и {PROP:End} отпадают.
Кто знает - поделитесь знаниями.
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: Длина текстового поля
Почему?muskin писал(а):{PROP:SelStart} и {PROP:End} отпадают.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Re: Длина текстового поля
Насколько я понял, свойства PROP:SelStart и PROP:SelEnd применимы только для отмеченного блока, а не для свободно гуляющего по полю курсора.
Вставка из Clipboard-а через Ctrl-V в полях Entry и Text не совсем корректна - курсор встает в начале вставляемого фрагмента, а не в конце.
Хотелось бы, с текущей позиции курсора в поле вставить блок и переместить курсор в конец этого блока.
Вставка из Clipboard-а через Ctrl-V в полях Entry и Text не совсем корректна - курсор встает в начале вставляемого фрагмента, а не в конце.
Хотелось бы, с текущей позиции курсора в поле вставить блок и переместить курсор в конец этого блока.
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
- Игорь Столяров
- Ветеран движения
- Сообщения: 8037
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
Re: Длина текстового поля
Что мешает по ALERT перехвать на поле Ctrl+V, получить строку из буфера, "поженить" ее с строкой в поле, показать результат в том же поле и установить курсор куда нужно в строке ? Для юзера это все будет по нажатию Ctrl+V ...muskin писал(а):Хотелось бы, с текущей позиции курсора в поле вставить блок и переместить курсор в конец этого блока.
Make Clarion Great Again ! 
Re: Длина текстового поля
Да я и пытаюсь это сделать, но для реализации этого механизма необходимо одно число и одно действие - координата курсора внутри поля ввода и как затем переместить его в нужную позицию.
Как определить первое и сделать второе - я не знаю? Пытался что-то выяснить Debug-ером, не помогло. Подскажите.
Как определить первое и сделать второе - я не знаю? Пытался что-то выяснить Debug-ером, не помогло. Подскажите.
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: Длина текстового поля
Ну вообще то все работает прекрасно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: Длина текстового поля
С согласия Admin-а добавил еще одну строчку в примере после OF ?Button3
OF ?Button3
loc:selstart=?loc:entry{Prop:selstart}-1
...
Все заработало, спасибо.
Никогда не обращал внимания, что у Select-а есть еще два дополнительных поля.
OF ?Button3
loc:selstart=?loc:entry{Prop:selstart}-1
...
Все заработало, спасибо.
Никогда не обращал внимания, что у Select-а есть еще два дополнительных поля.
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
Re: Длина текстового поля
Для этого нужно использовать 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).
Сабклассить текстовое поле и отслеживать нажатие клавиши.
Для 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).