Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / MSGBOX появляется под окнами / 9 сообщений из 9, страница 1 из 1
11.11.2011, 14:38
    #37522237
Alex_men
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSGBOX появляется под окнами
Добрый день!

Вот с какой проблемкой столкнулся неожиданно для себя. Делаю программу, которая по наступлении определенного события должна выплывать поверх всех окон. На форуме нашел код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Declare Function SetWindowPos& Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long)

Const HWND_TOPMOST = - 1 
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
.....

Set frm = Forms(i) 
       
SetWindowPos frm.hwnd, HWND_TOPMOST,  0 ,  0 ,  0 ,  0 , SWP_NOMOVE Or SWP_NOSIZE


Все было хорошо, окно вставало поверх всех открытых, я делал в нем операции (открывал другие формы программы и т.п). В том числе при определенной ситуации выводил при открыти модальной формы сообщение с запросом подтверждения открытия окна. Сегодня почемуто этот запрос стал попадать под основную форму окна. что я не так делаю?

сам MSGBOX:
Код: plaintext
1.
If MsgBox("По данному запросу операции уже проводились" & Chr( 13 ) & _
                                    "Желаете внести изменения?", vbQuestion + vbYesNo, "") = vbYes Then
...
Рейтинг: 0 / 0
11.11.2011, 14:45
    #37522256
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSGBOX появляется под окнами
Код: plaintext
Set frm = Forms(i) 
это что такое?
...
Рейтинг: 0 / 0
11.11.2011, 14:47
    #37522261
Alex_men
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSGBOX появляется под окнами
Форма которая поверх всех окон всплывает.
...
Рейтинг: 0 / 0
11.11.2011, 14:50
    #37522270
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSGBOX появляется под окнами
не очевидно у вас из кода. выкладывайте код своей топмост формы , где вы юзаете msgbox и как вы, самое главное, форму эту открываете.
...
Рейтинг: 0 / 0
11.11.2011, 14:51
    #37522273
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSGBOX появляется под окнами
вот вам пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
'Form1
Option Explicit
Private Const HWND_TOPMOST = - 1 
Private Const HWND_NOTOPMOST = - 2 
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const Flags = SWP_NOMOVE Or SWP_NOSIZE
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWnd As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Public Sub StayOnTop(hWnd As Long)
        Call SetWindowPos(hWnd, HWND_TOPMOST,  0 ,  0 ,  0 ,  0 , Flags)
End Sub

Private Sub Form_Load()
Me.StayOnTop Me.hWnd
End Sub
...
Рейтинг: 0 / 0
11.11.2011, 15:00
    #37522314
Alex_men
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSGBOX появляется под окнами
Так оно так примерно и есть

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
Option Explicit

Private Declare Function SetWindowPos& Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long)

Const HWND_TOPMOST = - 1 
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2

Public Sub StayOnTop(ByRef objFrm As Form)

    SetWindowPos objFrm.hwnd, HWND_TOPMOST,  0 ,  0 ,  0 ,  0 , SWP_NOMOVE Or SWP_NOSIZE

End Sub

Private Sub Timer_Timer()
On Error GoTo errlbl
    Dim rst As New ADODB.Recordset
    Dim rst1 As New ADODB.Recordset
    Dim dat As Variant
    Dim frm As Form
    Dim i As Integer
    
    i =  0 
    
    DoEvents
    Set frm = Forms( 0 )
    dat = "'" & Format(Date, "yyyy-mm-dd") & "'"
'***************************************************************************************
'- проведенные операции по кассе и по БИСу
    rst1.Open _
    "SELECT count(id) as c FROM val_op_cont WHERE op_sysdate>" & dat & " AND (val_op_cont.op_old='' or val_op_cont.op_old is null)  ", _
    Cn, adOpenDynamic, adLockReadOnly
    
    rst.Open _
    "SELECT count(id) as c_ch FROM val_op_cont WHERE op_sysdate>" & dat & " ", _
    Cn, adOpenDynamic, adLockReadOnly
    
    If rst1!c <> op_count_cas Or rst!c_ch <> op_count_cas_all Then
            op_count_cas = rst1!c           '- количество результирующих операций
            op_count_cas_all = rst!c_ch     '- полное количество операций, включая удаленные и исправленные
               
            Me.MSHFG_ValOpCtrl.Refresh
            Me.MSHFG_BnOpCtrl.Refresh
            Call ComList_FltCas_Click
            Call ComList_FltBN_Click
            
        '- тут мы вынимаем окошко поверх всех окошек и не даем его спрятать кроме как свернуть
            'Me.Show
            Me.WindowState = vbNormal
            [color=red]Call StayOnTop(frm) [/color]
            For i =  1  To  5 
                Beep
            Next
            DoEvents
    End If
        
    rst.Close
    Set rst = Nothing
    
    rst1.Close
    Set rst1 = Nothing
        
'***************************************************************************************
'- проверка вновь поступивших запросов.
    rst1.Open _
    "SELECT count(id) as c FROM message WHERE message.req_date>'" & Format(Date, "yyyy-mm-dd HH:mm:ss") & "' AND (message.status =1)  ", _
    Cn, adOpenStatic, adLockReadOnly
    
    DoEvents
    If rst1!c <> op_req_count And Not rst1.EOF And Not rst1.BOF Then
            
        op_req_count = rst1!c
        
        Me.WindowState = vbNormal
        [color=red]Call StayOnTop(frm)[/color]  
        For i =  1  To  5 
            Beep
        Next
        Call MSHFG_req_rebild
    End If
    
    Call MSHFG_req_rebild
    'Me.MSHFG_req.Refresh
    
    rst1.Close
    Set rst1 = Nothing
    
'***************************************************************************************
    DoEvents
    Exit Sub

errlbl:
    MsgBox "Процедура < timer >" & Chr( 13 ) & _
            Err.Description, vbCritical + vbOKOnly, "Ошибка: " & Err.Number
End Sub
...
Рейтинг: 0 / 0
11.11.2011, 15:03
    #37522321
Alex_men
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSGBOX появляется под окнами
Блин вызов красным что то не отметился

В общем вызываю процедуру если кратко так. полный текст выше


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Dim frm As Form

 Set frm = Forms( 0 )
....

Call StayOnTop(frm)

...
Рейтинг: 0 / 0
11.11.2011, 15:05
    #37522329
Alex_men
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSGBOX появляется под окнами
вопрос только в том, что на msgbox это влиять не должно, да и не влияло до сего дня. В часть касающуюся помещения формы поверх всех окон изменения не вносил. почему вдруг стало уходить вниз непонимаю.
...
Рейтинг: 0 / 0
11.11.2011, 15:23
    #37522386
Alex_men
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSGBOX появляется под окнами
Разобрался...

бред конечно, но как говорится... В параметрах формы (после того как срубил прогу через диспетчер) MinButton и MaxButton стояли в значении False

Как только вернул туда True все стало опять красиво
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / MSGBOX появляется под окнами / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]