Как выделить текст в текстовом поле?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Как выделить текст в текстовом поле?

Сообщение arthur2 » 11.01.2009 (Вс) 15:28

Можно ли выделить текст так, чтобы курсор оказался не в конце текста, а в начале?

Стандартное:
Код: Выделить всё
           .SelStart = 0
           .SelLength = Len(.text)

ведёт к тому, что курсор оказывается в конце :(
Артур
 
   

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как выделить текст в текстовом поле?

Сообщение tyomitch » 11.01.2009 (Вс) 15:30

Можно только посылкой последовательности End, Shift+Home.
Изображение

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как выделить текст в текстовом поле?

Сообщение arthur2 » 11.01.2009 (Вс) 16:55

То-есть, с имитировать ввод с клавиатуры? Точно, я как-то не допёр. А если я пошлю ему сообщения типа кейдаун-кейап, это сработает, когда окно с полем невидимо? Чтобы когда окно покажется, селект уже был.

Я и сам проверю, но вдруг ты уже знаешь :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как выделить текст в текстовом поле?

Сообщение Хакер » 11.01.2009 (Вс) 18:31

[offtopic]
Ну вот. А keks-n летом критиковам мою идею сделать так, чтобы наши контроллы понимали отрицательный SelLength :? .
[/offtopic]
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как выделить текст в текстовом поле?

Сообщение arthur2 » 11.01.2009 (Вс) 21:33

Пробую сделать так:
Код: Выделить всё
txt.SelStart = Len(txt.Text)

SendMessage txt.hwnd, WM_KEYDOWN, VK_SHIFT, 0
SendMessage txt.hwnd, WM_KEYDOWN, VK_HOME, 0
SendMessage txt.hwnd, WM_KEYUP, VK_HOME, 0
SendMessage txt.hwnd, WM_KEYUP, VK_SHIFT, 0


Не срабатывает :( Конечно, я понимаю, что надо кейэвент или сендинпут... Но хотелось бы сделать селект заранее - когда окно ещё не видно. А может я просто шлю сообщение как-то не так?

Хакер
Ну вот. А keks-n летом критиковам мою идею сделать так, чтобы наши контроллы понимали отрицательный SelLength

А я как раз - за! Давно меня это раздражало, но оставил тогда как есть, а вот теперь - приспичило :)
Артур
 
   

Йода
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 99
Зарегистрирован: 06.01.2008 (Вс) 21:04
Откуда: Московская область

Re: Как выделить текст в текстовом поле?

Сообщение Йода » 11.01.2009 (Вс) 21:36

Если твоё текстовое поле имеет MultiLine = True, то выделяй текст посылая EM_SETSEL. Установив начальную позицию выделения больше конечной, ты получишь нужный результат. Но повторюсь: это работает только для многострочного текстбокса.
Sub or Function not defined

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как выделить текст в текстовом поле?

Сообщение arthur2 » 11.01.2009 (Вс) 21:52

Йода
Спасибо! Увы, у меня поля однострочные... но может, просто заменить их на мультилайн без скролов и дело с концом :) Надо попробовать - возможно, я так и сделаю
Артур
 
   

Йода
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 99
Зарегистрирован: 06.01.2008 (Вс) 21:04
Откуда: Московская область

Re: Как выделить текст в текстовом поле?

Сообщение Йода » 11.01.2009 (Вс) 22:13

Чтобы юзверь не испугался внезапно пропавшего текста - попробуй перед выделением устанавливать ES_MULTILINE, а после - снимать (сам я не пробовал, просто предположение). Если не сработает - более кривой вариант для текстбокса с постоянным мультилайном без скролов: обрабатывай нажатие на Enter, и ограничивай длинну текста.
Sub or Function not defined

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как выделить текст в текстовом поле?

Сообщение arthur2 » 11.01.2009 (Вс) 22:31

Ну да, в кейпрессе 13 заменять на ноль и бимкать :) Ну ещё, наверное, 32 на 160 - чтобы по словам не переносило
Артур
 
   

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как выделить текст в текстовом поле?

Сообщение tyomitch » 12.01.2009 (Пн) 1:12

