powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Опять про позицию курсора в TextBox
16 сообщений из 16, страница 1 из 1
Опять про позицию курсора в TextBox
    #40071532
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На форуме прочитал такое:

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?
Но только мне надо с примером. Сам я тут вряд ли разберусь.
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40071758
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. не понял. В чем проблема?
2. как я понимаю, курсор будет стоять на selEnd (lParam). Если его надо перемещать из начала в конец и/или наоборот - просто selStart (wParam) и selEnd (lParam) меняем местами
https://docs.microsoft.com/ru-ru/windows/win32/controls/em-setsel
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40071827
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 происходит какая-то полная чушь: во-первых ему зачем-то нужно выставить
скроллинг без которого он просто не работает. Во-вторых, при перетаскивании
в окно файла - ты получаешь какой-то дебильный пакет и все-такое.. Как бороться с этим
идиотизмом я не знаю, поэтому у меня обычный текстбокс, который я теперь не знаю как
научить менять цвет для части текста, потому что штатной такой функции он не имеет.
Вот примерно такие проблемы.)
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40071852
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, первая задача нерешаема в принципе. Так что полет в космос отменяется.
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40072446
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Позицию курсора в текстовом поле можно получить API функцией GetCaretPos
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40072495
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, о каком конкретно контроле идет речь, для Oracle Forms Text Item'а (скорее всего все равно сделанного на основе стандартного), через обычный EM_SETSEL у меня курсор устанавливался . Насколько я помню.

Хотелки достаточно странные. Text Item и поведение кнопок внутри него - стандартный 100500 лет, зачем нужно поведение кнопок переопределять, мне вообразить сложно.

Принципиальных сложностей я не вижу, хотя возможно это потому, что еще не начал программировать и не смог оценить всей глубины "не имеет решения вообще". Как я сказал, много-много лет назад у меня все замечательно устанавливалось.
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40072497
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Устанавливать курсор, выделение текста - собственно данный топик. IMHO без проблем. Что там "не имеет решения вообще" мне не понятно.
Но как автор на Basic'е собирается перехватывать очередь сообщений - я плохо представляю.

надо, чтобы при нажатии клавиши Home (или пусть будет Shift+Home или другая комбинация с Home)
это же надо не просто курсор устанавливать, а очередь сообщений перехватить и обработать. IMHO & AFAIK
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40072526
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в последнем сообщении был не прав.

VB вроде onKeyUp, onKeyDown, onKeyPress позволяет отловить, возможно можно и через них. Тут нужно делать форму, проверять, что и как доходит, в какой момент. Я таких деталей про VB не знаю.

И вроде в VB6 можно и свои callback'и пропихивать. Опять таки, таких деталей про VB не знаю.

По SendMessage и EM_SETSEL пример элементарно находится в google:
http://www.jasinskionline.com/windowsapi/ref/e/em_setsel.html
не проверял
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40072560
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда я сказал, что не имеет решения:
На этот момент я мог считать позицию курсора (каретки). GetCaretPos, GetCursorPos методы. Т.е. сначала нужно определить позиции выделенного фрагмента. Где установлен курсор мы игнорируем, т.к. мы относительно текста этого все равно не узнаем, да это и неважно. Поясняю - если текст был выделен слева направо - курсор будет в конце, если справа налево - курсор в начале. Мы же просто
определяем выделенный фрагмент. Затем - снимаем выделение. Ставим курсор в начало. Снимаем показание его положения. Ставим курсор в конец - снимаем положение курсора в конце. Вот у нас две величины pos_start и pos_end. После этого мы должны вернуть выделенный фрагмент! И с этого момента наши величины ничем нам не помогут, потому что
SetCaretPos, SetCursorPos не могут установить курсор в нужное положение. Как только мы программно выделяем фрагмент текста через Text1.SelStart + Text1.SelLength курсор оказывается в конце текста и ему все равно на твои команды. Даже если они что-то делают, ты этого не увидишь (он перестает мигать), а Text1.Refresh возвращает курсор в конец. Я нашел, что никакого толку от SetCaretPos, когда ты хочешь установить курсор в пределах выделенного фрагмента - нет. Вот если ты скажешь, что хочешь отправить курсор в x = 0, y = 0 - то это работает прекрасно, а на остальное ему начхать. Не знаю, может есть еще какие-то подводные камни и оно каким-то чертом решается, но я решение не нашел.
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40072569
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsevэто же надо не просто курсор устанавливать, а очередь сообщений перехватить и обработать.

