Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0338: Timerevents bei Aufruf einer MsgBox zulassen

 von 

Beschreibung 

Eigentlich könnten wir mit der in VB gestellten MessageBox durchaus zufrieden sein, würde es da nicht zwei kleine Unterschiede zu der im System verwendeten geben. Zum einen gestattet diese hier aufgeführte Version, TimerEvents des Besitzerfensters, d.h. Timer-Ereignisse werden nicht unterbunden sondern laufen weiter.Außerdem bietet eine deart gestaltete Box, unter Verwendung der Nachricht MB_SETFOREGROUND eine Msg-Box zwar formmodal, aber trotzdem an oberster Stelle des Fensterstacks zu platzieren. Dies Vermag die VB-Kapselung nicht. Ansonsten gibt es keine Unterschiede.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

MessageBoxA (MessageBox)

Download:

Download des Beispielprojektes [2,62 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Timersteuerelement "Timer1"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Declare Function MessageBox Lib "user32" Alias _
        "MessageBoxA" (ByVal hwnd As Long, ByVal lpText _
        As String, ByVal lpCaption As String, ByVal _
        wType As Long) As Long

Const MB_ABORTRETRYIGNORE = &H2&
Const MB_APPLMODAL = &H0&
Const MB_COMPOSITE = &H2
Const MB_DEFAULT_DESKTOP_ONLY = &H20000
Const MB_DEFBUTTON1 = &H0&
Const MB_DEFBUTTON2 = &H100&
Const MB_DEFBUTTON3 = &H200&
Const MB_DEFMASK = &HF00&
Const MB_ICONASTERISK = &H40&
Const MB_ICONEXCLAMATION = &H30&
Const MB_ICONHAND = &H10&
Const MB_ICONMASK = &HF0&
Const MB_ICONQUESTION = &H20&
Const MB_MISCMASK = &HC000&
Const MB_MODEMASK = &H3000&
Const MB_NOFOCUS = &H8000&
Const MB_OK = &H0&
Const MB_OKCANCEL = &H1&
Const MB_PRECOMPOSED = &H1
Const MB_RETRYCANCEL = &H5&
Const MB_SETFOREGROUND = &H10000
Const MB_SYSTEMMODAL = &H1000&
Const MB_TASKMODAL = &H2000&
Const MB_TYPEMASK = &HF&
Const MB_USEGLYPHCHARS = &H4
Const MB_YESNO = &H4&
Const MB_YESNOCANCEL = &H3&

Private Sub Form_Load()
  Timer1.Interval = 200
  Timer1.Enabled = True
End Sub

Private Sub Command1_Click()
  Dim Style&, Prompt$, Titel$, Result&
  
    Titel = "Diese Box wurde mittels API-Aufruf generiert"
    Prompt = "Beachten Sie, daß im aufrufenden Task jetzt im " & _
             "Gegensatz zur VB-Standard-MsgBox der Timer " & _
             "weiterläuft!"
    Style = MB_ICONASTERISK Or MB_YESNOCANCEL Or MB_SYSTEMMODAL
    
    Result = MessageBox(Me.hwnd, Prompt, Titel, Style)
    
    Me.Caption = "Rückgabewert = " & Result
End Sub

Private Sub Command2_Click()
  Dim Style&, Prompt$, Titel$, Result&
  
    Style = vbYesNoCancel Or vbSystemModal Or vbExclamation
    Titel = "Dies ist die Standard VB-MsgBox"
    Prompt = "Beachten Sie, daß der aufrufende Task jetzt steht," & _
             " der Timer läuft nicht weiter!"
    
    Result = MsgBox(Prompt, Style, Titel)
End Sub

Private Sub Timer1_Timer()
  Static x&
  
    x = x + 1
    Label1.Caption = CStr(x)
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 4 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Olaf Grollmann am 21.09.2004 um 11:11

Die VB-Onlinehilfe sagt zu MsgBox:

"The maximum length of prompt is approximately 1024 characters, depending on the width of the characters used."

Die API-Fu. hat diese Beschränkung nicht. Es kann *sehr viel mehr* Text angezeigt werden - mehr, als auf eine Seite passt. Scrollbars kommen dann nicht. Auch kein Auto-Scroll, wie z.B. im Start-Menue.

Kommentar von Werner Mielke am 21.01.2003 um 00:25

Im MSDN Q178078 steht, daß sich ein VB5/6-Programm in der IDE und als exe-Datei unterschiedlich verhalten: bei der exe-Datei läuft der Timer bei aktivierter MsgBox weiter. Das habe ich unter Win95B und Win2000 verifiziert.
Weiß jemand eine Lösung, wie man der MsgBox wieder das modale Verhalten beibringen kann?

Kommentar von Maxi Stangel am 30.11.2001 um 20:54

Wie kann ich eigentlich eine Msgbox laufen lassen, während das Programm im Hintergrund (z.B.: bei dem Sub "Form_Load" bestimmte Anweisungen über eine geraumere Zeitspanne bearbeitet?
Mit einer neuen Form klappts nicht, da sie nicht geladen wird, bevor die Haupt-Form nicht geladen ist!
Bitte helft mir
thx
Maxi

Kommentar von Norbert Bogman am 28.02.2001 um 15:47

Hallo,
tolle Sache diese Messagebox. Aber wie kann ich die Beschriftung der Buttons, z.B. in englisch, abändern?