LostFocus не срабатывает

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dima-pol
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 03.11.2008 (Пн) 17:47

LostFocus не срабатывает

Сообщение dima-pol » 27.01.2013 (Вс) 21:02

Я сделал пробную программу на VB6. Там есть текстбокс tbTest и кнопка.
Когда я из программы (по кнопке) даю команду
Код: Выделить всё
SendMessage tbTest.hwnd, WM_SETFOCUS, 0, ""

срабатывает Sub tbTest_GotFocus()

А как заставить сработать Sub tbTest_LostFocus() ?

Пробовал:
Код: Выделить всё
SendMessage tbTest.hwnd, WM_KILLFOCUS, 0, ""  и
SendMessage tbTest.Parent.hwnd, WM_COMMAND, &H6010000, byVal tbTest.hwnd

- не срабатывает (&H6010000 это EN_KILLFOCUS в старшем слове).

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: LostFocus не срабатывает

Сообщение ger_kar » 27.01.2013 (Вс) 21:17

Я конечно не знаю истинного замысла, но посылка оконных сообщений там никаким боком вообще не нужна.
dima-pol писал(а):А как заставить сработать Sub tbTest_LostFocus() ?
Ну для этого нужно чтобы контрол потерял фокус. Контрол потеряет фокус если фокус переместить на другой контрол. По сути оно должно срабатывать от самого факта нажатия на кнопку, ибо фокус переносится на кнопку в момент нажатия.
Бороться и искать, найти и перепрятать

dima-pol
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 03.11.2008 (Пн) 17:47

Re: LostFocus не срабатывает

Сообщение dima-pol » 28.01.2013 (Пн) 20:54

Да действительно, WM_SETFOCUS на другой объект заставляет сработать LostFocus. Спасибо.

Но было бы интересно узнать, почему не работает EN_KILLFOCUS. Тем более что в толстенной книге (Дан Эпплман «Win32 API для профессионалов…» стр 979) в описании EN_KILLFOCUS сказано «Сообщение генерирует событие Vb LostFocus»

Кстати я ошибся, Const EN_KILLFOCUS = &H200 поэтому првильнее наверно так:
SendMessage tbTest.Parent.hwnd, WM_COMMAND, &H2000000, byVal tbTest.hwnd

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: LostFocus не срабатывает

Сообщение FireFenix » 28.01.2013 (Пн) 21:02

dima-pol писал(а):Дан Эпплман «Win32 API для профессионалов…» стр 979

Ты же не используешь чистое WinAPI во всей программе! А частичный функционал оборачивает и берёт на себя VB6

dima-pol писал(а):Но было бы интересно узнать, почему не работает EN_KILLFOCUS.

Нужно знать как всё устроено внутри (скомпиленной программе) и работать с отладчиком, чтобы выяснить окончательно.
Возможно просто приложение не обрабатывает системное сообщение потери фокуса и LostFocus вызывается только при установке нового
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: LostFocus не срабатывает

Сообщение NashRus » 29.01.2013 (Вт) 11:45

dima-pol писал(а):Кстати я ошибся, Const EN_KILLFOCUS = &H200 поэтому првильнее наверно так:
SendMessage tbTest.Parent.hwnd, WM_COMMAND, &H2000000, byVal tbTest.hwnd


Почему так то, если константа другая?

dima-pol
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 03.11.2008 (Пн) 17:47

Re: LostFocus не срабатывает

Сообщение dima-pol » 29.01.2013 (Вт) 21:07

NashRus писал(а):Почему так то, если константа другая?


Потому что EN_KILLFOCUS это оповещающее сообщение и оно должно быть задано в качестве праметра для сообщения WM_COMMAND, а точнее должно быть задано в старшем слове wParam. Так сказано в книге (и проверено на оповещающем сообщении EN_CHANGE).

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

Re: LostFocus не срабатывает

Сообщение alex77755 » 30.01.2013 (Ср) 8:44

dima-pol писал(а):Я сделал пробную программу на VB6. Там есть текстбокс tbTest и кнопка.
Когда я из программы (по кнопке) даю команду
Код: Выделить всё
SendMessage tbTest.hwnd, WM_SETFOCUS, 0, ""

срабатывает Sub tbTest_GotFocus()

А как заставить сработать Sub tbTest_LostFocus() ?

Пробовал:
Код: Выделить всё
SendMessage tbTest.hwnd, WM_KILLFOCUS, 0, ""  и
SendMessage tbTest.Parent.hwnd, WM_COMMAND, &H6010000, byVal tbTest.hwnd

- не срабатывает (&H6010000 это EN_KILLFOCUS в старшем слове).


А когда я беру микроскоп и пытаюсь забить им гвоздь, то часто попадаю по пальцам: грутится зараза.
Объясни смысл танцев с бубноом?
почему не просто:
Код: Выделить всё
tbTest.SetFocus

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 30.01.2013 (Ср) 9:19

Я так понимаю, он хочеи убрать фокус с элемента, не устанавливая его ни на какой другой :)

dima-pol
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 03.11.2008 (Пн) 17:47

Re: LostFocus не срабатывает

Сообщение dima-pol » 30.01.2013 (Ср) 20:37

Конечная задача была - из проги на VB6 вставить данные в поля некоего спец.приложения (чужое). Причем вставить получилось быстро - с помощью WM_SETTEXT, но когда я увожу фокус с текстбокс - восстанавливается строе заначение!

Пришлось искать нужное сообщние, а поскольку у меня нет опыта работы с сообщениями, то я сначала их отрабатываю на своем текстбоксе. Сначала почему-то пришла мысль - убирать фокус с пом WM_KILLFOCUS или EN_KILLFOCUS, но с ними даже в VB6 не получилось.
Затем пробовал с EN_CHANGE, поскольку я сам часто сохраняю данные в своих прогах из Sub tb..._LostFocus() . Но в спец.приложении это не сработало.

Оказалось, что срабатывает, только если дать последовательно 3 обяз. сообщения: WM_SETFOCUS, WM_CHAR, WM_SETTEXT(необяз.) и WM_SETFOCUS на следущем техтбокс.

Т.о. решена только часть задачи, поскольку срабатывает - это значит, что становится активной кнопка Save(и Ctrl+s). Ctrl+s я пока делаю с пом. sendKeys. Но по опыту, sendKeys ненадежна штука и вроде медленнее чем сообщения (а у меня очень много данных), к тому-же спец.прога при этом как-то нервно пукает, как будто ей что-то не нравится (но данные сохраняет).

Т.о. эту тему наверно можно закрывать. Остается соседняя, про Ctrl+s.


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

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

Сейчас этот форум просматривают: Google-бот и гости: 44

    TopList