Скорее всего примерно так и есть.. нужно блокировать стандартное поведение виндовой API, заменяя на свое. Даже, если условно считать это возможным - это скорее всего приведет лишь к падению IDE, каким-нибудь глюкам и т.д. Это равносильно "не имеет решения". Ну мне так кажется.
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40072602
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На самом деле с клавишами типа Home реальная засада, потому что вот такой код например
прекрасно работает с клавишей PgUp и не работает с клавишей Home никакими стандартными способами.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If Text1.SelLength > 0 Then             'когда есть выделенный текст
  If Shift = 1 Then                            'нажимаем шифт
    If KeyCode = vbKeyPageUp Then  'получаем комбинацию Shift+PgUp
    Text1.SelStart = 0: Text1.SelLength = Len(Text1.Text)  'выделяем весь имеющийся текст (просто пример)
    End If
  End If
End If
End sub



C клавишей Home это не работает.
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40072672
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
На самом деле с клавишами типа Home реальная засада, потому что вот такой код например
прекрасно работает с клавишей PgUp и не работает с клавишей Home никакими стандартными способами.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If Text1.SelLength > 0 Then             'когда есть выделенный текст
  If Shift = 1 Then                            'нажимаем шифт
    If KeyCode = vbKeyPageUp Then  'получаем комбинацию Shift+PgUp
    Text1.SelStart = 0: Text1.SelLength = Len(Text1.Text)  'выделяем весь имеющийся текст (просто пример)
    End If
  End If
End If
End sub



C клавишей Home это не работает.


C какой стати это код должен работать с клавишей Home? Здесь нет кода который обрабатывает ее нажатие.
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40072997
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
На самом деле с клавишами типа Home реальная засада, потому что вот такой код например
прекрасно работает с клавишей PgUp и не работает с клавишей Home никакими стандартными способами.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If Text1.SelLength > 0 Then             'когда есть выделенный текст
  If Shift = 1 Then                            'нажимаем шифт
    If KeyCode = vbKeyPageUp Then  'получаем комбинацию Shift+PgUp
    Text1.SelStart = 0: Text1.SelLength = Len(Text1.Text)  'выделяем весь имеющийся текст (просто пример)
    End If
  End If
End If
End sub



C клавишей Home это не работает.

посмотрите эту тему Создание в форме кнопки с быстрым к ней доступом по сочетанию (горячие клавиши)
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40073259
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot,

Спасибо, конечно. Посмотрел. Только что я там должен был увидеть - непонятно. Если вы про то, что
возможно (или точно) там некоторые сочетания клавиш запрещены, так ведь я не макрос пишу в экселе
или аксесе (1). Суть не в том, что клавиша Home не работает вообще - суть в том, что она работает
неправильно (или непредсказуемо на взгляд пишущего) (2), так что запрета как такового нет.

Вы бы сами сначала код попробовали, а потом бы говорили (это ко всем относится). Как ведет себя Home
например в блокноте? Перемещает курсор в начало строки. В коде, который я привел vbKeyHome не может
выделить весь текст, т.к. последняя строка остается не выделенной и курсор оказывается в начале
последней строки. Это значит, что поведение клавиши, заложенное на уровне API переопределяет то,
что ты от нее хочешь. В других случаях, ее поведение более непредсказуемо, т.к. она вместо выделения
текста тупо его удваивает, т.е. копирует и тут же вставляет. Странно, правда?

С другой стороны, когда выделенного текста нет - поведение Home-End я переопределил без проблем, сделав
так чтобы Home отправляла курсор в начало текста (не начало строки), а End - в конец текста (не конец строки).

В любом случае, мне пришлось отказаться от сочетания Shift+Home(End), заменив на PgUp(PgDown). Просто
то, что было назначено на PgUp(PgDown) теперь придется отдавать другим клавишам.

В целом, данная проблема для меня уже неактуальна. Меня теперь больше интересует как в обычном
TextBox (не RichTextBox) выделять часть(!) текста другим цветом.
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40073295
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77

В целом, данная проблема для меня уже неактуальна. Меня теперь больше интересует как в обычном
TextBox (не RichTextBox) выделять часть(!) текста другим цветом.


а тебя не интересует, как в обычном TextBox (не RichTextBox) нарисовать пять перпендикулярных линий, при этом две красные, две прозрачные, а остальные три в форме котика?

p.s. никак
...
Рейтинг: 0 / 0
Опять про позицию курсора в TextBox
    #40073306
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

Про котиков очень интересует.) А если серьезно, конечно я подозреваю, что никак... но я решил, что возможно более сведущие товарищи знают какой-нибудь workaround. Штатно конечно никак, но вдруг можно каким-то более хитрым способом это делать?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Опять про позицию курсора в TextBox
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]