Rückgabewert von EventWindow() prüfen?

Anfängerfragen zum Programmieren mit PureBasic.
PeDre
Beiträge: 13
Registriert: 19.12.2014 11:22
Wohnort: Wien

Rückgabewert von EventWindow() prüfen?

Beitrag 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
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

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

Beitrag 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 ....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
PeDre
Beiträge: 13
Registriert: 19.12.2014 11:22
Wohnort: Wien

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

Beitrag 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
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: Rückgabewert von EventWindow() prüfen?

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