Consolenbreite und Höhe fest einstellen ohne Scrollbalken.

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Consolenbreite und Höhe fest einstellen ohne Scrollbalken.

Beitrag von funkheld »

Hallo, guten Tag.

Wie kann ich mit Purebasic eine Console erstellen zb mit fester Grösse :40x25 die ohne Scollbalken ist ?
Oder kann man irgendwie eine künstliche Console herstellen mit einem Screen ?

Danke.

Gruss
peter
Lothar Schirm
Beiträge: 41
Registriert: 30.04.2012 16:38

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Beitrag von Lothar Schirm »

Ich habe es mal mit einem CanvasGadget ausprobiert, siehe: http://forums.purebasic.com/german/view ... =8&t=26439
:)
Das Fenster scrollt allerdings nicht. Wenn die untere Zeile erreicht ist und man will noch weiter, muss man das CanvasGadget mit dem Box()-Befehl löschen.
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: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Beitrag von ts-soft »

Lothar Schirm hat geschrieben:Das Fenster scrollt allerdings nicht. Wenn die untere Zeile erreicht ist und man will noch weiter, muss man das CanvasGadget mit dem Box()-Befehl löschen.
CanvasGadget in ein ScrollAreaGadget packen und schon sollte das Scrollen möglich sein :wink:
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: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Beitrag von Lothar Schirm »

Funkheld wollte doch, glaube ich, keinen Scrollbalken? - Meine Erklärung, mit dem Box()-Befehl das CanvasGadget zu löschen, war auch nicht ganz vollständig, dazu habe ich ja die Prozedur C_Clear() erfunden, die setzt auch den Cursor an den Anfang zurück.

Aber das mit dem ScrollAreaGadget ist eine gute Idee. Das habe ich auch schon mal mit einem selbstgebauten DataGrid gemacht. Das ist einfach ein Array aus StringGadgets, die man direkt beschreiben kann, in Form einer Liste (eindimensionales Array) oder einer Tabelle (zweidimensionales Array). Die Spaltenüberschriften sind als TextGadgets realisiert. Die Gadget-Nummern werden mit #PB_ANY generiert und dementsprechend in einem ein- bzw. zweidimensionalen Array gespeichert, so dass jede Zelle im DataGrid mit SetGadgetText() oder GetGadgetText() angesprochen werden kann. Wenn es von Interesse ist, kann ich den Code und ein Beispielprogramm ja mal posten, weil es so schön einfach ist. Im Forum gab es schon vornehmere und kompliziertere Lösungen, deswegen habe ich mich bisher nicht getraut ...
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Beitrag von funkheld »

Hallo, guten Abend.
Lothar Schirm, deine vorgehensweise liest sich ja sehr interessant .
Könntest du mal den Code bitte hier einmal reinstellen ?

Ich möchte nämlich eine Screen-Oberfläche generieren wie beim Z1013 , 32x32 Horizontral/Vertikal.

Danke.

Gruss
peter
Lothar Schirm
Beiträge: 41
Registriert: 30.04.2012 16:38

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Beitrag von Lothar Schirm »

Hallo Peter,

dies ist die Datei zum Testen des DataGrids (Ausgabe von Testdaten erfolgt auf das Konsolenfenster):

Code: Alles auswählen

;==============================================================================
; DataGridTest.pb
; Test des DataGrid
; Erstellt am 09.02.2013
; Letzte Bearbeitung am 17.02.2013
;==============================================================================

EnableExplicit

IncludeFile "DataGrid.pbi"
IncludeFile "DataGridTest.pbf"


Global Dim sListID.i(30)
Global Dim sTabID.i(30, 3)
Dim SpBreite.i(3)
Dim Titel.s(3)
Define i, j, event


Procedure Button_List(EventType)
  ; DataList auslesen
  
  Protected.i i
  
  ClearConsole()
  ConsoleTitle("Daten in der Liste")
  For i = 0 To 30
    PrintN(GetGadgetText(sListID(i)))
  Next
    
EndProcedure


Procedure Button_Tab(EventType)
  ; Tabelle auslesen
  
  Protected.i i, j
  
  ClearConsole()
  ConsoleTitle("Daten in der Tabelle")
  For i = 0 To 30
    For j = 0 To 3
      ConsoleLocate(19 * j, i)
      Print(GetGadgetText(sTabID(i, j)))
    Next
  Next
  
EndProcedure




; Hauptprogramm

For i = 0 To 3
  SpBreite(i) = 100
  Titel(i) = "Spalte Nr. " + Str(i)
Next

OpenConsole()
ConsoleTitle("DataGridTest")
EnableGraphicalConsole(1)

OpenWindow_DataGrid()
DataList(sListID(), 20, 20, 160, 340, "Datenliste")
DataTab(sTabID(), 200, 20, 380, 340, SpBreite(), Titel())

For i = 0 To 30
  SetGadgetText(sListID(i), "Eintrag Nr. " + Str(i))
Next

For i = 0 To 30
  For j = 0 To 3
    SetGadgetText(sTabID(i, j), "Eintrag Nr. " + Str(i) + "," + Str(j))
  Next
Next

Repeat
  event = WaitWindowEvent()
Until Window_DataGrid_Events(event) = #False

CloseConsole()

End
Das ist die zugehörige pbf-Datei (DataGridTest.pbf):

Code: Alles auswählen

Enumeration #PB_Compiler_EnumerationValue
  #Window_DataGrid
EndEnumeration

Enumeration #PB_Compiler_EnumerationValue
  #Button_List
  #Button_Tab
EndEnumeration

Declare Button_List(EventType)
Declare Button_Tab(EventType)

