Seite 1 von 1

Erweiterte Konsolenfunktionen

Verfasst: 24.02.2013 17:35
von Lothar Schirm
Das folgende Programm demonstriert ein paar Möglichkeiten durch erweiterte Konsolenfunktionen, die in der darunter befindlichen Include-Datei realisiert und durch Kommentare beschrieben sind. Im einzelnen handelt es sich um folgende Funktionen:
- Abfrage der Cursorposition
- Abfrage von Vor- und Hintergrundfarbe
- Text in Zeile zentrieren
- Rahmen (auch farbig ausgefüllt)
- Erweiterung der Input-Funktion: Editieren eines vorbelegten String mit Längenbegrenzung.

Beispielprogramm:

Code: Alles auswählen

;==============================================================================
; KonsoleDemo.pb
; Konsolen-Demoprogramm
; Erstellt am 14.07.2012
; Letzte Bearbeitung am 24.02.13
;==============================================================================

EnableExplicit

IncludeFile "Konsole.pbi"

Define.s key, Name, Strasse, Ort, Tel
Define.i i, x0, y0
Define. d dx, x

;- Konsole öffnen

OpenConsole()
EnableGraphicalConsole(1)
ConsoleColor(15, 1)
ClearConsole()

ConsoleTitle("Konsolen-Demoprogramm")
Zentriert(12, "Druecken Sie eine beliebige Taste!")
Repeat
  key = Inkey()
Until key <> ""

;- Menü

ClearConsole()
ConsoleTitle("Menue")
ConsoleColor(14, 3)
Rahmen(1, 1, 16, 8, "Datei")
ConsoleLocate(3, 3): Print("0 Neu")
ConsoleLocate(3, 4): Print("1 Oeffnen")
ConsoleLocate(3, 5): Print("2 Speichern")
ConsoleLocate(3, 6): Print("3 Schliessen")

Repeat
  key = Inkey()
Until (key <> "" And Val(key) <= 3)

ConsoleColor(15, 1)
ConsoleLocate(1, 10)

Print("Gewaehlt: Menuepunkt " + key)
Zentriert(24, "Druecken Sie eine beliebige Taste zum Fortsetzen!")
Repeat
  key = Inkey()
Until key <> ""

;- Eingabemaske

ClearConsole()
ConsoleTitle("Eingabemaske")
ConsoleColor(14, 3)
Rahmen(10, 7, 60, 8, "Telefonbuch-Eingabe")
ConsoleLocate(12, 9):  Print("Name:    ")
x0 = GetCursorX()
ConsoleLocate(12, 10): Print("Strasse: ")
ConsoleLocate(12, 11): Print("Wohnort: ")
ConsoleLocate(12, 12): Print("Telefon: ")

Repeat
  ConsoleLocate(x0, 9):  Name = Edit(Name, 45)
  ConsoleLocate(x0, 10): Strasse = Edit(Strasse, 45)
  ConsoleLocate(x0, 11): Ort = Edit(Ort, 45)
  ConsoleLocate(x0, 12): Tel = Edit(Tel, 45)
  ConsoleLocate(12, 13): Print("Werte uebernehmen j/n: ")
  key = Input()
Until LCase(key) = "j"

ConsoleColor(15, 1)
ConsoleLocate(0, 17): PrintN("Eingegebene Daten:")
PrintN(Name)
PrintN(Strasse)
PrintN(Ort)
PrintN(Tel)
Zentriert(24, "Druecken Sie eine beliebige Taste zum Fortsetzen!")
Repeat
  key = Inkey()
Until key <> ""

;- Tabelle

ClearConsole()
ConsoleTitle("Wertetabelle trigonometrischer Funktionen")
PrintN(RSet("x in Grad)", 10) + RSet("sin(x)", 10) + RSet("cos(x)", 10) + RSet("tan(x)", 10))
For i = 1 To 40
  Print("-")
Next
PrintN("")

dx = 5
For i = 0 To 18
  x = i * dx
  PrintN(RSet(StrF(x, 5), 10) + RSet(StrF(Sin(Radian(x)), 5), 10) + RSet(StrF(Cos(Radian(x)), 5), 10) +
         RSet(StrF(Tan(Radian(x)), 5), 10))
Next

Zentriert(24, "Druecken Sie eine beliebige Taste zum Beenden!")
Repeat
  key = Inkey()
Until key <> ""

CloseConsole()

End
Und hier die Include-Datei:

Code: Alles auswählen

;=========================================================================
; Konsolenfunktionen für einfache Bedienoberflächen
; mit EnableGraphicalConsole(1)
; Konsole.pbi
; Erstellt am 13.07.2012
; Letzte Bearbeitung am 24.02.13
;=========================================================================


EnableExplicit


