Seite 1 von 1

Window mit Image und Buttons erstellt - Funktionen lernen?

Verfasst: 11.12.2010 20:51
von 01-andreas
Hallo,

ich habe mich heute intensiv mit dem Thema Window-Handling beschäftigt (Tutorial als PDF). Hier habe ich gelernt, wie man allgemein Window Fenster erstellen kann, Buttons und ein Bild erstellen kann.

Jetzt wollte ich gerne wissen, wie und wo ich lernen kann, dass man wenn man auf ein Button klickt, dass das Programm automatisch für mich eine Notepad Datei auf meiner Festplatte bearbeitet (Notepad Datei öffnen, bearbeiten, speichern und beenden)

Gibt es dort ein Tutorial mit den ganzen Funktionen? Ich habe bisher keins gefunden, im Purebasic Buch habe ich auch nichts gefunden, das nächstes Thema nach Windows-Handling war 2D Zeichen.

Könnt ihr mir hier sagen, welche Stichwörter es sind oder in welchem Tutorial ich es nachlesen kann?

Re: Window mit Image und Buttons erstellt - Funktionen lerne

Verfasst: 11.12.2010 21:38
von c4s
Ich halte nicht viel davon einfach nur einem Tutorial zu folgen, denn da fehlt meiner Meinung nach der Lerneffekt. Probiere doch einfach mal selbst mit den folgenden Stichwörtern herum und versuche dabei nur die PureBasic-Hilfe zu benutzen:
WaitWindowEvent(), OpenFile(), ReadString(), WriteString()

Wenn du fertig bist, kannst du am Ende (!) dein Werk mit einem Musterbeispiel vergleichen und siehst dann was man hätte besser machen können etc. - "Learning by doing" ist immer noch die beste Lernmethode. :allright:

Re: Window mit Image und Buttons erstellt - Funktionen lerne

Verfasst: 11.12.2010 21:49
von 01-andreas
OpenFile(), ReadString(), WriteString(), die drei Dinge musste ich genau wissen, kenne die noch nicht.

Jetzt kann ich dank dir schauen in der F1 Liste. Ich probiere es jetzt mal , sollte irgendetwas nicht funktionieren, poste ich es hier nochmal. Trotzdem nochmal Danke, ich brauchte dringend diese Stichwörter.

Re: Window mit Image und Buttons erstellt - Funktionen lerne

Verfasst: 11.12.2010 22:18
von Kiffi
zum Auslesen einer Datei bitte ReadFile() verwenden. Um
eine Datei zu erstellen benutzt man CreateFile().

OpenFile() benötigt man in eher seltenen Fällen und ist nicht
grade anfängertauglich.

Grüße ... Kiffi

Re: Window mit Image und Buttons erstellt - Funktionen lerne

Verfasst: 12.12.2010 02:44
von c4s
@Kiffi
Andreas sprach vom Bearbeiten einer Datei. OpenFile() ist dabei wohl am passendsten (wobei du recht damit hast, dass es unverständlicher sein könnte).

Re: Window mit Image und Buttons erstellt - Funktionen lerne

Verfasst: 12.12.2010 03:51
von ts-soft
Hier ein dokumentiertes Beispiel für ein Editor.

Ist für den Anfang zwar recht viel, aber wenn Du Dich auf einzelne Proceduren konzentrierst,
sollte das auch helfen.

Gruß
Thomas

// edit
Vielleicht erstmal was einfaches. Simple Ampel, die auf Knopfdruck reagiert :wink:

Code: Alles auswählen

EnableExplicit

Enumeration ; Bilder
  #AmpelRot
  #AmpelGelb
  #AmpelGruen
EndEnumeration

Enumeration ; Fenster
  #frmMain
EndEnumeration

Enumeration ; Gadgets
  #Image_Ampel
  #Button_Rot
  #Button_Gelb
  #Button_Gruen
EndEnumeration

