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

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

Код: 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
MSGBOX появляется под окнами
    #37522256
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Set frm = Forms(i) 
это что такое?
...
Рейтинг: 0 / 0
MSGBOX появляется под окнами
    #37522261
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Форма которая поверх всех окон всплывает.
...
Рейтинг: 0 / 0
MSGBOX появляется под окнами
    #37522270
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не очевидно у вас из кода. выкладывайте код своей топмост формы , где вы юзаете msgbox и как вы, самое главное, форму эту открываете.
...
Рейтинг: 0 / 0
MSGBOX появляется под окнами
    #37522273
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот вам пример:

Код: 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
MSGBOX появляется под окнами
    #37522314
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так оно так примерно и есть

Код: 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
MSGBOX появляется под окнами
    #37522321
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин вызов красным что то не отметился

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


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

 Set frm = Forms( 0 )
....

Call StayOnTop(frm)

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

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

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


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