Seite 1 von 2

Window erstellen in Purebasic funktioniert nicht

Verfasst: 07.12.2010 19:35
von 01-andreas
Hallo,

ich bin gerade dabei mit dem Tutorial weiterzulernen, nur ich komme beim Thema WindowsHandling nicht weiter, weil dort ein Syntax Fehler sein soll. Wo genau liegt dieser Fehler, dieser Code Abschnitt steht im Tutorial und auch bei F1 sogar.

Code: Alles auswählen

OpenWindow(0,0,0,300,200,#PB_WINDOW_SCREENCENTERED |
#PB_WINDOW_SYSTEMMENU,"Hallo :-)") ;wir Öffnen das Fenster
Repeat ;unsere Schleife
;Wir warten auf ein Ereignis des Fensters
Event = WaitWindowEvent()
;Okay, irgendwas ist geschehen auf dem Fenster
Select Event ;Wir schauen, was passiert ist
Case #PB_Event_CloseWindow ;Falls das Fenster geschlossen werden soll
;Nachfrage, ob das Fenster wirklich geschlossen werden soll
aw = MessageRequester("Frage","Soll das Fenster geschlossen
werden?",#PB_MessageRequester_YesNo)
If aw = 6 ;6 = Ja-Knopf
End
EndIf
EndSelect
ForEver
Wie lautet denn die erste Zeile mit OpenWindow korrekt? Könnt ihr dies für mich bitte korrigieren und sagen woran es liegt, dass dort eine Fehlermeldung "Syntax" kommt.

Re: Window erstellen in Purebasic funktioniert nicht

Verfasst: 07.12.2010 19:42
von ts-soft
Vertausch mal den Fenstertitel und die Flags!

Gruß
Thomas

Re: Window erstellen in Purebasic funktioniert nicht

Verfasst: 07.12.2010 19:42
von rolaf
01-andreas hat geschrieben:Wie lautet denn die erste Zeile mit OpenWindow korrekt?
OpenWindow markieren und F1 drücken. :mrgreen:

Liegt daran das was vertauscht werden muss, weil der OpenWindow Befehl geändert wurde.

Edi: Klor, ts war wieder schneller.

Re: Window erstellen in Purebasic funktioniert nicht

Verfasst: 07.12.2010 20:00
von 01-andreas

Code: Alles auswählen

;Öffne ein Fenster...
If OpenWindow(0,0,0,100,100,#PB_Window_MinimizeGadget |
#PB_Window_SystemMenu | #PB_Window_ScreenCentered,"Knopf")
;Das Fenster konnte erstellt werden
;Benutze Fenster 0
UseWindow(0)
;Erstelle eine Liste für das aktuell benutzte Fenster
If CreateGadgetList(WindowID())
;Die GadgetListe konnte erstellt werden :-)
;Erstelle ein ButtonGadget(diese Knöpfchen)
ButtonGadget(0,0,0,100,20,"Knopf 1",#PB_Button_Left)
;Und noch einen ^^
ButtonGadget(1,0,80,100,20,"Knopf 2",#PB_Button_Right)
EndIf
;Okay alles klar soweit :-)
;Unsere Event-Loop
Repeat
;Auf ein Event warten...
Event = WaitWindowEvent()
Select Event ;Das Event herausfinden
Case #PB_Event_CloseWindow ;Fenster soll geschlossen werden...
End ;Cya ^^
Case #PB_EventGadget ;Es ist ein Ereignis auf einem Knopf
aufgetreten...
Select EventGadgetID() ;Welches wurde gedrückt?
Case 0 ;Gadget 0 wurde gedrückt...
MessageRequester("Hallo","Du hast Knopf 1 gedrückt",0)
Case 1 ;Gadget 1 wurde gedrückt
MessageRequester("Hallo","Du hast Knopf 2 gedrückt",0)
EndSelect
EndSelect
ForEver
EndIf
Ich habe schon versucht, mehrmals etwas zu tauschen, komme immer zur gleichen Fehlermeldung "Syntax". Das hier soll der letze Code Abschnitt sein vom Autor, der zum Thema WindowsHandling geschrieben hat, er hat beim Tut auch ein Bild gezeigt, bei dem es alles funktioniert.

Könnt ihr den Code korrigieren?

Re: Window erstellen in Purebasic funktioniert nicht

Verfasst: 07.12.2010 20:08
von Sirius-2337

Code: Alles auswählen

;Öffne ein Fenster...
If OpenWindow(0,0,0,100,100,"Knopf",#PB_Window_MinimizeGadget | #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Du musst den ganzen OpenWindow()-Befehl auf eine Zeile Schreiben sonst erkennt PB nicht das das zusammengehört.

Re: Window erstellen in Purebasic funktioniert nicht

Verfasst: 07.12.2010 20:10
von Falko
Da sind aber noch mehr Fehler drinne, die für die ältere Purebasicversion ist.
Man hätte das noch besser formatieren können, aber so läuft das jetzt bei mir :wink:

Code: Alles auswählen

;Öffne ein Fenster...
If OpenWindow(0,0,0,100,100,"Knopf",#PB_Window_MinimizeGadget | #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ;Das Fenster konnte erstellt werden
  ;Benutze Fenster 0
  ;UseWindow(0)
  ;Erstelle eine Liste für das aktuell benutzte Fenster
  If CreateGadgetList(WindowID(0))
    ;Die GadgetListe konnte erstellt werden :-)
    ;Erstelle ein ButtonGadget(diese Knöpfchen)
    ButtonGadget(0,0,0,100,20,"Knopf 1",#PB_Button_Left)
    ;Und noch einen ^^
    ButtonGadget(1,0,80,100,20,"Knopf 2",#PB_Button_Right)
  EndIf
  ;Okay alles klar soweit :-)
  ;Unsere Event-Loop
  Repeat
    ;Auf ein Event warten...
    Event = WaitWindowEvent()
    Select Event ;Das Event herausfinden
      Case #PB_Event_CloseWindow ;Fenster soll geschlossen werden...
    End ;Cya ^^
      Case #PB_Event_Gadget ;Es ist ein Ereignis auf einem Knopf aufgetreten...
      Select EventGadget() ;Welches wurde gedrückt?
        Case 0 ;Gadget 0 wurde gedrückt...
        MessageRequester("Hallo","Du hast Knopf 1 gedrückt",0)
        Case 1 ;Gadget 1 wurde gedrückt
        MessageRequester("Hallo","Du hast Knopf 2 gedrückt",0)
      EndSelect
    EndSelect
  ForEver
EndIf
[Edit] habs noch mal etwas formatiert [/Edit]
Gruß, Falko

Re: Window erstellen in Purebasic funktioniert nicht

Verfasst: 07.12.2010 20:10
von Vera
DrFalo hat geschrieben:OpenWindow markieren und F1 drücken. :mrgreen:
Jow - und wenn der Cursor im Befehl positioniert ist, dann schau mal unten in die Statusleiste der IDE und vergleich das mit der Syntaxbeschreibung der Hilfe.

Unter WIN gibt's sogar noch mehr Unterstützung: wenn Du mit dem Cursor so nach und nach durch die einzelnen Positionen des Befehls wanderst, dann wird in der Statusbar auch genau dieser Befehlsteil fett hervorgehoben - eine echt wertvolle Schnellhilfe.

Gruß ~ Vera
OpenWindow(0,0,0,100,100,#PB_Window_MinimizeGadget|#PB_Window_SystemMenu | #PB_Window_ScreenCentered,"Knopf")

OpenWindow(#Window, x, y, InnereBreite, InnereHoehe, Titel$ [, Flags [, ParentWindowID]])
schau mal, wo der 'Titel' hingehört.

Nachtrag:
und als Letztes, aus Falkos upgedateten Version (danke :) )
diese Zeilen auskommentieren, dann kommt auch der 'deprecated' Hinweis nicht mehr
Zeile 7 ; If CreateGadgetList(WindowID(0))
...
Zeile 13 ; EndIf

Re: Window erstellen in Purebasic funktioniert nicht

Verfasst: 07.12.2010 20:31
von 01-andreas
Sehr gut, danke alle.

Hier nochmal der Code den ich geschrieben habe.

Code: Alles auswählen

OpenWindow(0,0,0,300,200,"Knopf",#PB_Window_ScreenCentered | #PB_Window_SystemMenu) ;wir Öffnen das Fenster
Repeat ;unsere Schleife
;Wir warten auf ein Ereignis des Fensters
Event = WaitWindowEvent()
;Okay, irgendwas ist geschehen auf dem Fenster
Select Event ;Wir schauen, was passiert ist
Case #PB_Event_CloseWindow ;Falls das Fenster geschlossen werden soll
;Nachfrage, ob das Fenster wirklich geschlossen werden soll
aw = MessageRequester("Frage","Soll das Fenster geschlossen werden?",#PB_MessageRequester_YesNo)
If aw = 6 ;6 = Ja-Knopf
End
EndIf
EndSelect
ForEver
Geht jetzt, das Problem lag an dem Title$ (Knopf habe ich ja genommen hier nach den Positionen) und ich habe gesehen dass die Zeilen richtig geschrieben und gelegt werden müssen, damit das Programm auch die Zeile komplett lesen kann, sie darf also nicht in der zweiten Zeile mit Enter weitergehen.

Also Beispiel:

Code: Alles auswählen

OpenWindow(0,0,0,300,200,"Knopf",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
<<<< Richtige Schreibweise

Code: Alles auswählen

OpenWindow(0,0,0,300,200,"Knopf",#PB_Window_ScreenCentered
 | #PB_Window_SystemMenu)
<<<< Falsche Schreibweise


Jetzt komme ich dank euch wieder weiter :allright:

Re: Window erstellen in Purebasic funktioniert nicht

Verfasst: 07.12.2010 20:36
von ts-soft
@01-andreas
Kannst Du mal bitte einen Link zu dem Tutorial posten, oder eine genauere Beschreibung. Kann das
von Dir gepostete Beispiel nicht finden.

Gruß
Thomas

Re: Window erstellen in Purebasic funktioniert nicht

Verfasst: 07.12.2010 20:55
von 01-andreas
Ich habe diesmal etwas mehr kopiert aus dem Tutorial was der Autor genau sagt, vielleicht kennt ihr die pdf Datei ja schon, sie lautet PB-Tutorium

Kapitel Windows Handling


Nach dem letzten, etwas sehr trockenem Kapitel, können wir jetzt zu einem doch
schon interessanterem Teil der Programmierung kommen: Den Fenstern, woher auch
der Name unser aller Lieblingsbetriebssystems Windows herkommt. Warum diese
Dinger ausgerechnet Fenster heißen, weiß der Teufel. So recht was durchsehen kann
ich da ehrlich gesagt nicht… Aber was soll’s, ich muss ja auch nicht alles verstehen
und manche Dinge lassen sich auch nicht irgendwie logisch erklären, das ist bei M$
einfach so. Aber das soll nicht Thema dieses Kapitels sein, wir wollen jetzt mal lieber
lernen, wie man diese undurchsichtigen Fenster benutzt.

Naja, wenigstens sind die Dinger nicht so schwarz wie unsere Consolen ;-) Also, genug der Vorrede. Kommen
wir nun zum Wichtigen: Wie mache ich so ein Fenster auf? Ja, dafür gibt’s wie bei
der Console einen kleinen Befehl, nämlich OpenWindow() sieht irgendwie fast so
aus, wie mit der Console…aber ganz so einfach ist das diesmal nicht ;-) Dieser Befehl
braucht nämlich so einige Parameter, hier mal der Funktionsaufruf mit
Parameterangabe:

Code: Alles auswählen

OpenWindow(#Window, x, y, InnereBreite, InnereHöhe, Flags, Titel$ [,
ParentWindowID])
Das Ding gehen wir jetzt gleich mal Parameter für Parameter durch. Der erste
Parameter ist eine Zahl, was durch das vorangehende # gekennzeichnet ist. Damit
übergibst du dem Fenster eine konstante Nummer. Diese brauchst du, damit du
später die Fenster voneinander unterscheiden kannst. Jedes Fenster braucht eine
EIGENE Nummer, da du ja mehr als nur 1 Fenster öffnen kannst. x gibt an, an
welcher x-Position das Fenster geöffnet werden soll.

Dies gibt an, an welchem horizontalen Punkt die linke, obere Ecke des Fensters sein soll. y gibt an, an welcher
vertikalen Stelle sich die linke, obere Ecke befinden soll. InnereBreite gibt an, wie
groß das Fenster in x-Richtung sein soll. InnereHöhe gibt an, wie groß das Fenster in
y-Richtung sein soll. Flags sind spezielle Übergabewerte an das Fenster. Das kann
eine oder mehrere der folgenden Konstanten sein:

Code: Alles auswählen

#PB_Window_SystemMenu : Schaltet das System-Menü in der Fenster-
Titelzeile ein.
#PB_Window_MinimizeGadget ;Fügt das Minimieren-Gadget der Fenster-Titelzeile hinzu.
#PB_Window_System wird automatisch hinzugefügt.
#PB_Window_MaximizeGadget ;Fügt das Maximieren-Gadget der Fenster-
Titelzeile hinzu. #PB_Window_System wird automatisch hinzugefügt.
#PB_Window_SizeGadget ;Fügt das Größenänderungs-Gadget zum Fenster hinzu.
#PB_Window_Invisible ;Erstellt ein Fenster, zeigt es aber nicht an. Wird nicht
unter AmigaOS unterstützt.
#PB_Window_TitleBar ; Erstellt ein Fenster mit einer Titelzeile.
#PB_Window_BorderLess ;Erstellt ein Fenster ohne jegliche Ränder.
#PB_Window_ScreenCentered ;Zentriert das Fenster in der Mitte des Bildschirms. Die
Parameter x,y werden ignoriert.
#PB_Window_WindowCentered ;Zentriert das Fenster in der Mitte des
übergeordneten Fenster ("parent window")
Die Parameter x,y werden ignoriert. Wenn du mehrere dieser Konstanten verwendest, musst du sie mit einem „ |“
voneinander trennen. Diese Liste ist auch in der Hilfe einsehbar. Titel$ sollte sich von
selbst erklären, hier übergibt man den Namen an das Fenster, der in der Titelzeile
erscheint. Der nächste Parameter ist allerdings wieder etwas anders, als die anderen.
Dieser Parameter ist optional. Hier kann ein „Elternfenster“ angegeben werden. Aber
das lassen wir jetzt erstmal außen vor.

So, das ist jetzt zwar schön, dass wir Fenster erstellen können, aber wie wollen wir jetzt merken, dass der Benutzer zum Beispiel auf das Schließkreuz oder zum Beispiel auf einen Button geklickt hat? Nun, das ist
ganz einfach (natürlich ;-)! Wir benötigen eine Event-Loop. Und schon wieder so
ein verwirrender Begriff :-/. Aber wie immer ganz einfach: Was eine Schleife (Loop)
ist, wisst ihr ja schon, und ein Event ist ein Ereignis. Kurz gesagt, wir brauchen eine
Ereignisschleife.

Ein Ereignis entsteht zum Beispiel, wenn der Benutzer auf eine
Schaltfläche, wie eben zum Beispiel auf das Schließkreuz, oder einen Knopf(Button)
klickt. Auch sind zum Beispiel Ereignisse, wenn das Fenster verschoben wird, oder
gezeichnet wird. Das klären wir noch.Wir schreiben jetzt einfach erstmal eine kleine
Schleife, die demonstriert, wie so etwas aussieht:

Code: Alles auswählen

OpenWindow(0,0,0,300,200,#PB_WINDOW_SCREENCENTERED |
#PB_WINDOW_SYSTEMMENU,"Hallo :-)") ;wir Öffnen das Fenster
Repeat ;unsere Schleife
;Wir warten auf ein Ereignis des Fensters
Event = WaitWindowEvent()
;Okay, irgendwas ist geschehen auf dem Fenster
Select Event ;Wir schauen, was passiert ist
Case #PB_Event_CloseWindow ;Falls das Fenster geschlossen werden soll
;Nachfrage, ob das Fenster wirklich geschlossen werden soll
aw = MessageRequester("Frage","Soll das Fenster geschlossen
werden?",#PB_MessageRequester_YesNo)
If aw = 6 ;6 = Ja-Knopf
End
EndIf
EndSelect
ForEver
Hier wird gerade ein Bild angezeigt, wie das nach dem Drücken von F5 aussieht


Sieht es nicht Originell aus?! ;-) Wenn du auf das Schließkreuz klickst, dann kommt
eine MessageBox(MessageRequester) in der du gefragt wirst, ob du das Fenster
schließen möchtest. Klickst du auf „ja“ wird das Programm beendet (und damit auch
automatisch alle offenen Fenster geschlossen). Aber wir gehen den Code mal
Schrittweise durch, damit ihn alle verstehen. Also, als erstes öffnen wir ein Fenster
mittels OpenWindow().

Dieses bekommt die Nummer 0 (Dies ist aber jetzt ohne
Bedeutung, da wir ohnehin nur ein Fenster geöffnet haben). Dieses WÜRDE an der
Position 0,0, also links oben in der Ecke des Bildschirms angezeigt. Es hat eine
Ausdehnung von 300*200 Pixel. Die Parameter für dieses Fenster sind
#PB_WINDOW_ScreenCentered und #PB_WINDOW_SystemMenu.
#PB_WINDOW_ScreenCentered gibt an, dass das Fenster in der Mitte des
Bildschirms angezeigt wird. #PB_Window_SystemMenu gibt an, dass das Fenster ein
Systemmenü bekommt (Das Ding links oben in der Ecke).Als nächstes geben wir nur
noch als Titel „Hallo :-)“ an.

So, nun, da wir unser Fenster erstmal offen haben,
starten wir unsere EventLoop. Wir nehmen einfach mal eine Repeat-ForEver Schleife,
da das Programm ja nicht von alleine enden soll. In der Schleife wird zuerst der
Befehl WaitWindowEvent aufgerufen. Dieser Befehl WARTET(!!) bis ein Ereignis auf
irgend einem Fenster diesen Programmes auftritt. Ist dies der Fall gibt es das ausgelöste
Ereignis als Rückgabewert an das Programm zurück.

Wir speichern das Event einfach in die sinnvoll benannte Variable „Event“. Danach verarbeiten wir das
Ereignis in einem Select-Block. In diesem Fall ist das natürlich weniger sinnvoll, da
wir sowieso nur ein Event abfangen, nämlich das CloseEvent. Dies hat die
Bezeichnung #PB_EVENT_CloseWindow. Aber in größeren Programmen wollen wir ja
meist auf mehrere Ereignisse reagieren können, wobei sich der Select-Block anbietet,
zwecks der Übersichtlichkeit. Hier eine Liste aus der Hilfe mit den anderen
WindowEvents, die auftreten können. (Ich werde sie aber jetzt hier nicht alle
erläutern, alles nacheinander :-)

Code: Alles auswählen

#PB_Event_Menu ;ein Menü wurde ausgewählt
#PB_Event_Gadget ;ein Gadget wurde gedrückt
#PB_Event_CloseWindow ;das Schließgadget vom Fenster wurde gedrückt
#PB_Event_Repaint ;der Fensterinhalt wurde zerstört und muss neu gezeichnet
werden (nützlich für 2D Grafik-Operationen)
#PB_Event_MoveWindow ;das Fenster wurde verschoben
Statt dem WaitWindowEvent() kannst du auch einfach WindowEvent() verwenden.
An sich verrichtet dieser Befehl fast das gleiche, bloß dass er das Programm nicht
anhält, sondern einfach weitermacht, auch wenn kein Ereignis vorhanden ist. Du
musst dich dann selbst darum kümmern, dass dein Programm nicht zuviel CPULeistung
beansprucht. Ich denke der Rest von dem Code erklärt sich selbst und ist
eigentlich alter Stoff. Noch eine kleine Anmerkung: Wenn wir ein Fenster schließen
möchten verwenden wir im Normalfalle CloseWindow(). Dies ist aber in UNSEREM
Fall unnötig, da End auch sämtliche Fenster schließt, bevor das Programm dann
auch wirklich beendet wird. So, jetzt haben wir es geschafft, ein Fenster zu öffnen,
cool nicht?! Naja, gut, es ist vielleicht cool, aber bringen tut uns das auch noch
nichts… Also machen wir fröhlich weiter ;-) Kommen wir also zum nächsten
Abschnitt, den Gadgets.


Ps.: Ich habe hier den Abschnitt komplett kopiert (Kapitel Windows-Handling, Beschreibung und Beispiele)