Seite 1 von 1

Rückgabewert von EventWindow() prüfen?

Verfasst: 20.12.2014 10:55
von PeDre
Hallo,

bin neu hier.
Ich habe mir eine Lizenz für PureBasic gekauft, und arbeite mich gerade durch die englische Hilfedatei.
Mein Ziel ist es, ein Programm das ich mit Xojo geschrieben habe, mit PureBasic nachzuprogrammieren.

Ich verwende die aktuelle Version 5.31 und Windows 8.1, beides 32 Bit.
Bei dem Beispiel mit den Polygonen und mehreren Fenstern, gibt es einen Fehler.

Siehe:

Code: Alles auswählen

Reference Manual
  -> We start programming 
    -> User guide - Overview 
      -> Dynamic numbering of windows and gadgets using #PB_Any
Es wird bei der Event Loop (Zeile 196) ein #PB_Event_Repaint Ereignis empfangen.
Beim Start ist der empfangene Wert von "EventWindow = EventWindow()" -1.
Der Fehler tritt dann in der aufgerufenen Prozedur "PlotPolygon" auf.
Dort wird mit StrU(-1) der Wert in den Key "18446744073709551615" umgewandelt.
Da es keine Gadgets mit dem Key in der Map AciveWindows() gibt, stürtzt das Programm ab.

Das ist mir alles klar und logisch.
Jetzt frage ich mich, ob man die empfangenen Werte von den Event-Funktionen überprüfen muss.
Was wären plausible Werte? Und ohne vorzeichenlose Variablen scheint mir das schwierig zu sein.

Schönen Gruß
Peter

Re: Rückgabewert von EventWindow() prüfen?

Verfasst: 20.12.2014 17:20
von Bisonte
Dafür hat Fred die #PB_Event_ ... Konstanten eingeführt, damit man sich nicht massig Zahlen merken muss ;)

Im Ernst, wenn Du weiterhin die Hilfe durcharbeitest (Dein jetziger Fall wird bei Windows beschrieben), kommst Du
alleine darauf.

Übrigens ist die Hilfe auch auf Deutsch installierbar gewesen, falls es da Verständigungsprobleme geben sollte.

Aber um bei deinem Fall zu bleiben, wäre ein Fenster mit einer "Event" Schleife ungefähr so...

Code: Alles auswählen

;: Mal schnell ein Fenster gezimmert....
OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
;: noch ein "Button" drauf...
ButtonGadget(1, 20, 20, 200, 25, "Mein Button")

;: und nun die Abfragerei
Repeat
  
  Event = WaitWindowEvent(25) ; <- Hier das WindowEvent einer Variablen zugewiesen
  
  Select Event ; > <- Hier wird dann sozusagen "verzweigt"
      
    Case #PB_Event_CloseWindow ; Hier wird ein Fenster Schliess Button gedrückt
      Quit = 1 ; Hier um die Repeat Schleife zu verlassen....

    Case #PB_Event_Gadget ; Hier kam ein "Event" von einem Gadget
      
      If EventGadget() = 1 ; Wenn es unser Button war dann Text raus
        Debug "Mein Button wurde gedrückt"
      EndIf
      
  EndSelect
  
Until Quit > 0
Man fragt also nur ab, was man braucht. Alles andere wird programmiertechnisch "ignoriert".

Wenn man allerdings ein Gadget mit #PB_Any deklariert, muss man den Rückgabewert sichern, wenn
man dieses Gadget abfragen will.... und es können durchaus heftige Zahlen sein die dann rauskommen.

Ich meine sowas wie : BG = ButtonGadget(#PB_Any, 20, 20.....
und bei Eventgadget() wird dann nicht nach 1 gefragt sondern nach BG

also : If EventGadget() = BG ....

Re: Rückgabewert von EventWindow() prüfen?

Verfasst: 20.12.2014 18:24
von PeDre
Hallo Bisonte,

danke für den Hinweis auf die deutsche Hilfe, ich bleibe bei der englischen.

Meine Frage bezog sich auf die Prozedur "EventWindow()".
Warum wird eine Nummer zu einem Fenster zurückgegeben, das es nicht gibt?
Ist die Rückgabe von -1 ein Fehlercode? In der Hilfe habe ich nichts dazu gefunden.

Wenn ich mit "IsWindow(#)" die Nummer prüfe, ist die erste Nummer -1 (18446744073709551615) ungültig, erst die nachfolgenden sind gültig, z.B. 2097284.

Man darf sich anscheinend nicht auf die Gültigkeit der Fensternummer verlassen.
Möglicherweise gilt das dann auch für die anderen Event-Rückgabewerte.

Also wie du schreibst, die Nummer mit den gespeicherten vergleichen. Und eventuell mit "IsWindow()/IsGadget()" prüfen ob die Fenster noch vorhanden sind.

In dem Beispiel ist halt seltsam, dass man ein #PB_Event_Repaint-Ereignis erhält, aber eine ungültige Fensternummer mit "EventWindow()". Das habe ich nicht erwartet.

Dann werde ich mal weiterlernen.

Schönen Gruß
Peter

Re: Rückgabewert von EventWindow() prüfen?

Verfasst: 20.12.2014 19:11
von ts-soft
Beim erstem #PB_EventRepaint erhälste immer -1, da das Fenster erst erstellt wird und noch garnicht existiert!
Danach sollte es dann stimmen.

Gruß
Thomas

// edit
Besser ist es hierzu BindEvent zu nutzen, da Echtzeit. So gibts dann keine solche komischen Fensternummern:

Code: Alles auswählen

Procedure Event_Repaint()
  Debug EventWindow()
EndProcedure

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "")
ButtonGadget(0, 10, 10, 80, 30, "bla")

BindEvent(#PB_Event_Repaint, @Event_Repaint())

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver