|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
На форуме прочитал такое: Antonariy Можешь апать до посинения. Проблема с установкой курсора не имеет решения ВООБЩЕ. Переменная внутри текстобокса, отвечающая за позицию каретки, имеет тип short (integer), ограниченный 32к. При работе с ней через апи и при установке значений больше 32к запрос позиции начинает возвращать отрицательные значения. Среда VB 6.0 Но у меня TextBox маленький и он ограничен по кол-ву знаков. 1. Отсюда таки вопрос - как узнать позицию курсора через это апи??? SelStart мне не подходит. Note: Так же интересно какие "отрицательные значения он возвращает"? Не уходит ли он просто до -32768. Нам то какая разница - можно же юзать Abs и тогда бы вышло, что практический потолок 65536, а не 32767 символов... 2. Актуально на будущее. В идеале мне хотелось бы сделать следующее (не уверен, что это реально): когда внутри TextBox'а есть выделенный текст надо, чтобы при нажатии клавиши Home (или пусть будет Shift+Home или другая комбинация с Home) курсор внутри выделения перемещался бы в начало выделения, а при нажатии End (или Shift+End) соответственно в конец выделения. Т.е. если курсор уже в конце выделения - то просто ничего не должно происходить, а если в начале, то он должен переместиться. При этом разумеется само выделение не должно как-то изменяться, а должно оставаться прежним. Собственно говоря как вообще перемещать курсор внутри выделенного текста, чтобы само выделение сохранялось (например, пока не кликнешь по тексту)? У меня вышло только, что при нажатии комбинации кл. выделение быстро перемещается от позиции SelStart в начало или конец строки (в зависимости от нажатой клавиши, такое же поведение собственно у блокнота), а затем возвращается в запомненное состояние, т.е. с артефактами моргания на экране + переместить сам курсор я так и не придумал как - т.е. вопрос в том можно ли переместить курсор не с помощью SelStart а через что-нибудь еще.. api? Но только мне надо с примером. Сам я тут вряд ли разберусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2021, 00:11 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
1. не понял. В чем проблема? 2. как я понимаю, курсор будет стоять на selEnd (lParam). Если его надо перемещать из начала в конец и/или наоборот - просто selStart (wParam) и selEnd (lParam) меняем местами https://docs.microsoft.com/ru-ru/windows/win32/controls/em-setsel ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2021, 18:46 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, В чем проблема?)) Просто я новичок и для меня это как для Вас шаттл в космос запустить, ну примерно.) Я писал только скрипты на vbs, а теперь пытаюсь прикрутить к этому интерфейс на VB 6.0. А так никаких проблем. Просто ничего не понятно. Эта ссылка, что Вы дали вероятно правильная и полезная, вот только я не уверен, что это будет работать на XP (мой косяк - забыл озвучить). Я пробовал юзать SetCaretPos и оно действительно работает, только вот курсор перемещается совсем не туда, куда нужно, а получить координаты я не могу т.к. Dim p As Point не работает в VB 6, а работает видимо в .NET. А главное в том, что это все равно ничего не даст - потому что максимум, что можно получить - это координаты текущего положения курсора, а не рассчитать те, которые нужны, чтобы переместить его в нужное место. Что касается wParam и прочей ерунды вероятно мне надо куда-то в SendMessage Lib "user32" или DefWindowProc Lib "user32".. но что с ними делать дальше я без понятия. У меня обычный TextBox. Кнопке Home я назначил перемещение в начало текста. End в конец. Но я хочу чтобы это было так, когда нет выделенного текста, а когда он есть, чтобы Home-End перемещали курсор в пределах выделения, а само выделение не исчезало до нажатия например левой кнопки мыши. Другая проблема, которую я тоже не знаю как решить - это изменять цвет части текста, а не во всем текстбоксе. Вроде это можно легко сделать в RichTextBox, но я его попробовал и мне показалось, что это какая-то хрень. В обычном текстбоксе DragDrop работает у меня как надо, я могу сразу получить полный путь к файлу, загрузить в окно его содержимое и т.п. А в этом Rich происходит какая-то полная чушь: во-первых ему зачем-то нужно выставить скроллинг без которого он просто не работает. Во-вторых, при перетаскивании в окно файла - ты получаешь какой-то дебильный пакет и все-такое.. Как бороться с этим идиотизмом я не знаю, поэтому у меня обычный текстбокс, который я теперь не знаю как научить менять цвет для части текста, потому что штатной такой функции он не имеет. Вот примерно такие проблемы.) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 03:02 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
В общем, первая задача нерешаема в принципе. Так что полет в космос отменяется. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 09:36 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
Позицию курсора в текстовом поле можно получить API функцией GetCaretPos ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 13:28 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
Не знаю, о каком конкретно контроле идет речь, для Oracle Forms Text Item'а (скорее всего все равно сделанного на основе стандартного), через обычный EM_SETSEL у меня курсор устанавливался . Насколько я помню. Хотелки достаточно странные. Text Item и поведение кнопок внутри него - стандартный 100500 лет, зачем нужно поведение кнопок переопределять, мне вообразить сложно. Принципиальных сложностей я не вижу, хотя возможно это потому, что еще не начал программировать и не смог оценить всей глубины "не имеет решения вообще". Как я сказал, много-много лет назад у меня все замечательно устанавливалось. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 16:08 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
Устанавливать курсор, выделение текста - собственно данный топик. IMHO без проблем. Что там "не имеет решения вообще" мне не понятно. Но как автор на Basic'е собирается перехватывать очередь сообщений - я плохо представляю. надо, чтобы при нажатии клавиши Home (или пусть будет Shift+Home или другая комбинация с Home) это же надо не просто курсор устанавливать, а очередь сообщений перехватить и обработать. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 16:11 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
в последнем сообщении был не прав. VB вроде onKeyUp, onKeyDown, onKeyPress позволяет отловить, возможно можно и через них. Тут нужно делать форму, проверять, что и как доходит, в какой момент. Я таких деталей про VB не знаю. И вроде в VB6 можно и свои callback'и пропихивать. Опять таки, таких деталей про VB не знаю. По SendMessage и EM_SETSEL пример элементарно находится в google: http://www.jasinskionline.com/windowsapi/ref/e/em_setsel.html не проверял ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 17:16 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
Когда я сказал, что не имеет решения: На этот момент я мог считать позицию курсора (каретки). GetCaretPos, GetCursorPos методы. Т.е. сначала нужно определить позиции выделенного фрагмента. Где установлен курсор мы игнорируем, т.к. мы относительно текста этого все равно не узнаем, да это и неважно. Поясняю - если текст был выделен слева направо - курсор будет в конце, если справа налево - курсор в начале. Мы же просто определяем выделенный фрагмент. Затем - снимаем выделение. Ставим курсор в начало. Снимаем показание его положения. Ставим курсор в конец - снимаем положение курсора в конце. Вот у нас две величины pos_start и pos_end. После этого мы должны вернуть выделенный фрагмент! И с этого момента наши величины ничем нам не помогут, потому что SetCaretPos, SetCursorPos не могут установить курсор в нужное положение. Как только мы программно выделяем фрагмент текста через Text1.SelStart + Text1.SelLength курсор оказывается в конце текста и ему все равно на твои команды. Даже если они что-то делают, ты этого не увидишь (он перестает мигать), а Text1.Refresh возвращает курсор в конец. Я нашел, что никакого толку от SetCaretPos, когда ты хочешь установить курсор в пределах выделенного фрагмента - нет. Вот если ты скажешь, что хочешь отправить курсор в x = 0, y = 0 - то это работает прекрасно, а на остальное ему начхать. Не знаю, может есть еще какие-то подводные камни и оно каким-то чертом решается, но я решение не нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 18:53 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevэто же надо не просто курсор устанавливать, а очередь сообщений перехватить и обработать. Скорее всего примерно так и есть.. нужно блокировать стандартное поведение виндовой API, заменяя на свое. Даже, если условно считать это возможным - это скорее всего приведет лишь к падению IDE, каким-нибудь глюкам и т.д. Это равносильно "не имеет решения". Ну мне так кажется. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 20:18 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
На самом деле с клавишами типа Home реальная засада, потому что вот такой код например прекрасно работает с клавишей PgUp и не работает с клавишей Home никакими стандартными способами. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
C клавишей Home это не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 02:45 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
user-77 На самом деле с клавишами типа Home реальная засада, потому что вот такой код например прекрасно работает с клавишей PgUp и не работает с клавишей Home никакими стандартными способами. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
C клавишей Home это не работает. C какой стати это код должен работать с клавишей Home? Здесь нет кода который обрабатывает ее нажатие. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2021, 11:43 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
user-77 На самом деле с клавишами типа Home реальная засада, потому что вот такой код например прекрасно работает с клавишей PgUp и не работает с клавишей Home никакими стандартными способами. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
C клавишей Home это не работает. посмотрите эту тему Создание в форме кнопки с быстрым к ней доступом по сочетанию (горячие клавиши) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 10:06 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
HandKot, Спасибо, конечно. Посмотрел. Только что я там должен был увидеть - непонятно. Если вы про то, что возможно (или точно) там некоторые сочетания клавиш запрещены, так ведь я не макрос пишу в экселе или аксесе (1). Суть не в том, что клавиша Home не работает вообще - суть в том, что она работает неправильно (или непредсказуемо на взгляд пишущего) (2), так что запрета как такового нет. Вы бы сами сначала код попробовали, а потом бы говорили (это ко всем относится). Как ведет себя Home например в блокноте? Перемещает курсор в начало строки. В коде, который я привел vbKeyHome не может выделить весь текст, т.к. последняя строка остается не выделенной и курсор оказывается в начале последней строки. Это значит, что поведение клавиши, заложенное на уровне API переопределяет то, что ты от нее хочешь. В других случаях, ее поведение более непредсказуемо, т.к. она вместо выделения текста тупо его удваивает, т.е. копирует и тут же вставляет. Странно, правда? С другой стороны, когда выделенного текста нет - поведение Home-End я переопределил без проблем, сделав так чтобы Home отправляла курсор в начало текста (не начало строки), а End - в конец текста (не конец строки). В любом случае, мне пришлось отказаться от сочетания Shift+Home(End), заменив на PgUp(PgDown). Просто то, что было назначено на PgUp(PgDown) теперь придется отдавать другим клавишам. В целом, данная проблема для меня уже неактуальна. Меня теперь больше интересует как в обычном TextBox (не RichTextBox) выделять часть(!) текста другим цветом. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 18:28 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
user-77 В целом, данная проблема для меня уже неактуальна. Меня теперь больше интересует как в обычном TextBox (не RichTextBox) выделять часть(!) текста другим цветом. а тебя не интересует, как в обычном TextBox (не RichTextBox) нарисовать пять перпендикулярных линий, при этом две красные, две прозрачные, а остальные три в форме котика? p.s. никак ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 20:07 |
|
Опять про позицию курсора в TextBox
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Про котиков очень интересует.) А если серьезно, конечно я подозреваю, что никак... но я решил, что возможно более сведущие товарищи знают какой-нибудь workaround. Штатно конечно никак, но вдруг можно каким-то более хитрым способом это делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 20:40 |
|
|
start [/forum/topic.php?fid=60&msg=40072526&tid=2154722]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 274ms |
total: | 395ms |
0 / 0 |