Window erstellen in Purebasic funktioniert nicht

Anfängerfragen zum Programmieren mit PureBasic.
01-andreas
Beiträge: 34
Registriert: 06.12.2010 15:02
Computerausstattung: Betriebssystem: Windows 7 x64
2,6 x 4 GHz
4 GB RAM
Ati Radeon HD 5830
Wohnort: Kiel

Window erstellen in Purebasic funktioniert nicht

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Window erstellen in Purebasic funktioniert nicht

Beitrag von ts-soft »

Vertausch mal den Fenstertitel und die Flags!

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: Window erstellen in Purebasic funktioniert nicht

Beitrag 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.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
01-andreas
Beiträge: 34
Registriert: 06.12.2010 15:02
Computerausstattung: Betriebssystem: Windows 7 x64
2,6 x 4 GHz
4 GB RAM
Ati Radeon HD 5830
Wohnort: Kiel

Re: Window erstellen in Purebasic funktioniert nicht

Beitrag 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?
Sirius-2337
Beiträge: 71
Registriert: 29.05.2010 20:55

Re: Window erstellen in Purebasic funktioniert nicht

Beitrag 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.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: Window erstellen in Purebasic funktioniert nicht

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Window erstellen in Purebasic funktioniert nicht

Beitrag 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
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
01-andreas
Beiträge: 34
Registriert: 06.12.2010 15:02
Computerausstattung: Betriebssystem: Windows 7 x64
2,6 x 4 GHz
4 GB RAM
Ati Radeon HD 5830
Wohnort: Kiel

Re: Window erstellen in Purebasic funktioniert nicht

Beitrag 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:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Window erstellen in Purebasic funktioniert nicht

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
01-andreas
Beiträge: 34
Registriert: 06.12.2010 15:02
Computerausstattung: Betriebssystem: Windows 7 x64
2,6 x 4 GHz
4 GB RAM
Ati Radeon HD 5830
Wohnort: Kiel

Re: Window erstellen in Purebasic funktioniert nicht

Beitrag 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)
Antworten