Seite 1 von 2

Form Event Verhalten ist seltsam

Verfasst: 13.06.2013 11:03
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

Re: Form Event Verhalten ist seltsam

Verfasst: 13.06.2013 11:50
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

Re: Form Event Verhalten ist seltsam

Verfasst: 13.06.2013 13:08
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

Re: Form Event Verhalten ist seltsam

Verfasst: 13.06.2013 13:48
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ß

Re: Form Event Verhalten ist seltsam

Verfasst: 13.06.2013 13:55
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.

Re: Form Event Verhalten ist seltsam

Verfasst: 13.06.2013 14:07
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

Re: Form Event Verhalten ist seltsam

Verfasst: 13.06.2013 15:04
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 :-)

Re: Form Event Verhalten ist seltsam

Verfasst: 13.06.2013 15:21
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

Re: Form Event Verhalten ist seltsam

Verfasst: 13.06.2013 15:43
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

Re: Form Event Verhalten ist seltsam

Verfasst: 13.06.2013 16:07
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 <)