Bild rechts: Auch im Konsolmodus lassen sich einige Anzeigen auf dem Bildschirm in einer Fensterdarstellung à la Windows realisieren. Es handelt sich um Anzeigen, die eine Bestätigung mit
|
![]() |
![]() | Die links dargestellte Anzeige einer Nachrichtenbox (MSGbox) zeigt eine Bedienungsanleitung. Sie wurde - ebenso wie die erste MSGbox auf dieser Seite - mit einem kleinen Programm erzeugt. Das Programm wurde in der Sprache Visual BASIC erstellt und ist weiter unten dargestellt.
Der sachliche Inhalt der links gezeigten MSGbox wurde aus einer Dokumentation von VBA5 (Visual BASIC for Applications Version 5) abgeleitet. Die Anzeige der oben auf dieser Seite dargestellten MSGbox wurde mit dem in der Bedienungsanleitung enthaltenen Beispiel erzeugt. Dabei ist die bevorzugte Antwort „Ja” bereits hervorgehoben worden. Diese Hervorhebeung bzw. Vorauswahl wird über den Zahlenschlüssel 36 erreicht. Er ergibt sich aus der Bedienungsanleitung:
Nach erfolgter Auswahl wird die Antwort Ja oder Nein per Errorlevel 7 oder 6 weitergegeben. Sie lässt sich beispielsweise mit einem geeigneten Batchprogramm auswerten. |
Die nachfolgend beschriebene Problematik mit dem Zeichencode lässt sich u.U. umgehen. Siehe dazu Probleme mit nicht nur deutschen Umlauten zwischen Windows und MSDOS.
Leider ist der Zeichencode bei der Konsoldarstellung anders als in der Windowsdarstellung. Der Notepad-Editor läuft in der Windowsdarstellung. Wir erstellen jedoch eine Konsolanwendung. Wenn man das Batchprogramm mit dem Notepad-Editor eintippt, hat man infolgedessen Ärger mit der Umlautdarstellung. Die deutschen Umlaute ä und ß müssen bei gedrückter ALT-Taste über das numerische Tastenfeld vierstellig eingetippt werden:
ä als 0132 ß als 0225 Der Dateiname kann z.B. teddy.bat heißen. Im Notepad-Editor sieht die Datei dann so aus: @echo off :anfang cmsgbox "Ist Teddy ein groáer Grizzlyb„r?" 36 "Eine b„rige Frage" if errorleven == 7 goto antwortnein if errorlevel ==6 goto antwortja :antwortnein cmsgbox "Die Antwort ist falsch.\Korrigieren Sie die Antwort!" 0 "Dumme Antwort" goto anfang :antwortja cmsgbox "Ihre Antwort ist absolut korrekt.\\Mit b„rigem Gruá\Teddy" 64 | |
Eine kurze Interpretation zu diesem Programm steht unterhalb des Quellprogrammtextes. |
If sArgs.Length = 0 Then: aArgs.Lenth enthält 0 sofern keinerlei Parameter mitgegeben wurden. In diesem Fall wird durch mehrfache Verkettung die sehr lange Zeichenkette strHELP gebildet. Sie enthält die Bedienungsanleitung für das Programm. Spätere Zeilenvorschübe sind als Backslash (\) enthalten.
strHELP = sArgs(0): Hier wird der erste Parameter übernommen. Er ist über sArgs(0) ansprechbar. Nur wenn sie vorhanden sind überschreiben die beiden folgenden Parameter überschreiben die am Programmanfang voreingestellten Werte. Um das Vorhandensein festzustellen, wird jeweils sArgs.Length abgefragt.
returnValue = MsgBox(Replace(strHELP, "\", vbCrLf), intButton, strTitel): Der Rückgabewert (Errorlevel) aus dem rechts neben dem Zuweisungszeichen(=) angeforderten Funktion MSGbox wird der Variablen returnValue zugewiesen. Zum Programmende wird somit der Rückgabewert mit Return returnValue exportiert.
Die Messagebox MSGbox in Masm32 | |
![]() | Es ist gar nicht kompliziert, eine MSGbox in ein Masm32-Konsolprogramm einzubauen. Das folgende Programm ist eine geringfügige Modifikation aus Iczelion's Tutorial No.2. Bild links: Hier erfolgt die Textausgabe ohne das runde Icon links vor dem Text, weil beim Aufruf invoke MessageBox als letzter Parameter 3 angegeben wurde. Es gibt einen internen Unterschied: Bei Masm32 erfolgt die Ausgabe einer Messagebox über die sogenannte API-Funktion Messagebox. |
.586 .model flat,stdcall .xlist option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .list .data MsgBoxCaption db "Iczelion Tutorial No.2",0 MsgBoxText db "damit kann auch Teddy mit",13,10,"Win32 Assembler programmieren",0 LMsgBoxText equ $-MsgBoxText-1 ;Laenge ohne die nachlaufende 0 .code start: invoke MessageBox, 0, addr MsgBoxText, addr MsgBoxCaption, 3 invoke ExitProcess, eax end start |
Ein sogenannter Prototyp beschreibt das Aufrufformat für die Messagebox so:
MessageBox PROTO hwnd:DWORD, lpText:DWORD, lpCaption:DWORD, uType:DWORD
Hier gibt es zwei Lösungen:
MsgBox 0,addr MsgBoxText,"Iczelion Tutorial No.2",3
MsgBox 0,chr$("damit kann auch Teddy mit",13,10,"Win32 Assembler programmieren"),\ "Iczelion Tutorial No.2",19Der Backslash am Zeilenende besagt, dass die folgende Zeile die aktuelle Zeile fortsetzt.
.586 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\macros\macros.asm includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .list .data ;MsgBoxText db "damit kann auch Teddy mit",13,10,"Win32 Assembler programmieren",0 .code start: ; MsgBox MACRO hndl,txtmsg,titlemsg,styl ; invoke MessageBox,hndl,reparg(txtmsg),reparg(titlemsg),styl ; ENDM ; MsgBox 0,addr MsgBoxText,"Iczelion Tutorial No.2",3 MsgBox 0,chr$("damit kann auch Teddy mit",13,10,"Win32 Assembler programmieren"),\ "Iczelion Tutorial No.2",19 invoke ExitProcess, eax end start |