Konsolenfenster oder "richtiges" Fenster

Anfängerfragen zum Programmieren mit PureBasic.
Abraxus
Beiträge: 22
Registriert: 13.01.2011 15:23

Konsolenfenster oder "richtiges" Fenster

Beitrag von Abraxus »

In einem vorigen Thread habe ich die Frage gestellt inwieweit sich ein Konsolenfenster gestalten lässt. Dabei wurde ich gefragt warum ich mich unbedingt auf die Konsole konzentriere und nicht besser mit einem "richtigen" Fenster arbeite. Bin ein absoluter Newbie und habe bislang nur von den Konsolenfenstern gelesen. Deshalb jetzt die bitte mir zu verdeutlichen was es nun genau mit einem "richtigen" Fenster zu tun hat und wo die Unterschiede zu den Konsolenfenstern sind.
Mfg Abraxus
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Konsolenfenster oder "richtiges" Fenster

Beitrag von c4s »

Schau dir am besten die Beispiel-Codes in der Hilfedatei mal an. Konsolenfenster werden eigentlich nicht mehr gebraucht, dann sie bieten im Grunde keine wirkliche Interaktionsmöglichkeit zwischen dem Benutzer und dem Programm: Sei es visuell oder auf Eingaben bezogen.
Ich empfehle dringlichst zu lernen wie man mit dem Event-Handlung unter "richtigen" Fenstern umgeht und dies dann auch anzuwenden. Konsolen sind von vorgestern. :wink:

OpenWindow():

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Window example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

