Переместить каретку на начало в ComboBox

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Переместить каретку на начало в ComboBox

Сообщение Space » 24.03.2009 (Вт) 23:40

cbx.Style=0. В событии Click пишу cbx.SelStart = 0. После выбора Item строка в Text выделяется и каретка мигает в конце строки, а мне надо в начале строки и желательно выделение всей строки. Как сделать?

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Переместить каретку на начало в ComboBox

Сообщение alex77755 » 25.03.2009 (Ср) 8:02

В начало строки можно таймером

Код: Выделить всё
Private Sub Комбо1_Click()
Часы1.Enabled = True
End Sub

Private Sub Часы1_Timer()
   Комбо1.SelStart = 0
  Часы1.Enabled = False
End Sub


А выделить и что б каретка была в начале не получается. А смысл? Если текс выделен, то независимо где каретка - при нажатии любой буквы весь текст удалится

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Переместить каретку на начало в ComboBox

Сообщение alex77755 » 25.03.2009 (Ср) 8:30

Впрочем получилось так:
Код: Выделить всё
Private Sub Часы1_Timer()
SendKeys "{RIGHT}"
   For i = 1 To Len(Комбо1.Text)
SendKeys "+{LEFT}"
   Next i
Часы1.Enabled = False
  End Sub

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Переместить каретку на начало в ComboBox

Сообщение Xcode » 25.03.2009 (Ср) 8:45

Код: Выделить всё
Private Sub cbx_Click()
SendKeys "{END}"
SendKeys "+{HOME}"
End Sub

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

Re: Переместить каретку на начало в ComboBox

Сообщение Хакер » 25.03.2009 (Ср) 12:40

Это всё криво, alex77755 правильно говорит, что нет разницы, где каретка. Так что не надо заниматься фигнёй.

Вариант с SendKeys крив ещё и потому, что нет гарантии, что фокус на комбике.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 25.03.2009 (Ср) 13:07

а что, фокус может резко уйти с комбика? Или SendKeys тормозит? Жалко, что в SendKeys нельзя указать hWnd... А насчёт того, где находится каретка, так это для того, чтобы текст был виден сначала, а не с конца, если текст не помещается в поле Text! Так что это не фигня, Хакер :)

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

Re: Переместить каретку на начало в ComboBox

Сообщение Хакер » 25.03.2009 (Ср) 13:13

Резко уйти он не может, по крайне мере, не должен по правилам.

Он может попросту не быть на комбике вообще.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 25.03.2009 (Ср) 13:25

но как же тогда происходит Click? Разве что при ListIndex=n... тогда перед посылкой нуно проверять наличие фокуса на комбике, ActiveControl вроде...

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 25.03.2009 (Ср) 13:31

а что если вместо SendKeys использовать SendMessage, указать hWnd комбика, только что запихнуть в Msg, wParam и lParam вместо "+{HOME}"?

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

Re: Переместить каретку на начало в ComboBox

Сообщение Хакер » 25.03.2009 (Ср) 13:36

Событие Click, которое по хорому должно было называться ItemSelected происходит когда был выбран какой-то пункт, и не важно, как он был выбран (мышкой, ListIndex-ом и т.д.).

а что если вместо SendKeys использовать SendMessage, указать hWnd комбика, только что запихнуть в Msg, wParam и lParam?

Ты понимаешь, почему SendKeys позволяет тебе сделать то, что ты хочешь? Судя по всему нет. Разберись с этим.
—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: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 25.03.2009 (Ср) 13:40

Артур
 
   

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 25.03.2009 (Ср) 14:08

Артур, я не понимаю, почему не срабатывает SendMessage Text1.hwnd, WM_KEYDOWN, VK_SHIFT, &H402A0001 как нажатие Shift, почему надо только через SetKeyboardState? И что за значение &H402A0001?

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

Re: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 25.03.2009 (Ср) 14:21