; hier werden einmalig die 3 Ampelbilder erzeugt
Procedure Create_AmpelImage(image)
  If CreateImage(image, 100, 240)
    If StartDrawing(ImageOutput(image))
      Box(0, 0, 100, 240, $FFFFFF)
      RoundBox(4, 4, 92, 232, 20, 20, $182D17)
      Circle(50, 50, 30, $003900)
      Circle(50, 120, 30, $003900)
      Circle(50, 190, 30, $003900)
      Select image
        Case #AmpelRot
          Circle(50, 50, 30, $0000FF)
        Case #AmpelGelb
          Circle(50, 120, 30, $00FFFF)
        Case #AmpelGruen
          Circle(50, 190, 30, $00FF00)
      EndSelect
      StopDrawing()
    EndIf
  EndIf
EndProcedure

; hier wird das Hauptfenster erzeugt
Procedure Create_frmMain()
  If OpenWindow(#frmMain, #PB_Ignore, #PB_Ignore, 220, 260, "Ampel", #PB_Window_SystemMenu | #PB_Window_Invisible)
    
    ImageGadget(#Image_Ampel, 10, 10, 100, 240, ImageID(#AmpelGruen), #PB_Image_Border)
    ButtonGadget(#Button_Rot, 120, 50, 80, 20, "Rot")
    ButtonGadget(#Button_Gelb, 120, 120, 80, 20, "Gelb")
    ButtonGadget(#Button_Gruen, 120, 190, 80, 20, "Gruen")
    ProcedureReturn #True
  EndIf
EndProcedure

Define image
; alle 3 Ampelbilder in der Schleife Mithilfe der Procedure erzeugen
For image = #AmpelRot To #AmpelGruen
  Create_AmpelImage(image)
Next

If Create_frmMain() ; wenn Fenster erzeugt
  HideWindow(#frmMain, #False); dann anzeigen
  
  Repeat ; hier beginnt der Event-Loop
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow ; Fenster schliessen oder Alt+F4 wurden gedrückt
        Break ; schleife verlassen (in diesem Beispiel wird das Programm dadurch auch beendet)
        
      Case #PB_Event_Gadget ; ein Gadget wurde gedrückt
        Select EventGadget() ; feststellen, welche Gadget
          Case #Button_Rot
            SetGadgetState(#Image_Ampel, ImageID(#AmpelRot)) ; Ampel umschalten (Bild austauschen)
          Case #Button_Gelb
            SetGadgetState(#Image_Ampel, ImageID(#AmpelGelb)) ; Ampel umschalten
          Case #Button_Gruen
            SetGadgetState(#Image_Ampel, ImageID(#AmpelGruen)) ; Ampel umschalten
        EndSelect
    EndSelect
  ForEver
EndIf

Re: Window mit Image und Buttons erstellt - Funktionen lerne

Verfasst: 12.12.2010 20:08
von 01-andreas
Wow echt ein tolles Beispiel, ich habe mir es eben mal schnell angeguckt, die Codes soweit verstehe ich alles recht gut. In den nächsten Tagen, wenn ich Zeit habe, werde ich mich damit intensiver beschäftigen.

Was ich hier gerade sehe ist, dass man für dieses Beispiel diese Stichwörter kennen muss:

Proceduren,Konstanten,If,EndIf, OpenWindow,Next,Select und natürlich 2D noch.

Was für mich in diesem Beispiel noch ziemlich neu ist: Break und Define image, in den nächsten Tagen werde ich mir diese Funktionen anschauen in der Purebasic F1 Hilfe, aber so schwer scheint es gar nicht zu sein, man muss nur diese Stichwörter alle gut verstehen können.

Re: Window mit Image und Buttons erstellt - Funktionen lerne

Verfasst: 12.12.2010 20:46
von ts-soft
Wenn Du den Code halbwegs verstanden hast, solltest Du damit spielen :wink:
Die 3 Buttons ersetzen durch 3 OptionGadgets.
Danach vielleicht durch ComboBoxGadget ersetzen.

Später vielleicht noch die Rot/Gelb Phase einbauen, als 4tes Image.

Du solltest also mit diesem kleinem Beispiel erstmal ein paar Tage/Wochen rumspielen,
dabei lernst Du am meisten.

Gruß
Thomas

Re: Window mit Image und Buttons erstellt - Funktionen lerne

Verfasst: 12.12.2010 23:53
von ts-soft
Hatte gerade langeweile :wink:

Dieser Ampelcode enthält folgende Änderungen:
4 Ampelbilder (Rot/Gelb Phase eingebaut)
Bilder werden rekursiv in der Procedure erstellt (ohne For:Next Schleife)
Knöpje entfernt und durch Timer ersetzt.

Automatische Ampel ist ja auch realistischer :mrgreen:

Code: Alles auswählen

EnableExplicit

Enumeration ; Bilder
  #AmpelRot
  #AmpelRotGelb
  #AmpelGelb
  #AmpelGruen
EndEnumeration

Enumeration ; Fenster
  #frmMain
EndEnumeration

Enumeration ; Gadgets
  #Image_Ampel
EndEnumeration

; hier werden einmalig die 4 Ampelbilder erzeugt
Procedure Create_AmpelImage(image = #AmpelRot)
  If CreateImage(image, 100, 240)
    If StartDrawing(ImageOutput(image))
      Box(0, 0, 100, 240, $FFFFFF)
      RoundBox(4, 4, 92, 232, 20, 20, $182D17)
      Circle(50, 50, 30, $003900)
      Circle(50, 120, 30, $003900)
      Circle(50, 190, 30, $003900)
      Select image
        Case #AmpelRot
          Circle(50, 50, 30, $0000FF)
        Case #AmpelRotGelb
          Circle(50, 50, 30, $0000FF)
          Circle(50, 120, 30, $00FFFF)
        Case #AmpelGelb
          Circle(50, 120, 30, $00FFFF)
        Case #AmpelGruen
          Circle(50, 190, 30, $00FF00)
      EndSelect
      StopDrawing()
    EndIf
  EndIf
  image + 1
  If image <= #AmpelGruen
    Create_AmpelImage(image) ; rekursiver Aufruf der Procedure
  EndIf
EndProcedure

; hier wird das Hauptfenster erzeugt
Procedure Create_frmMain()
  If OpenWindow(#frmMain, #PB_Ignore, #PB_Ignore, 120, 260, "Automatische-Ampel", #PB_Window_SystemMenu | #PB_Window_Invisible)
    
    ImageGadget(#Image_Ampel, 10, 10, 100, 240, ImageID(#AmpelRot), #PB_Image_Border)

    ProcedureReturn #True
  EndIf
EndProcedure

Define state = #AmpelRot
; alle 4 Ampelbilder in der Procedure erzeugen
Create_AmpelImage()

If Create_frmMain() ; wenn Fenster erzeugt
  HideWindow(#frmMain, #False); dann anzeigen
  
  AddWindowTimer(#frmMain, 1, 10000)
  
  Repeat ; hier beginnt der Event-Loop
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow ; Fenster schliessen oder Alt+F4 wurden gedrückt
        Break ; schleife verlassen (in diesem Beispiel wird das Programm dadurch auch beendet)
      
      Case #PB_Event_Timer ; Timer-Ereignis wurde ausgelöst
        Select EventTimer() ; welcher Timer (wir haben nur Timer 1 in diesem Beispiel!)
          Case 1
            Select state
              Case #AmpelRot
                state = #AmpelRotGelb
                ; wir passen das Timeout an!
                AddWindowTimer(#frmMain, 1, 2000) ; RotGelb phase nur 2 sek.
                
              Case #AmpelRotGelb
                state = #AmpelGruen
                AddWindowTimer(#frmMain, 1, 20000) ; lange Grünphase ;)
              
              Case #AmpelGruen
                state = #AmpelGelb
                AddWindowTimer(#frmMain, 1, 3000) ; Gelb phase 3 sek.
                
              Case #AmpelGelb
                state = #AmpelRot
                AddWindowTimer(#frmMain, 1, 10000)
            EndSelect
            
            SetGadgetState(#Image_Ampel, ImageID(state)) ; Ampelbild gemäß aktuellem state setzen
        EndSelect
    EndSelect
  ForEver
EndIf
Gruß
Thomas