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.

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
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
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
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
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