;
; Open a window, and do some stuff with it...
;

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

  MessageRequester("Information", "Click to move the Window", 0)
  ResizeWindow(0, 200, 200, #PB_Ignore, #PB_Ignore)   ; Move the window to the coordinate 200,200
  
  MessageRequester("Information", "Click to resize the Window", 0)
  ResizeWindow(0, #PB_Ignore, #PB_Ignore, 320, 200) ; Resize the window to 320,200
  
  ;
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the EventID
  ; isn't 0 and we just have to see what have happened...
  ;

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf

  Until Quit = 1
  
EndIf

End   ; All the opened windows are closed automatically by PureBasic
OpenConsole():

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Console example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;
    text$  = "Feel the Power of PureBasic!"        ; just a small text$ string
    dlay   = 4000                                  ; delay will set to 4000

;
;-------- Open our Console --------
;

    OpenConsole()                                  ; First we must open a console
    ConsoleTitle ("PureBasic - Console Example:")  ; Now we can give the opened console a Titlename ;)                                                  
    EnableGraphicalConsole(1)

;                                                                                                   
;-------- Ask and display the UserName --------
;
    
    ConsoleLocate (18,12)                          ; x y position 
    Print ("Please enter your name:   ")           ; Ask for name
    name$=Input()                                  ; Wait for user input

    ClearConsole()                                 ; This will clean the ConsoleScreen
    
    ConsoleLocate (24,10)                          ; x y position 
    PrintN ("Welcome "+name$)                      ; Print our text and the UserName
    ConsoleLocate (24,12)                          ; x y position
    PrintN (text$)                                 ; Print our text

    Delay (dlay)                                   ; Waits for moment

;
;-------- Cls and Cycle the Text-BG-Color 0 to 15 --------
;                                                  

    ClearConsole()                                 ; This will clean the ConsoleScreen
                                                   ; Info: Standard colors are (8 for text, 0 for backround)
    For i = 0 To 15
        ConsoleColor (0,i)                         ; Change BackGround text color (max 15) in every loop         
        ConsoleLocate (24,4+i)                     ; x y position 
        Print (text$)                              ; Print our text
    Next i

    Delay (dlay)                                   ; Waits for moment

;
;-------- Cls and Cycle the Text-FG-Color 0 to 15 --------
;

    ConsoleColor(0,0)                              ; Set back to black (0,0) for complete background...
    ClearConsole()                                 ; This will clean the ConsoleScreen
                                                   ; Info: Standard colors are (8 for text, 0 for backround)
    For i = 0 To 15
        ConsoleColor (i,0)                         ; Change ForGround text color (max 15) in every loop         
        ConsoleLocate (24,4+i)                     ; x y position 
        Print (text$)                              ; Print our text
    Next i

    Delay (dlay)                                   ; Waits for moment

;
;-------- Cls and Cycle the Background-Color 0 to 15 --------
;

    For a = 1 To 15
        ConsoleColor(a,a)                          ; Cycle background color...
        ClearConsole()                             ; This will clean the ConsoleScreen
        ;                                          ; Info: Standard colors are (8 for text, 0 for backround)
        For i = 0 To 15
            ConsoleColor (i,a)                     ; Change ForGround text color (max 15) in every loop         
            ConsoleLocate (24,4+i)                 ; x y position 
            Print (text$)                          ; Print our text
        Next i
        ;
        Delay(dlay/10)                             ; Waits for moment
    Next a    

    ;-------- Exit --------

    CloseConsole()
End
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Konsolenfenster oder "richtiges" Fenster

Beitrag von super_castle »

Dieses AVR-Basic auf dem AVR644p kommuniziert über die serielle Schnittstelle mit dem Consolenprogramm und der Tastatur vom PC:
http://www.mikrocontroller.net/topic/177030#new

Die Kommunikation funktioniert mit der Console bei mir : Atmega644 - Pc.
Mit einem Windowscreen wäre es um einiges schwieriger , Text auszutauschen, darzustellen, scrollen usw.
Die Text/Edit-Fenster sind da nicht sehr einfach zu händeln.

Das einzige, die Serielle Schnittstelle wird über ein kleines Fenster eingestellt.

Gruss and die Hardwaregang des Atmegas

Code: Alles auswählen

OpenConsole()
EnableGraphicalConsole(1)

Global *datspeicher.l,datlaenge.l,geladen.l,zaehler.l,lauf.l
Global text1.s,text2.s,datei.s
Global text_s.s,port.l,s_byte.c,aa.l,itext.s,itext1.c

Define.l Event, EventWindow, EventGadget, EventType, EventMenu
  
Declare lade_datei()
Declare uebertrage()

Enumeration
  #Window_0
  #Button_0
  #Button_1
  #Button_2
  #Button_3
  #String_0
  #String_1
  #datei_0
EndEnumeration

port=-1

OpenWindow(#Window_0, 400, 150, 250,100, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
SetCurrentDirectory("data/") 

ButtonGadget(#Button_1, 10,10, 80, 22, "Seriell ein")
ButtonGadget(#Button_2, 10,40, 80, 22, "Seriell aus")
StringGadget(#String_0, 100, 10, 120, 22, "")

Repeat
  
  Event = WaitWindowEvent(1)   
  
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      
      If EventGadget = #Button_1 
        If port=-1
          port=OpenSerialPort(#PB_Any, "COM4", 57600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 17000,17000)
          If port
            text2=""
            text2 + "...geöffnet   "+Str(port)
            SetGadgetText(#string_0, text2)
          Else
            text2 + "...nichts"
            SetGadgetText(#String_0, text2)
            port=-1
          EndIf
        EndIf  
      EndIf
      
      If EventGadget = #Button_2 
        If port > 0
          CloseSerialPort(port)
          text2=""
          text2 + "...geschlossen"
          SetGadgetText(#string_0, text2) 
          port=-1
        EndIf
      EndIf
      
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
  
  itext = Inkey()
  
  If port > 0
    While AvailableSerialPortInput(port)   
      ReadSerialPortData(port, @s_byte, 1)
      
      If aa > 79
        PrintN("")
        aa=0
      ElseIf s_byte =13
        PrintN("")
        aa=0
        Goto weiter
      ElseIf s_byte =10
        Goto weiter
      EndIf  
      
      If s_byte=35
        uebertrage()
        Goto weiter
      EndIf  
      
      Print(Chr(s_byte))
      aa=aa+1
      weiter:
    Wend 
    
    If itext <> ""
      If aa > 79
        PrintN("")
        aa=0
      ElseIf itext=Chr(13)
        PrintN("")
        aa=0
        Goto weiter1
      EndIf  
      
      aa=aa+1
      weiter1:
      WriteSerialPortData(port, @itext, 1)      
    EndIf
  EndIf  
    
ForEver

End

Procedure uebertrage()
  text1=Input()
  lade_datei()
  
  Delay(500)
  If port > 0 And geladen=1
    lauf=0
          
    While lauf < datlaenge
      itext1=PeekB(*datspeicher+lauf)            
      If itext1=13
        lauf=lauf+1
      EndIf            
      WriteSerialPortData(port, @itext1, 1)  
      lauf=lauf+1  
      Wend 
          
      itext1=27
      WriteSerialPortData(port, @itext1, 1)      
    EndIf
EndProcedure
  
Procedure lade_datei()
  geladen=0
  If ReadFile(#datei_0, text1+".bas")
    datlaenge    = Lof(#datei_0)
    *datspeicher = AllocateMemory(datlaenge)   
    ReadData(#datei_0, *datspeicher, datlaenge) 
    itext1=35
    WriteSerialPortData(port, @itext1, 1)      
  Else
    PrintN("nix...")
    itext1=27
    WriteSerialPortData(port, @itext1, 1)      
    ProcedureReturn #datei_0  
  EndIf
  CloseFile(#datei_0)
  geladen=1
EndProcedure
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Konsolenfenster oder "richtiges" Fenster

Beitrag von NicTheQuick »

@super_castle: Aus deinem Posting geht nicht hervor, was es mit der ursprünglichen Frage des Thread-Erstellers zu tun hat.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Konsolenfenster oder "richtiges" Fenster

Beitrag von super_castle »

Ist doch klar.

In manchen Lebenslagen kommt man um die Console nicht rum.
Sie ist immer wieder gefragt.

Die Frage muss er sich selber mal beantworten, wenn er ein bestimmtes Projekt schreibt.
Und wenn er meint es geht mit der Console , dann soll er sie nehmen ohne Schiss vor Kritik.
Und wenn er meint , das er sie Spielend durch einen Screen ersetzen kann, dann tut er das eben.

Was ist daran so schwierig?

Man kann nicht sagen:
1. die Katholen nehmen die Console
2. die Protestanten nehmen den Screen

:D

Gruss
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Konsolenfenster oder "richtiges" Fenster

Beitrag von Nino »

super_castle hat geschrieben:Die Frage muss er sich selber mal beantworten, wenn er ein bestimmtes Projekt schreibt.
Du entscheidest wohl kaum, wer was tun muss. Selbstverständlich kann er die Frage hier stellen, und andere Forenmitglieder um ihre Einschätzung bitten, so wie er es getan hat. Allerdings nützen ihm nur Antworten von Leuten, die mindestens seine Frage gelesen und verstanden haben. Wenn Du damit überfordert bist, warum hältst Du nicht einfach mal den Schnabel?

Vielleicht sollten wir auf Deine "superklugen" Fragen in Zukunft auch antworten: Die Frage muss unser Superheld sich mal selber beantworten.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Konsolenfenster oder "richtiges" Fenster

Beitrag von NicTheQuick »

Um mal zum Hauptthema zurück zu kommen.

@Abraxus:
Gegen die Verwendung der Konsole spricht zunächst mal nichts. Wenn das Programm nur für dich selbst bestimmt ist und du eher auf die Einfachheit stehst, dann ist die Konsole natürlich sehr praktisch. Ich als Linux-Nutzer verwende oft die Konsole und deren fortgeschrittenen Befehle, weil ich damit teilweise schneller bin und auf jeden Fall mehr Möglichkeiten habe als mit einer GUI, durch die ich mich erst durch klicken muss und die mir vielleicht gar nicht genug Parameter zum Einstellen anbietet.

Willst du allerdings, dass dein Programm einen breiteren Nutzerkreis ansprichst, kommst du heute um eine GUI nicht mehr herum. Dafür schau dir einfach die Beispiele von c4s an, lies die Befehle in der Hilfe nach, versuche Beispiele zu verstehen und ändere sie ab. So lernst du schnell und einfach daraus. Unter einer GUI versteht man alles, was du bereits von den Programmen kennst, die du sicherlich täglich nutzt: Browser, Dateimanager, Messenger, E-Mail-Programm, usw...

super_castle hat noch einen Screen angesprochen, aber das ist wieder etwas ganz anderes. Das baut auf einem anderen System auf und ist kein "richtiges" Fenster, um mal in deinen Worten zu sprechen. Das ist dann nämlich eher für Spiele oder generell Vollbildanwendungen geeignet oder einfach für Dinge, die grafisch aufwendig sind.
Antworten