Не работает Deactivate

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

Не работает Deactivate

Сообщение Gfif21 » 21.12.2004 (Вт) 16:11

В моей проге необходимо останавливать процесс, если окно стало неактивным. Я написал небольшую прогу, чтобы протестировать это событие:
Код: Выделить всё
Dim n As Integer, nn As Integer
--------------------------------------------------------------------------------
Private Sub Form_Load()
n=0
nn = 1
End Sub
--------------------------------------------------------------------------------
Private Sub Form_Activate()
nn = 1
End Sub
--------------------------------------------------------------------------------
Private Sub Form_Deactivate()
nn = 0
End Sub
--------------------------------------------------------------------------------
Private Sub Timer1_Timer()
n = n + nn
Label1.Caption = Str$(n)
End Sub

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

Но прога почему-то не работает - когда окно становится неактивным, число все равно увеличивается на 1 каждую секунду. :roll:

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 21.12.2004 (Вт) 16:14

попробуй Timer=False при деактивации делать, а при получении фокуса опять запускать

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 21.12.2004 (Вт) 16:23

Konst_One писал(а):попробуй Timer=False при деактивации делать, а при получении фокуса опять запускать

Все равно число растет.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 21.12.2004 (Вт) 16:26

проверяй возникновение событий. Поставь msgbox-ы и смотри, что и когда у тебя происходит или лог подробный пиши в файл, а потом анализируй

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.12.2004 (Вт) 16:28

А не лучше ли использовать
Код: Выделить всё
Dim n As Integer, fPaused As Boolean
--------------------------------------------------------------------------------
Private Sub Form_Load()
n=0
End Sub
--------------------------------------------------------------------------------
Private Sub Form_Activate()
fPaused = False
End Sub
--------------------------------------------------------------------------------
Private Sub Form_Deactivate()
fPaused = True
End Sub
--------------------------------------------------------------------------------
Private Sub Timer1_Timer()
If fPaused Then Exit Sub
n = n + nn
Label1.Caption = Str$(n)
End Sub



Вдобавок учти, что события Activate/Deactivate не отрабатывают, если ты со своей проги переключаешься на постороннюю; они отрабатывают, когда ты переключаешься между окнами своей программы.
Lasciate ogni speranza, voi ch'entrate.

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 21.12.2004 (Вт) 16:33

alibek писал(а):Вдобавок учти, что события Activate/Deactivate не отрабатывают, если ты со своей проги переключаешься на постороннюю; они отрабатывают, когда ты переключаешься между окнами своей программы.

А, ну вот в чем проблема. Я то как раз переключаюсь на другие проги (конкретней-Winamp). Тогда как это можно реализовать для окон разных программ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 21.12.2004 (Вт) 16:40

Делать сабклассинг и отлавливать сообщения WM_DEACTIVATE.
Lasciate ogni speranza, voi ch'entrate.

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 21.12.2004 (Вт) 16:51

alibek писал(а):Делать сабклассинг и отлавливать сообщения WM_DEACTIVATE.

Можно поподробней для чайника.

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 21.12.2004 (Вт) 19:22

Проще и без субклассикга
Код: Выделить всё
Public Declare Function GetFocus Lib "user32" Alias "GetFocus" () As Long

Function IsOurFormInFocus() as Boolean
if (GetFocus) then IsOurFormInFocus=True
End Function


Ф-ция покажет, в фокусе главное окно твоей программы или нет

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 21.12.2004 (Вт) 19:30

xolod писал(а):Проще и без субклассикга
Код: Выделить всё
Public Declare Function GetFocus Lib "user32" Alias "GetFocus" () As Long

Function IsOurFormInFocus() as Boolean
if (GetFocus) then IsOurFormInFocus=True
End Function


Ф-ция покажет, в фокусе главное окно твоей программы или нет

Пасиба, все работает :P


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

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

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

    TopList