Größe der Console

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
EgonEprom
Beiträge: 24
Registriert: 15.02.2010 18:18
Computerausstattung: Windows2000-XP-Vista-7
Wohnort: Saarwellingen

Re: Größe der Console

Beitrag von EgonEprom »

Hab's jetzt wohl raus:

Code: Alles auswählen

 Procedure ConsoleInit(xch.l,ych.l)
 
  Define gStdOut.l 
  Define consoleInfo.CONSOLE_SCREEN_BUFFER_INFO 
  Define rect.SMALL_RECT 

  If OpenConsole()
  
    EnableGraphicalConsole(1)
    ConsoleTitle("VT52")
  
    If xch < $20                                          ; limit column range
      xch = $20
    ElseIf xch > $50
      xch = $50 
    EndIf
      
    If ych < $10                                          ; limit column range
      ych = $10
    ElseIf ych > $50
      ych = $50  
    EndIf
      
    gStdOut.l = GetStdHandle_(#STD_OUTPUT_HANDLE) 
     
    rect\right = xch - 1 
    rect\bottom = ych - 1 
    SetConsoleWindowInfo_(gStdOut, 1, @rect) 
    SetConsoleScreenBufferSize_(gStdOut, ych<<16 | xch) 
    Con = 1                                                ; console is running
  Else
     MessageRequester("VT52", "Console not availible")
  EndIf
EndProcedure
Sieht ganz gus aus bis jetzt, ist nur noch nicht grüdlich getestet (nur Win2KSP4).

Und schon taucht das nächste Problem auf: Anstatt daß ein eingetipptes Ctrl-C von 'meinem' Program verarbeitet wird, schießt eben dieses die Konsole gänzlich ab (lästg) !

Ist für dieses Problem evtl. schon eine Lösung bekannt?

(Oder hätte ich dadraus ein neues Thema machen sollen?)
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Größe der Console

Beitrag von Mok »

EgonEprom hat geschrieben:Anstatt daß ein eingetipptes Ctrl-C von 'meinem' Program verarbeitet wird, schießt eben dieses die Konsole gänzlich ab (lästg) !
Kann man in der Konsole überhaup sachen abfragen, die nicht über Input() eingelesen werden? Bild
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Marvin
Beiträge: 497
Registriert: 17.07.2005 14:42
Wohnort: Krikkit

Re: Größe der Console

Beitrag von Marvin »

EgonEprom hat geschrieben:Und schon taucht das nächste Problem auf: Anstatt daß ein eingetipptes Ctrl-C von 'meinem' Program verarbeitet wird, schießt eben dieses die Konsole gänzlich ab (lästg) !

Ist für dieses Problem evtl. schon eine Lösung bekannt?
It's not a bug, it's a feature.
Es ist halt so, dass Strg+C auf Consolen das laufende Programm beendet. Unter UNIX wird an das Programm da noch ein entsprechendes Signal gesendet, das vom Programm abgefangen werden kann, um das Beenden zu verhindern. Wie es unter Windows ist, weiß ich nicht.

Es ist nur kein Problem, sondern eben ein Feature. :wink:
Benutzeravatar
EgonEprom
Beiträge: 24
Registriert: 15.02.2010 18:18
Computerausstattung: Windows2000-XP-Vista-7
Wohnort: Saarwellingen

Re: Größe der Console / Ausklang

Beitrag von EgonEprom »

Nach noch einigen Experimenten konnte ich das Konsolen-Projekt zu einem brauchbaren Abschluß bringen: Die Größe wird bei der Initialisierung als Parameter übergeben und die diversen Control-Signale werden brauchbar verarbeitet:

zuerst den Ctrl-Handler definieren ( da gibt's 5 verschiedene signale: 0 = ^C, 1= Ctrl-Break,
3,4 und 5 sind CloseWindow, Logoff und Shutdown)

Code: Alles auswählen

Procedure CtrlHandler(fdwCtrlType.l) 
  Select fdwCtrlType
  Case 0                                                              ; Ctrl-C 
    Send($03)
    
  Case 1                                                          ; Ctrl-Break
;    MessageRequester("VT52", "Ctrl Break detected ?")

  Default ; close-event, logoff, shutdown
    run = 0                                                     ; stop console 
  
  EndSelect
  ProcedureReturn(-1)                           ; cancel ctrl-signal executing
EndProcedure
Der CtrlHandler muß mit einem TRUE verlassen werden, damit die Control-Signale nicht noch weiter ausgewertet werden ( Dann würde Ctrl-C doch noch die Konsole abschießen)

Nun die Initialisierung:

Code: Alles auswählen

Procedure ConsoleInit(xch.l,ych.l)
  Define gStdOut.l 
  Define consoleInfo.CONSOLE_SCREEN_BUFFER_INFO 
  Define rect.SMALL_RECT 

  If OpenConsole()
    EnableGraphicalConsole(1)
    ConsoleTitle("VT52")
    xch = range(xch, $20, $80)
    ych = range(ych, $10, $50)
    gStdOut.l = GetStdHandle_(#STD_OUTPUT_HANDLE) 
    rect\right = xch - 1 
    rect\bottom = ych - 1 
    SetConsoleWindowInfo_(gStdOut, 1, @rect) 
    SetConsoleScreenBufferSize_(gStdOut, ych<<16 | xch) 
    SetConsoleWindowInfo_(gStdOut, 1, @rect) 
    SetConsoleCtrlHandler_(@CtrlHandler(),-1) 
    Con = 1                                                ; console is running
  Else
     MessageRequester("VT52", "Console not availible")
  EndIf
EndProcedure


Das öffnet eine Konsole, stellt die Buffergröße und - soweit möglich - das darstellende Fenster auf die gewünschte Größe (der zulässige Wertebereich wird von mir mit der Prozeduer "Range(wert,min,max) begrenzt) eingestellt. Abschließend wird noch der ControlHandler verbogen.

Zum Programm im Ganzen: es ist ein einfaches "Satellitenterminal", welches dem Zielsystem (ursprünglich: 65C02 mit 160KB(!) Ram) über die serielle Schnittstelle einen Massenspeicher zur Verfügung stellt und an sonsten ein irgendwie VT52-kompatibles "farbtaugliches" Terminal darstellt, welches alles, was vom Zielsystem zur Anzeige gebracht werden soll, auch noch mitprotokolliert. (Falls das noch jemand gebrauchen kann, bitte bei mir melden)
Antworten