Procedure.i GetCursorX()
  ; Gibt die x-Position des Cursors zurück
  
  Protected.CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
  Protected hConsoleOutput
  
  hConsoleOutput = GetStdHandle_(#STD_OUTPUT_HANDLE )
  GetConsoleScreenBufferInfo_(hConsoleOutput, ConsoleInfo)
  
  ProcedureReturn ConsoleInfo\dwCursorPosition\x
  
EndProcedure


Procedure.i GetCursorY()
  ; Gibt die y-Position des Cursors zurück
  
  Protected.CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
  Protected hConsoleOutput
  
  hConsoleOutput = GetStdHandle_(#STD_OUTPUT_HANDLE )
  GetConsoleScreenBufferInfo_(hConsoleOutput, ConsoleInfo)
  
  ProcedureReturn ConsoleInfo\dwCursorPosition\y
  
EndProcedure


Procedure.i GetFrontColor()
  ; Gibt die Zeichenfarbe zurück
  
  Protected.CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
  Protected hConsoleOutput
  
  hConsoleOutput = GetStdHandle_(#STD_OUTPUT_HANDLE )
  GetConsoleScreenBufferInfo_(hConsoleOutput, ConsoleInfo)
  
  ProcedureReturn ConsoleInfo\wAttributes % 16

EndProcedure


Procedure.i GetBackColor()
  ; Gibt die Hintergrundfarbe zurück
  
  Protected.CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
  Protected hConsoleOutput
  
  hConsoleOutput = GetStdHandle_(#STD_OUTPUT_HANDLE )
  GetConsoleScreenBufferInfo_(hConsoleOutput, ConsoleInfo)
  
  ProcedureReturn ConsoleInfo\wAttributes / 16
  
EndProcedure 


Procedure Zentriert(y.i, Text.s)
; Zentrierter Text in Zeile y ohne Zeilenumbruch
  
  ConsoleLocate((80 - Len(Text)) / 2, y)
  Print(Text)

EndProcedure


Procedure Cls(x.i, y.i, Breite.i, Hoehe.i)
; Loescht einen Konsolenausschnitt durch Überschreiben mit der
; Hintergrundfarbe.
; - x, y  = Position linke obere Ecke
; - Breite, Hoehe = Abmessungen des Ausschnittes
  
  Protected.i i
  
  For i = y To y + Hoehe - 1
    ConsoleLocate(x, i)
    Print(Space(Breite))
  Next
  
EndProcedure


Procedure Rahmen(x.i, y.i, Breite.i, Hoehe.i, Titel.s)
; Zeichnet einen Rahmen mit Titel.
; - x, y  = Position linke obere Ecke
; - Breite, Hoehe  = Abmessungen des Rahmens
; - Titel = Titel, zentriert (falls Titel <> "")
; Der Rahmen wird zum Loeschen des Hintergrundes mit aktuellen Hintergrundfarbe
; gefuellt. Erfolgt vorher eine entsprechende ConsoleColor-Anweisung, wird ein farbiges
; Fenster mit Rahmen gezeichnet.
  
  Protected.i i
  Protected.s elo, ero, elu, eru, hlin, vlin
  
  elo = Chr(218)
  ero = Chr(191)
  elu = Chr(192)
  eru = Chr(217)
  hlin = Chr(196)
  vlin = Chr(179)
  
  ; Hintergrund loeschen:
  Cls(x, y, Breite, Hoehe)
  
  ; Rahmen zeichnen:
  ConsoleLocate(x, y)
  Print(elo)
  For i = 1 To Breite - 2
    Print(hlin)
  Next
  Print(ero)
  For i = y + 1 To y + Hoehe - 2
    ConsoleLocate(x, i)
    Print(vlin)
    ConsoleLocate(x + Breite - 1, i)
    Print(vlin)
  Next
  ConsoleLocate(x, y + Hoehe - 1)
  Print(elu)
  For i = 1 To Breite - 2
    Print(hlin)
  Next
  Print(eru)
  
  ; Titel einfuegen:
  If Titel <> ""
    ;ConsoleLocate(x + (Breite - Len(Titel) - 2) / 2, y)
    ConsoleLocate(x + 2, y)
    Print(Space(1) + Titel + Space(1))
  EndIf
  
EndProcedure


Procedure.s Edit(Text.s, Laenge.i)
  ; Editieren eines String mit Vorbelegung und Längenbegrenzung.
  ; - Text = vorbelegter String
  ; - Laenge = maximale Laenge (Eingabebalken hellgrau bzw. weiss)
  
  Protected.s key, s = Text
  Protected.i x, y, fgColor, bkColor
  
  x = GetCursorX()
  y = GetCursorY()
  fgColor = GetFrontColor()
  bkColor = GetBackColor()
  
  ; Farbe für den Eingabebalken, je nach Hintergrundfarbe:
  If bkColor = 7
    ConsoleColor(0, 15)
  Else
    ConsoleColor(0, 7)
  EndIf
  
  ; Eingabe:
  Repeat
    
    ConsoleLocate(x, y)
    Print(Space(Laenge))
    ConsoleLocate(x, y)
    Print(s)
    
    Repeat
      Delay(1)
      key = Inkey()
    Until key <> ""
    
    Select Asc(key)
      Case 32 To 255  
        ; druckbare Zeichen
        If Len(s) < Laenge
          s = s + key
        EndIf
      Case 8
        ; Backspace
        s = Left(s, Len(s) - 1)
    EndSelect
    
  Until Asc(key) = 13 ; Enter
  
  ; Zurück zur ursprünglichen Farbe:
  ConsoleColor(fgColor, bkColor)
  ConsoleLocate(x, y)
  Print(Space(Laenge))
  ConsoleLocate(x, y)
  PrintN(s)
  
  ProcedureReturn s
  
EndProcedure

Re: Erweiterte Konsolenfunktionen

Verfasst: 24.02.2013 17:57
von ts-soft
:allright:

Ein kleiner Feher jedoch, Mod() ist für Fließkommazahlen, % ist für Ganzzahlen:

Code: Alles auswählen

Procedure.i GetFrontColor()
  ; Gibt die Zeichenfarbe zurück
 
  Protected.CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
  Protected hConsoleOutput
 
  hConsoleOutput = GetStdHandle_(#STD_OUTPUT_HANDLE )
  GetConsoleScreenBufferInfo_(hConsoleOutput, ConsoleInfo)
 
  ProcedureReturn ConsoleInfo\wAttributes % 16
 
EndProcedure
Gruß
Thomas

Re: Erweiterte Konsolenfunktionen

Verfasst: 24.02.2013 18:48
von Lothar Schirm
Einwand stattgegeben, ich habe die Korrektur oben eingebaut.