Rubrik: System/Windows · Konsole | VB-Versionen: VB5, VB6 | 22.11.05 |
Konsolenanwendungen leicht gemacht Hier möchten wir eine Klasse vorstellen, welche die wichtigsten Funktionen zur Erstellung von Konsolenanwendungen kapselt. | ||
Autor: Gunnar Schmitz | Bewertung: | Views: 21.129 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Auch heutzutage treffen wir immer wieder noch auf die guten alten Konsolenanwendungen. Und wenn man dabei in Nostalgie verfällt, wünscht man sich eigentlich selber in VB eine kleine Konsolenanwendung zu schreiben. Mit der Klasse, die wir hier vorstellen wollen, ist dies kein Problem. Sie kapselt die wichtigsten API-Funktionen, um kleine Konsolenanwendungen zu konzipieren.
Fügen Sie Ihrem Projekt ein neues Klassenmodul hinzu und geben Sie folgenden Code ein:
Option Explicit ' Benötigte API-Funktionen Private Declare Function AllocConsole Lib "Kernel32" () As Long Private Declare Function FreeConsole Lib "Kernel32" () As Long Private Declare Function GetStdHandle Lib "Kernel32" ( _ ByVal nStdHandle As Long) As Long Private Declare Function ReadConsole Lib "Kernel32" _ Alias "ReadConsoleA" ( _ ByVal hConsoleInput As Long, _ ByVal lpBuffer As String, _ ByVal nNumberOfCharsToRead As Long, _ lpNumberOfCharsRead As Long, _ lpReserved As Any) As Long Private Declare Function SetConsoleTextAttribute Lib "Kernel32" ( _ ByVal hConsoleOutput As Long, _ ByVal wAttributes As Long) As Long Private Declare Function SetConsoleTitle Lib "Kernel32" _ Alias "SetConsoleTitleA" ( _ ByVal lpConsoleTitle As String)As Long Private Declare Function WriteConsole Lib "Kernel32" _ Alias "WriteConsoleA" ( _ ByVal hConsoleOutput As Long, _ ByVal lpBuffer As Any, _ ByVal nNumberOfCharsToWrite As Long, _ lpNumberOfCharsWritten As Long, _ lpReserved As Any) As Long Public Enum ForeGroundTypes [FOREGROUND_RED] = &H4 [FOREGROUND_GREEN] = &H2 [FOREGROUND_BLUE] = &H1 [FOREGROUND_INTENSITY] = &H8 End Enum Public Enum BackGroundTypes [BACKGROUND_RED] = &H40 [BACKGROUND_GREEN] = &H20 [BACKGROUND_BLUE] = &H10 [BACKGROUND_INTENSITY] = &H80 End Enum ' Die benötigten Konstanten Private Const STD_INPUT_HANDLE = -10& Private Const STD_OUTPUT_HANDLE = -11& Private Const STD_ERROR_HANDLE = -12& ' Einige Variabeln, welche die Klasse intern benutzt Private hCmdIn As Long Private hCmdOut As Long Private hCmdError As Long Private m_Caption As String Private m_ForeGroundFlags As ForeGroundTypes Private m_BackGroundFlags As BackGroundTypes
' --------------------Eigenschaften------------------------------- Public Property Let Caption(NewCaption As String) m_Caption = NewCaption SetConsoleTitle m_Caption End Property Public Property Get Caption() As String Caption = m_Caption End Property
Public Property Let ForeGroundFlags(NewForeGroundFlags As ForeGroundTypes) m_ForeGroundFlags = NewForeGroundFlags ' Änderungen vornehmen SetConsoleTextAttribute hCmdOut, m_ForeGroundFlags Or BackGroundFlags End Property Public Property Get ForeGroundFlags() As ForeGroundTypes ForeGroundFlags = m_ForeGroundFlags End Property
Public Property Let BackGroundFlags(NewBackGroundFlags As BackGroundTypes) m_BackGroundFlags = NewBackGroundFlags ' Änderungen vornehmen SetConsoleTextAttribute hCmdOut, ForeGroundFlags Or m_BackGroundFlags End Property Public Property Get BackGroundFlags() As BackGroundTypes BackGroundFlags = m_BackGroundFlags End Property
' ------------------------------------------------------------------ Private Sub Class_Initialize() m_Caption = "Console" m_ForeGroundFlags = FOREGROUND_INTENSITY End Sub
' ------------------------Funktionen-------------------------------- Public Sub OpenConsole() ' Öffnet eine neue Konsole AllocConsole ' Gibt den Konsolentitel an SetConsoleTitle Caption ' Gibt das Handle der Konsole zurück hCmdIn = GetStdHandle(STD_INPUT_HANDLE) hCmdOut = GetStdHandle(STD_OUTPUT_HANDLE) hCmdError = GetStdHandle(STD_ERROR_HANDLE) ' Setzt die Textattribute d.h. ForeGround und BackGround SetConsoleTextAttribute hCmdOut, ForeGroundFlags Or BackGroundFlags End Sub
Public Sub CloseConsole() ' Schließt die Konsole FreeConsole End Sub
Public Sub WriteLn(CmdOut As String) ' Schreibt einen String mit Zeilenumbruch auf der Konsole CmdOut = CmdOut & vbCrLf WriteConsole hCmdOut, CmdOut, Len(CmdOut), vbNull, vbNull End Sub
Public Sub WirteString(CmdOut As String) ' Schreibt einen String auf der Konsole WriteConsole hCmdOut, CmdOut, Len(CmdOut), vbNull, vbNull End Sub
Public Function ReadLn() As String ' Liest die Nächste Zeile aus Dim CmdIn As String * 256 Call ReadConsole(hCmdIn, CmdIn, Len(CmdIn), vbNull, vbNull) ReadLn = CmdIn End Function
Nun wollen wir das ganze mal ausprobieren. Fügen Sie dazu Ihrem Projekt ein neues Modul hinzu und geben folgenden Code ein.
Option Explicit Sub Main() Dim Console As clsConsole Dim sText As String Set Console = New clsConsole ' Titel des Konsolenfensters angeben Console.Caption = "Meine Konsolenanwendung" ' Textattribute festlegen Console.ForeGroundFlags = FOREGROUND_INTENSITY ' Konsole öffnen Console.OpenConsole ' Zeilen ausgeben Console.WriteLn "Das ist nur ein Test" Console.ForeGroundFlags = FOREGROUND_BLUE ' Auf Eingabe warten Console.WriteLn "Dein Name Bitte" Console.ReadLn ' Konsole schließen Console.CloseConsole End Sub
Nun noch ein kleiner Hinweis:
Bekommen Sie bitte keinen Schrecken, wenn Sie das Programm in der IDE starten und Windows damit überlastet ist die Konsolenfenster neu zu zeichnen. Dieses Problem tritt in der kompilierten Version nicht auf.