Procedure OpenWindow_DataGrid()
  OpenWindow(#Window_DataGrid, 0, 0, 600, 400, "DataGrid-Test - editierbares DataGrid", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  ButtonGadget(#Button_List, 20, 370, 160, 20, "Liste auslesen")
  ButtonGadget(#Button_Tab, 200, 370, 100, 20, "Tabelle auslesen")
EndProcedure

Procedure Window_DataGrid_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Button_List
          Button_List(EventType())          
        Case #Button_Tab
          Button_Tab(EventType())          
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure
Und dies ist die Include-Datei DataGrid.pbi mit den Prozeduren zur Definition einer Liste oder einer Tabelle:

Code: Alles auswählen

;==============================================================================
; DataGrid.pbi
; Beschreibbare Datenliste oder Tabelle
; Erstellt am 09.02.2013
;==============================================================================


EnableExplicit


Procedure DataList(Array StringID.i(1), x.i, y.i, Breite.i, Hoehe.i, Titel.s)
  ; Einspaltige Datenliste aus StringGadgets (Höhe = 20), eingeschlossen durch ein
  ; ScrollAreaGadget. Parameter:
  ; - StringID() = Array mit den Gadget-Konstanten der StringGadgets
  ; - x, y, Breite, Hoehe = Position und Abmessungen des ScrollAreaGadgets
  ; - Titel = Ueberschrift
  
  Protected.i i, ScrollAreaID, TextID, n = ArraySize(StringID())
  
  ScrollAreaID = ScrollAreaGadget(#PB_Any, x, y, Breite, Hoehe, Breite, 20 * (n + 2))
  TextID = TextGadget(#PB_Any, 0, 0, Breite, 20, Titel, #PB_Text_Border)
  For i = 0 To ArraySize(StringID())
    StringID(i) = StringGadget(#PB_Any, 0, 20 * (1 + i), Breite, 20, "")
  Next
  CloseGadgetList()
  
EndProcedure


Procedure DataTab(Array StringID.i(2), x.i, y.i, Breite.i, Hoehe.i, Array SpBreite.i(1),
                          Array Titel.s(1))
  ; Datentabelle aus StringGadgets (Höhe = 20), eingeschlossen durch ein ScrollAreaGadget.
  ; Parameter:
  ; - StringID() = Array mit den Gadget-Konstanten der StringGadgets (erster Index = Zeile,
  ;   zweiter Index = Spalte)
  ; - x, y, Breite, Hoehe = Position und Abmessungen des ScrollAreaGadgets
  ; - SpBreite() = Array mit den Spaltenbreiten
  ; - Titel() = Spaltenüberschriften
  
  Protected.i i, j, ScrollAreaID, m = ArraySize(StringID(), 1), n = ArraySize(StringID(), 2)
  Protected Dim TextID.i(n)
  Protected Dim Col.i(n)
  
  ; Spaltenpositonen berechnen:
  Col(0) = 0
  For j = 1 To n
    Col(j) = Col(j - 1) + SpBreite(j - 1)
  Next
  
  ; Tabelle erzeugen:
  ScrollAreaID = ScrollAreaGadget(#PB_Any, x, y, Breite, Hoehe, Col(n) + SpBreite(n), 20 * (m + 2))
  For j = 0 To n
    TextID(j) = TextGadget(#PB_Any, Col(j), 0, SpBreite(j), 20, Titel(j), #PB_Text_Border)
  Next
  For i = 0 To m
    For j = 0 To n
      StringID(i, j) = StringGadget(#PB_Any, Col(j), 20 * (1 + i), SpBreite(j), 20, "")
    Next
  Next
  CloseGadgetList()
  
EndProcedure
Eine neugierige Frage: Was ist eine Screen-Oberfläche wie beim Z1013 , 32x32 Horizontal/Vertikal? Das klingt dann doch eher nach der "CanvasGadget-Konsole" (siehe oben, Link zum Code ist angegeben). Allerdings weiß ich nicht, wie man da eine feste Spaltenzahl definieren kann, da die Zeichenbreiten der verschiedenen Buchstaben und Zahlen nicht einheitlich sind. Oder weiß jemand, ob es einen Schriftfont mit einheitlicher Zeichenbreite gibt?

Oder nimm FreeBASIC, da genügt eine Programmzeile: WIDTH 32, 32. Ist für Konsolenanwendungen eh besser geeignet als PureBasic.

Viel Erfolg,
Lothar
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Beitrag von funkheld »

Eine Frage: Was ist eine Screen-Oberfläche wie beim Z1013 , 32x32 Horizontal/Vertikal? Das klingt dann doch eher nach der "CanvasGadget-Konsole" (siehe oben, Link zum Code ist angegeben).
Ist ein Screen von 32x32 Zeichen (je Zeichen 8 Bit Breit und 8 Bit Hoch).
Ich muss es anders machen.

Danke.

Gruss
peter
Biozynotiker
Beiträge: 8
Registriert: 16.03.2013 19:44

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Beitrag von Biozynotiker »

@Funkheld

Ich würde dies wiefolgt lösen:

Code: Alles auswählen

Global Cols.i = 40 ; Breite
Global Lines.i = 25 ; Hoehe

OpenConsole( "Console Test" )
RunProgram( GetEnvironmentVariable("COMSPEC") , "/c mode con: cols=" + Cols + " lines=" + Lines, "c:\" , #PB_Program_Wait )
ClearConsole()
Input()
PureBasic 5.60
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Beitrag von funkheld »

Ja, danke für den Vorschlag.

Kann man auch irgendwie die Form der Zeichen verändern ?

Danke.

Gruss
peter
Antworten