А ты весь топик посмотри - я тоже не понимаю, но не срабатывает :(

&H402A0001 - это состояние нужной клавиши, её сканкод и ещё чего-то. Значение получено было опытным путём через субклассинг, дабы быть уверенным, что сам я ничего не перепутал и не вычислил значение неправильно.

Но в результате оказалось, что вполне можно передать 0 (в коде же, который я привёл, это значение закомментировано), так что не заморачивайся :)
Артур
 
   

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

Re: Переместить каретку на начало в ComboBox

Сообщение Хакер » 25.03.2009 (Ср) 14:46

А вы подумайте головой, почему не срабатывает, а не бросайте не разобравшись.

Надо начать думать с того момента, почему не работает просто ковырянием свойств SelStart, SelLength.

Надо поставить эксперимент, вписать в обработчик события примерно такой код с бесконечным циклом:
Код: Выделить всё
    cbx.SelStart = 1
    cbx.SelLength = 2
    DoEvents
    Do
    Loop

И увидеть, что дёрганье свойства всё-таки меняет выделение (но не надолго). Сделать на основании этого эксперимента вывод, что SelectAll-выделение ставится уже после того, как происходит возврат из обработчика события.

Сделать вывод, что никакие попытки изменить диапазон выделения до возврата из обработчика события не пройдут. А пройдут после (поэтому срабатывает таймер, поэтому срабатывает SendKeys).

Почитать в документации по SendMessage, что SendMessage (в отличие от PostMessage) возвращает выполнение строго после того, как отработает своё WindowProc.
—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: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 25.03.2009 (Ср) 15:28

Хакер Вот блин... Действительно, PostMessage!!! А ведь я мог бы и сам тогда догадаться :oops:

Впрочем, проблема же была решена, хоть и в обход - так что особого стимула выискивать, почему не получилось в лоб, у меня тогда как-то не возникло.
Артур
 
   

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 25.03.2009 (Ср) 16:44

Хакер, то, что выделение происходит после обработчика события ты Америку не открыл. Это было видно, так как cbx.SelStart = 0 не срабатывал. А вот за PostMessage спасибо. Но как ни странно, PostMessage тоже не работает. Тест на TextBox:
Код: Выделить всё
Option Explicit
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const VK_HOME = &H24
Private Const VK_SHIFT = &H10
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101

Private Sub Text1_GotFocus()

    Text1.SelStart = Len(Text1.Text)
'    SendKeys "+{HOME}"
    PostMessage Text1.hwnd, WM_KEYDOWN, VK_SHIFT, 0 ' &H402A0001
    PostMessage Text1.hwnd, WM_KEYDOWN, VK_HOME, 0 '&H1470001
    PostMessage Text1.hwnd, WM_KEYUP, VK_HOME, 0 '&H1470001
    PostMessage Text1.hwnd, WM_KEYUP, VK_SHIFT, 0 '&HC02A0001
End Sub

Ещё интересно, что при использовании SendKeys антивир KIS говорит:
Вложения
SendKeys.png
скрин сообщения антивира
SendKeys.png (31.19 Кб) Просмотров: 2797

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Переместить каретку на начало в ComboBox

Сообщение MIT » 25.03.2009 (Ср) 16:57

ИМХО, для перемотки текстбоксов есть нормальный способ.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 25.03.2009 (Ср) 17:36

MIT, ты вообще понял, о чём тут речь?
Где энтот вумный Хакер? Ожидается истина в формировании сообщения одновременного нажатия Shift+Home не через SendKeys :)
Последний раз редактировалось Space 25.03.2009 (Ср) 18:02, всего редактировалось 2 раз(а).

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Переместить каретку на начало в ComboBox

Сообщение MIT » 25.03.2009 (Ср) 17:59

Space писал(а):MIT, ты вообще понял, о чём тут речь?
:?

Space писал(а):После выбора Item строка в Text выделяется и каретка мигает в конце строки, а мне надо в начале строки и желательно выделение всей строки.
Space писал(а):это для того, чтобы текст был виден сначала, а не с конца, если текст не помещается в поле Text!
Space писал(а):PostMessage тоже не работает. Тест на TextBox


