Seite 1 von 1

Consolenbreite und Höhe fest einstellen ohne Scrollbalken.

Verfasst: 05.05.2013 20:12
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

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Verfasst: 06.05.2013 17:16
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.

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Verfasst: 06.05.2013 17:28
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:

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Verfasst: 06.05.2013 19:46
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 ...

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Verfasst: 06.05.2013 22:52
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

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Verfasst: 07.05.2013 17:28
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

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Verfasst: 07.05.2013 23:22
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

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Verfasst: 08.05.2013 16:29
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()

Re: Consolenbreite und Höhe fest einstellen ohne Scrollbalk

Verfasst: 08.05.2013 22:19
von funkheld
Ja, danke für den Vorschlag.

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

Danke.

Gruss
peter