Запретить окну терять фокус

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

Запретить окну терять фокус

Сообщение Source » 13.10.2007 (Сб) 20:50

Есть проблема - показано модальное окно и надо показать ещё немодальное окно из кода родительского модуля (фокус должен оставаться у модального окна) - выходит ошибка. Так вот, думаю, если показать модальное окно как немодальное, но тогда надо запретить окну терять фокус, как это можно сделать? Или можно как-то иначе? Почему существуют такие эквивалентные события, как Form_Deactivate и Form_LostFocus, которые ещё и не имеют флага Cancel?

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

Сообщение Хакер » 13.10.2007 (Сб) 20:53

Показывать немодальное окно надо до показа модального.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 14.10.2007 (Вс) 1:19

уж никак не получится

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

Сообщение Хакер » 14.10.2007 (Вс) 9:40

Почему?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 16.10.2007 (Вт) 8:53

потому. С модальными окнами разобрался. Теперь надо как-то показать немодальное окно, чтобы оно у текущего не забирало фокус. Возврат фокуса не приемлем...

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

Сообщение Хакер » 16.10.2007 (Вт) 12:43

потому.


Восхитительный ответ. Тогда и я, чтобы не отставать от тебя отвечу: делай как-нибудь так.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 16.10.2007 (Вт) 23:09

Родной, если бы я мог показать немодальное окно до модального, вопроса бы не возникло. Естественно, если не знаешь полезного ответа, зачем флудить? Тем более, что вопрос несколько поменял ориентацию :)

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 16.10.2007 (Вт) 23:17

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

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 17.10.2007 (Ср) 0:03

зачем мне проводить с чем-то аналогию? Каждая программа уникальна и работает так, как ей надо. Если бы был флаг при показе окна "Не передавать окну фокус", вроде Form2.Show fNoSetFocus всё было бы просто. Но я действительно нигде такого не встречал, вряд ли Майкрософт позаботилась об этом, но разве я не могу потешить себя надеждой и спросить глупость с вашей точки зрения, а вдруг? Тем более, что я также не видел нигде более 2-х передавемых параметров при показе формы - Form2.Show vbModal, frmParent. Может, я чего-то не знаю?

$Yastrebov$
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 154
Зарегистрирован: 24.01.2007 (Ср) 7:27
Откуда: Ukraine

Сообщение $Yastrebov$ » 17.10.2007 (Ср) 0:06

Естественно, если не знаешь полезного ответа, зачем флудить?


Хакер искренни пытался тебе помочь, а ты без основания на то, ему нахамил. Кто захочет после этого тебе что-то писать?!

Если уже так припекло то можно так:

Код: Выделить всё
Private Sub Form_Deactivate()
Me.SetFocus
End Sub
Жизнь, она как коробка конфет - никогда не знаешь, что вытянешь!

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 17.10.2007 (Ср) 0:26

$Yastrebov$ писал(а):
Естественно, если не знаешь полезного ответа, зачем флудить?


Хакер искренни пытался тебе помочь, а ты без основания на то, ему нахамил. Кто захочет после этого тебе что-то писать?!



Я оценил искреннюю помощь Хакера. В чём вы углядели хамство?

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 17.10.2007 (Ср) 0:42

Меня волновало то, что при возврате фокуса форме надо будет установить фокус контролу, имевшему фокус. Вариант
Код: Выделить всё
Private Sub Form_Deactivate()
Me.SetFocus
End Sub

я не допускал, т.к. думал, что при установке фокуса форме фокус получит контрол с меньшим TabIndex, но когда протестил, оказалось, что это не так, фокус остаётся на месте! Может, лучше было бы так
Me.ActiveControl.SetFocus

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 17.10.2007 (Ср) 1:18

лучше спросим у Хакера - ты обиделся и за что?

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

Сообщение Хакер » 17.10.2007 (Ср) 15:28

зачем мне проводить с чем-то аналогию? Каждая программа уникальна и работает так, как ей надо. Если бы был флаг при показе окна "Не передавать окну фокус", вроде Form2.Show fNoSetFocus всё было бы просто. Но я действительно нигде такого не встречал, вряд ли Майкрософт позаботилась об этом, но разве я не могу потешить себя надеждой и спросить глупость с вашей точки зрения, а вдруг? Тем более, что я также не видел нигде более 2-х передавемых параметров при показе формы - Form2.Show vbModal, frmParent. Может, я чего-то не знаю?


Майкрософт ни в коем случае не должна заботиться о добавлении поддержки кривых принципов. Почему кривых принципов? Потому что суть модального окна в том, чтобы не дать пользователю работать с программой, пока он не закончит работать с модальным диалоговым окном. Если требуется, чтобы можно было работать с двумя или более окнами одновременно - не делай окно модальным. Возможно, в данном случае вообще ошибочно используется модальность - вероятнее всего, вместо owner-инга.

Но, для тех, кому невтерпёж сделать всё по-своему есть мега-хитрость, а именно:

Код: Выделить всё
ModalForm.Show vbModal, someWindow
..... .... ....

' И тут нам надо показать немодальную форму под модальной
ModalForm.Visible = False
NonModalForm.Show
ModalForm.Visible = True


Также можно (или даже нужно) заменить изменения свойства на Hide/Show.



лучше спросим у Хакера - ты обиделся и за что?

Нет, ты меня этим не обидел (обидеть меня могут лишь те, кого я сильно уважаю, кто является мне другом, те - к чьим словам я всегда прислушываюсь. Вот от них поганые слова задевают душу), но отбил желание отвечать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Source
Постоялец
Постоялец
 
Сообщения: 351
Зарегистрирован: 04.09.2007 (Вт) 11:21

Сообщение Source » 17.10.2007 (Ср) 21:15

Хакер, ты не раз мне помогал советом, я тебе всегда благодарен, и если я тебя обидел, прошу прощения - я не гордый, но пожалуйста, не надо философии в моих топиках, я замечаю, что тебя тянет больше на философию. Кода люди смотрят на твои философские посты, они считают мой вопрос либо неправильным, либо неполным, этому также способствует твой рейтинг. И в результате затянувшейся дискуссии они либо теряют интерес, либо забывают о корне проблемы ( могут отвлечься от темы, уйти в не ту степь), также многие не спешат ответить (не лезут поперёд батька в пекло), а ждут, когда все точки над "и" будут расставлены, тогда, если всё зайдёт в тупик, могут помочь. Как видишь, я тоже могу пофилосовствовать, так что извини, если я снова тебя обидел :)
И знаете, я забил на модальность и сделал все формы немодальными, также сделал их выгрузку при клике на родительском окне. Если юзер кликает на родительском окне, значит оно ему надо и дочерняя форма скорее всего уже не нужна (а у меня нет дочерних форм которые нужны постоянно). Также учёл клик на иконке.


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

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

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

    TopList