чтобы текст был виден сначала в TextBox`е юзай нормальный способ
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 25.03.2009 (Ср) 18:01

MIT, расслабься...

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Переместить каретку на начало в ComboBox

Сообщение MIT » 25.03.2009 (Ср) 18:05

Space писал(а):расслабься...
Не понял. Можно поподробнее?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 25.03.2009 (Ср) 18:45

Хакер, сообщения
Код: Выделить всё
    PostMessage cbx.hwnd, WM_KEYDOWN, VK_SHIFT, 0 ' &H402A0001
    PostMessage cbx.hwnd, WM_KEYDOWN, VK_HOME, 0 '&H1470001

не лепятся в одно как Shift+Home, а идут раздельно, при том приходят почему-то дважды:
Код: Выделить всё
Option Explicit
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const VK_HOME = &H24
Private Const VK_SHIFT = &H10
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101


Private Sub cbx_Click()
Debug.Print "cbx_Click"
    cbx.SelStart = Len(cbx.Text)
'    SendKeys "+{HOME}"
    PostMessage cbx.hwnd, WM_KEYDOWN, VK_SHIFT, 0 ' &H402A0001
    PostMessage cbx.hwnd, WM_KEYDOWN, VK_HOME, 0 '&H1470001
    PostMessage cbx.hwnd, WM_KEYUP, VK_HOME, 0 '&H1470001
    PostMessage cbx.hwnd, WM_KEYUP, VK_SHIFT, 0 '&HC02A0001

End Sub

Private Sub cbx_KeyDown(KeyCode As Integer, Shift As Integer)
Debug.Print KeyCode, Shift
End Sub

Private Sub Form_Load()
    cbx.Text = ""
    cbx.AddItem "1234567890"
    cbx.AddItem "0987654321"
   
End Sub

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

Re: Переместить каретку на начало в ComboBox

Сообщение Хакер » 25.03.2009 (Ср) 18:57

Space, ты может для начала почитаешь про второй параметр сообщений? :|
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 25.03.2009 (Ср) 21:35

про lParam уже прочитал, никакие флаги там не помогают.

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

Re: Переместить каретку на начало в ComboBox

Сообщение Хакер » 25.03.2009 (Ср) 21:39

Как минимум, я не знаю, на что можно надеяться, передавая 0 в качесиве РепитКаунт. Там не флаги, там целая структура.
—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: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 25.03.2009 (Ср) 22:05

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

Но если их раскомментировать, код всё равно не заработает :(


Space Впрочем, если интерес чисто практический, то код, который по моей ссылке - Тёмычевский - работает нормально, можно его взять и не париться.
Артур
 
   

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 25.03.2009 (Ср) 22:23

я разобрал уже эту структуру, в инете тоже куча вопросов на тему посылки этих двух сообщений с целью генерации Shift+Key, как ни странно, всё упирается в SetKeyboardState, как будто когда происходит обработка сообщений, без GetKeyboardState не обходится, хотя, ясно, что 2 подряд WM_KEYDOWN - одновременно нажатые клавиши, а если вызывать GetKeyboardState, то на момент обработки сообщений Shift может быть отжат...

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Переместить каретку на начало в ComboBox

Сообщение Space » 25.03.2009 (Ср) 23:19

а SendKeys это обёртка над keybd_event?

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

Re: Переместить каретку на начало в ComboBox

Сообщение Хакер » 26.03.2009 (Чт) 10:54

Там у него закомментированые значения - полученные субклассингом, специально чтобы не запутаться в слишком уж запутанной структуре и не гадать, от чего же код не работает.

Я их разобрал. Они тоже неправильные.
—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: Переместить каретку на начало в ComboBox

Сообщение arthur2 » 26.03.2009 (Чт) 11:06

А как такое могло получиться? Я брал те самые значения, которые приходят в окно при реальном нажатии и отпускании этих клавиш.
Артур
 
   

След.

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

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

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

    TopList