arthur2, lParam у сообщения для красоты что ли?

Йода, добавлять/убирать ES_MULTILINE после создания контрола нельзя.
Изображение

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как выделить текст в текстовом поле?

Сообщение arthur2 » 12.01.2009 (Пн) 1:45

tyomitch
Честно - мне казалось, что и так должно сработать (хоум ведь работает), а заморачиваться со скан-кодами и прочим не хотелось :) Тем более, что большой уверенности, что делаю правильно, не было.

То есть, если lparam заполнить, всё правильно? И должно заработать? Тогда пойду копать в эту сторону
Артур
 
   

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как выделить текст в текстовом поле?

Сообщение tyomitch » 12.01.2009 (Пн) 3:23

Если заполнить, всё заработает.
Изображение

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как выделить текст в текстовом поле?

Сообщение arthur2 » 12.01.2009 (Пн) 10:50

Так как боялся что-нибудь перепутать и потом не знать, как искать глюк, получил значения lparam просто через субклассинг :)

Теперь код выглядит так:
Код: Выделить всё
   txt.SelStart = Len(txt.Text)
   SendMessage txt.hwnd, WM_KEYDOWN, VK_SHIFT,  &H402A0001
   SendMessage txt.hwnd, WM_KEYDOWN, VK_HOME, &H1470001
   SendMessage txt.hwnd, WM_KEYUP, VK_HOME,  &HC1470001
   SendMessage txt.hwnd, WM_KEYUP, VK_SHIFT,  &HC02A0001

Увы, код по-прежнему не работает (кроме хоума в нём :)
Артур
 
   

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как выделить текст в текстовом поле?

Сообщение tyomitch » 12.01.2009 (Пн) 13:55

Странно, я отлично помню, что у меня это работало.... Ну да ладно.
Вот так вот работает. (Сорри за синтаксис, VB6 под рукой не нашлось.)
Код: Выделить всё
        Dim ks(255) As Byte
        txt.SelectionStart = Len(txt.Text)
        GetKeyboardState(ks(0))
        ks(Keys.ShiftKey) = Byte.MaxValue
        SetKeyboardState(ks(0))
        SendMessage(txt.Handle, WM_KEYDOWN, Keys.Home, &H1470001)
        SendMessage(txt.Handle, WM_KEYUP, Keys.Home, &HC1470001)
        ks(Keys.ShiftKey) = 0
        SetKeyboardState(ks(0))
Изображение

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как выделить текст в текстовом поле?

Сообщение arthur2 » 12.01.2009 (Пн) 16:12

tyomitch
Ура! действительно заработало! Огромное спасибо!

Код: Выделить всё
        Dim ks As KeyboardBytes
        txt.SelStart = Len(txt.Text)
        GetKeyboardState ks
        ks.kbByte(VK_SHIFT) = 255 'Byte.MaxValue
        SetKeyboardState ks
        SendMessage txt.hwnd, WM_KEYDOWN, VK_HOME, 0 ' &H1470001
        SendMessage txt.hwnd, WM_KEYUP, VK_HOME, 0 ' &HC1470001
        ks.kbByte(VK_SHIFT) = 0
        SetKeyboardState ks

У меня сначала бейсик пару раз упал... но оказалось, что это GetKeyboardState, видимо, в win32.tlb криво прописана :(

Передекларировал руками и - уаля! - всё работает :) А lParam я из любопытства таки закомментировал :) Кстати, в связи с чем ещё крошечный вопросик: а скан-коды на разных клавах действительно могут оказаться совсем разными? или всё-же есть какой-то стандарт?
Артур
 
   

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как выделить текст в текстовом поле?

Сообщение tyomitch » 12.01.2009 (Пн) 16:32

У стандартных кнопок стандартные коды, у нестандартных -- нестандартные :-)
Изображение

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как выделить текст в текстовом поле?

Сообщение arthur2 » 12.01.2009 (Пн) 18:54

То есть, за основные клавиши можно не бояться? Это хорошо! А, допустим, слеш - которая бывает на разнык клавах в разных местах - у неё тоже сканкод везде одинаковый? (очень хочется на это надеяться :)
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

    TopList