Erweiterte Konsolenfunktionen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Lothar Schirm
Beiträge: 41
Registriert: 30.04.2012 16:38

Erweiterte Konsolenfunktionen

Beitrag 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
Zuletzt geändert von Lothar Schirm am 24.02.2013 18:44, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Erweiterte Konsolenfunktionen

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Lothar Schirm
Beiträge: 41
Registriert: 30.04.2012 16:38

Re: Erweiterte Konsolenfunktionen

Beitrag von Lothar Schirm »

Einwand stattgegeben, ich habe die Korrektur oben eingebaut.
Antworten