Form Event Verhalten ist seltsam

Anfängerfragen zum Programmieren mit PureBasic.
fvogler
Beiträge: 12
Registriert: 12.06.2013 15:00

Form Event Verhalten ist seltsam

Beitrag von fvogler »

Guten Morgen Community,

habe gestern ein wenig mit Events gespielt - sowie dynamisch eine neue Oberfläche per Button Click definiert.

Ich habe einfach alles gelöscht mit FreeGadget - dann einen Button den es schon gab mit Copy und Paste neu angelegt. Nur feuert er mir hier dann ein falsches Event -nämlich Hello World anstelle das Close Event.


Kommentiere ich dies noch ein:

Code: Alles auswählen

Procedure Free_Gadget_Event(EventType)
 
  FreeGadget(#PB_All)
  
  ;Textfeld = TextGadget(#PB_Any, 0, 0, 204, 112, "Warte bis Close Button erscheint")
  ;SetGadgetColor(Textfeld, #PB_Gadget_BackColor,RGB(64,128,128))

Funktioniert alles wie erwartet. Weiß hier jemand den Grund?

Form:

Code: Alles auswählen

Global MainForm

Global Button_Hello, Button_Close, Textfeld, Button_Free_Gadget

Declare Hello_Ereignis(EventType)
Declare Close_Ereignis(EventType)
Declare Free_Gadget_Event(EventType)

Procedure OpenMainForm()
  MainForm = OpenWindow(#PB_Any, 0, 0, 200, 140, "Regel Generator", #PB_Window_SystemMenu)
  Button_Hello = ButtonGadget(#PB_Any, 0, 112, 100, 25, "Hello")
  Button_Close = ButtonGadget(#PB_Any, 101, 112, 100, 25, "Close")
  Textfeld = TextGadget(#PB_Any, -4, 0, 204, 112, "Dies ist ein Event Test")
  SetGadgetColor(Textfeld, #PB_Gadget_BackColor,RGB(64,128,128))
  Button_Free_Gadget = ButtonGadget(#PB_Any, 42, 49, 100, 25, "FreeGagdet()")
EndProcedure

Procedure MainForm_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case Button_Hello
          Hello_Ereignis(EventType())          
        Case Button_Close
          Close_Ereignis(EventType())          
        Case Button_Free_Gadget
          Free_Gadget_Event(EventType())          
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure



Code:

Code: Alles auswählen


IncludeFile("Form.pbf")

Global CloseVar.l
CloseVar = -1
  
OpenMainForm()






; Die übliche Haupt-Ereignisschleife, die einzige Änderung ist der automatische Aufruf der
; für jedes Fenster generierten Ereignis-Prozedur.
  Repeat
    
    If CloseVar <> 1
    
      event = WaitWindowEvent()
      MainForm_Events(event)
         
    EndIf
    
  Until Event = #PB_Event_CloseWindow  Or CloseVar = 1; Beenden, wenn eines der Fenster geschlossen wird.
  
  
  
  
  
  
  ; --------------------------------------------
  ;-------------Ereignissprozeduren-------------
  ;---------------------------------------------
Procedure Free_Gadget_Event(EventType)
 
  FreeGadget(#PB_All)
  
  ;Textfeld = TextGadget(#PB_Any, 0, 0, 204, 112, "Warte bis Close Button erscheint")
  ;SetGadgetColor(Textfeld, #PB_Gadget_BackColor,RGB(64,128,128))
  
  
  Delay(3000)
  Button_Close = ButtonGadget(#PB_Any , 101, 112, 100, 25, "Close")
  ;SetGadgetText(Textfeld,"Button Da!")
  
  
EndProcedure

Procedure Hello_Ereignis(EventType)
  MessageRequester("Hello", "Hello World!!")
EndProcedure

Procedure Close_Ereignis(EventType)
 
  ;SetGadgetText(Textfeld,"Bla Bla")
  CloseVar = 1
  
EndProcedure
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Form Event Verhalten ist seltsam

Beitrag von Kiffi »

schau Dir mal die Variablenwerte an. Dann wirst Du wahrscheinlich selber drauf kommen ;-)

Code: Alles auswählen

Procedure Free_Gadget_Event(EventType)
 
  FreeGadget(#PB_All)
  
  ;Textfeld = TextGadget(#PB_Any, 0, 0, 204, 112, "Warte bis Close Button erscheint")
  ;SetGadgetColor(Textfeld, #PB_Gadget_BackColor,RGB(64,128,128))
  
  Delay(3000)
  
  Debug "Vorher"
  Debug "Button_Hello: " + Str(Button_Hello)
  Debug "Button_Close: " + Str(Button_Close)
  
  Button_Close = ButtonGadget(#PB_Any , 101, 112, 100, 25, "Close")
  
  Debug ""
  
  Debug "Nachher"
  Debug "Button_Hello: " + Str(Button_Hello)
  Debug "Button_Close: " + Str(Button_Close)

  ;SetGadgetText(Textfeld,"Button Da!")
  
EndProcedure
Grüße ... Kiffi
a²+b²=mc²
fvogler
Beiträge: 12
Registriert: 12.06.2013 15:00

Re: Form Event Verhalten ist seltsam

Beitrag von fvogler »

das habe ich auch schon gemacht. aber im case wird ja die event nummer abgefragt. da kommt dann doch die neue an. der button ist global und bekommt daher ja auch die neue also sollte doch alles passen. und warum funkt es, wenn ich das textfeld einkommentiere. bekomme ich da etwa keine neuen nummern für textfeld und button?

mit handy gesendet. liebe grüsse
Ich ruder zurrück - habe nur einen Button gedebuged :-) Mit beiden ist nun alles klar - d.h. aber dass PBAny mit Vorsicht zu genießen ist. Es werden in einem Programmablauf Nummern mehrfach vergeben.

In dem Fall muß ich die Nummernvergabe also selber managen.

Vielen Dank
fvogler
Beiträge: 12
Registriert: 12.06.2013 15:00

Re: Form Event Verhalten ist seltsam

Beitrag von fvogler »

Das Thema ist noch nicht beendet:

Delay(3000)
Button_Close = ButtonGadget(9999 , 101, 112, 100, 25, "Close")

Und der Button_Click reagiert überhaupt nicht mehr.

1. Button_Close bekommt nicht die Nummer 9999
2. Es wird kein Event gefeuert.

Code: Alles auswählen

Select EventGadget()
        Case Button_Hello
          Hello_Ereignis(EventType())          
        Case Button_Close
          Close_Ereignis(EventType())          
        Case Button_Free_Gadget
          Free_Gadget_Event(EventType())          
      EndSelect

Wenn ich richtig verstehe gibt EventGadget() den Inhalt von Button_Close zurück und geht dann in die Case Struktur. Da müsste doch in jedem Fall wenn die Werte Distinct sind eine Rückgabe über die Prozedur bekommen.

Verpufft hier das Event irgendwo - weil dem Objekt nicht bekannt ist welchen Event Handler er nutzen soll? Muss man den Button irgendwie noch registrieren beim Event Handler? Bin hier echt überfragt - denn im Code habe ich noch nix gesehen bzw. überlesen.

Vielleicht wisst Ihr ja weiter

Gruß
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Form Event Verhalten ist seltsam

Beitrag von NicTheQuick »

Wenn du

Code: Alles auswählen

Button_Close = ButtonGadget(9999 , 101, 112, 100, 25, "Close")
schreibst, dann sagt dir der Inhalt von 'Button_Close' nur, ob der Button erfolgreich erstellt wurde. Die ID des Buttons, die auch von 'EventGadget()' zurück gegeben wird, ist 9999 und muss somit als 'Case'-Fall auch so angegeben werden.

Wenn du

Code: Alles auswählen

Button_Close = ButtonGadget(#PB_Any , 101, 112, 100, 25, "Close")
schreibst, dann sagt dir der Wert von 'Button_Close' einerseits, ob der Button erfolgreich erstellt und andererseits stellt er die neue ID dar, die der neu erstellte Button bekommen hat. Das heißt in dem Fall musst du in deinen 'Case'-Fall tatsächlich 'Button_Close' schreiben.

Mach dir bitte nochmal den Unterschied zwischen dynamischen IDs und statischen IDs klar. Die einen werden zur Laufzeit deines Programms erstellt und dafür braucht man dann '#PB_Any' und die anderen schreibt man fest hin, wie z.B. deine 9999 da oben.
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: Form Event Verhalten ist seltsam

Beitrag von ts-soft »

Okay, erstes Problem:
Nach FreeGadget hast Du Button_Hello nicht zurückgesetzt, so das der alte Wert erhalten war,
somit 2 Case Schritte dieselben Wert haben, somit der erste ausgeführt wird.

Ansonsten würde ich Dir empfehlen, zumindest in der Anfangszeit, deinen EventLoop selber zu schreiben und
nicht Generieren zu lassen:

Code: Alles auswählen

Global MainForm

Global Button_Hello, Button_Close, Textfeld, Button_Free_Gadget

Procedure OpenMainForm()
  MainForm = OpenWindow(#PB_Any, 0, 0, 200, 140, "Regel Generator", #PB_Window_SystemMenu)
  Button_Hello = ButtonGadget(#PB_Any, 0, 112, 100, 25, "Hello")
  Button_Close = ButtonGadget(#PB_Any, 101, 112, 100, 25, "Close")
  Textfeld = TextGadget(#PB_Any, -4, 0, 204, 112, "Dies ist ein Event Test")
  SetGadgetColor(Textfeld, #PB_Gadget_BackColor,RGB(64,128,128))
  Button_Free_Gadget = ButtonGadget(#PB_Any, 42, 49, 100, 25, "FreeGagdet()")
EndProcedure

Procedure Free_Gadget_Event()
 
  FreeGadget(#PB_All)
  Button_Hello = -1
  Button_Free_Gadget = -1
  Button_Close = ButtonGadget(#PB_Any , 101, 112, 100, 25, "Close")
 
EndProcedure

Procedure Hello_Ereignis()
  MessageRequester("Hello", "Hello World!!")
EndProcedure

Procedure Close_Ereignis()
 
  End
 
EndProcedure
 
OpenMainForm()

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    
    Case #PB_Event_Gadget
      Select EventGadget()
        Case Button_Hello
          Select EventType()
            Case #PB_EventType_LeftClick
              Hello_Ereignis()
          EndSelect
          
        Case Button_Close
          Close_Ereignis()
          
        Case Button_Free_Gadget
          Free_Gadget_Event()
      EndSelect
  EndSelect
ForEver
Zu dem letztem Posting, siehe hier: http://www.purebasic.com/german/documen ... jects.html

Ich hoffe ich habe nicht allzuviel doppelt von dem was NicTheQuick gerade geposted hat, das muß ich nämlich erst noch lesen :mrgreen:

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
fvogler
Beiträge: 12
Registriert: 12.06.2013 15:00

Re: Form Event Verhalten ist seltsam

Beitrag von fvogler »

Danke Vielmals - mein Denkfehler war, dass nur bei PBAny auch die wirkliche ID zurückgegeben wird.

So Klappt es:

Code: Alles auswählen

Delay(3000)
  Button_Hello=-1
  Button_Close=-1
  Textfeld = -1
  Button_Free_Gadget = -1
  Button_Close = ButtonGadget(#PB_Any, 101, 112, 100, 25, "Close")
Und so auch:

Code: Alles auswählen

  Delay(3000)
  ButtonGadget(9999, 101, 112, 100, 25, "Close")
  Button_Close = 9999
PureBasic ist gar nicht sehr schwer - wenn man es mal checkt :-)
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: Form Event Verhalten ist seltsam

Beitrag von ts-soft »

Okay, aber ein Delay(...) hat in einem EventLoop eher nichts zu suchen!
Und statische IDs beginnen bei 0 je Object. Die Verwendung von 9999 erzeugt
10000 Speicherreservierungen in der Gadgetlist, für nicht vorhandene Gadgets.
Am besten immer Enumerationen mit Konstanten nutzen für diesen Zweck.
Je eine Enumeration je Objekt Type. Der FormDesigner ist zur Zeit leider noch
nicht in der Lage, dies zu berücksichtigen (wird aber bald kommen :wink: ),
was einer der Gründe für mich ist, diesen zur Zeit noch nicht zu verwenden.

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
fvogler
Beiträge: 12
Registriert: 12.06.2013 15:00

Re: Form Event Verhalten ist seltsam

Beitrag von fvogler »

Hallo TS-Soft

Danke für den Tip mit den ID's - Ich schau mir mal die Hilfe dazu an. Ich wusste nicht dass dann auch so viele leere Listenelemete erstellt werden.

Das Delay - ist für mich eh nur ein Test - sowas wird nie Produktiv gehen. Ich versuche einfach ein wenig in der Sprache warm zu werden.

Liebe Grüße und Danke für die echt schnellen Antworten hier
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: Form Event Verhalten ist seltsam

Beitrag von ts-soft »

Da Du anscheinend bisher mehr mit EventHandlern ala Delphi gearbeitet hast, kann ich Dir noch diese
Include empfehlen: http://www.purebasic.fr/german/viewtopi ... 14#p309814

Zumindest zum überbrücken, bis PB das nativ zur Verfügung stellt <)
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