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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
kreator
✯ Ветеран ✯
Сообщения: 5163
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

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

Сообщение kreator »

Попробовать не слабо. EMBEDS для обработки любого события этого поля - это метод TakeFieldEvent, управление ему не передается, если событие не Selected или Accepted. EMBEDS для обработки события Selected - это метод TakeSelected, обработкой события NewSelection он не занимается. Есть еще метод TakeNewSelection, вот нам туда, но он к сожалению опять не работает для текстового поля.
Итак вопрос - куда вставлять обработку события NewSelection?
We are hard at work… for you. :)
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

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

Сообщение 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:
Последний раз редактировалось WadimZapara 10 Ноябрь 2009, 0:37, всего редактировалось 1 раз.
Компьютер имеет то преимущество перед мозгом, что им пользуются...
kreator
✯ Ветеран ✯
Сообщения: 5163
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

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

Сообщение kreator »

Да Alert работает. Даже Alert для данного поля.
Но самое интересное, что даже при "ручной" обработке окна событие NewSelection не происходит.
We are hard at work… for you. :)
Аватара пользователя
muskin
Активист
Сообщения: 114
Зарегистрирован: 08 Декабрь 2009, 21:16
Откуда: РК

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

Сообщение muskin »

Clarion 6.0 (ABC)

Всем привет.
Столкнулся с этой проблемой, нашел этот раздел, прошерстил весь Help, но не нашел для себя ответа на вопрос - "А как все-таки определить текущую позицию курсора от начала в полях Entry иText и как установить курсор в нужную позицию вышеупомянутых полей (для корректной работы с Clipboard-ом)?". {PROP:SelStart} и {PROP:End} отпадают.
Кто знает - поделитесь знаниями.
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение Admin »

muskin писал(а):{PROP:SelStart} и {PROP:End} отпадают.
Почему?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
muskin
Активист
Сообщения: 114
Зарегистрирован: 08 Декабрь 2009, 21:16
Откуда: РК

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

Сообщение muskin »

Насколько я понял, свойства PROP:SelStart и PROP:SelEnd применимы только для отмеченного блока, а не для свободно гуляющего по полю курсора.
Вставка из Clipboard-а через Ctrl-V в полях Entry и Text не совсем корректна - курсор встает в начале вставляемого фрагмента, а не в конце.
Хотелось бы, с текущей позиции курсора в поле вставить блок и переместить курсор в конец этого блока.
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8037
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

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

Сообщение Игорь Столяров »

muskin писал(а):Хотелось бы, с текущей позиции курсора в поле вставить блок и переместить курсор в конец этого блока.
Что мешает по ALERT перехвать на поле Ctrl+V, получить строку из буфера, "поженить" ее с строкой в поле, показать результат в том же поле и установить курсор куда нужно в строке ? Для юзера это все будет по нажатию Ctrl+V ...
Make Clarion Great Again ! 😎
Аватара пользователя
muskin
Активист
Сообщения: 114
Зарегистрирован: 08 Декабрь 2009, 21:16
Откуда: РК

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

Сообщение muskin »

Да я и пытаюсь это сделать, но для реализации этого механизма необходимо одно число и одно действие - координата курсора внутри поля ввода и как затем переместить его в нужную позицию.
Как определить первое и сделать второе - я не знаю? Пытался что-то выяснить Debug-ером, не помогло. Подскажите.
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

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

Сообщение 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)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
muskin
Активист
Сообщения: 114
Зарегистрирован: 08 Декабрь 2009, 21:16
Откуда: РК

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

Сообщение muskin »

С согласия Admin-а добавил еще одну строчку в примере после OF ?Button3
OF ?Button3
loc:selstart=?loc:entry{Prop:selstart}-1
...
Все заработало, спасибо.
Никогда не обращал внимания, что у Select-а есть еще два дополнительных поля.
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
sgu66
Новичок
Сообщения: 7
Зарегистрирован: 16 Сентябрь 2007, 3:28

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

Сообщение 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).
Ответить