Seite 1 von 1

Event_Gadget reagiert erst nach 100mal klicken?!

Verfasst: 08.06.2006 20:57
von cofter
Hi, ich möchte eine kleines Login erstellen.
Wenn der Knopf Login gedrückt wird sollen die Daten in den Stringgadget überprüft werden aber es reagiert irgendwie erst nach wildem geklicke auf den Buttons. :freak:

Ich hoffe jemand von euch sieht den Fehler.

Code: Alles auswählen


;
Enumeration
  #Login
EndEnumeration

;
Enumeration
  #Login
  #password
  #LoginText
  #PasswordText
  #Login_button
  #Exit_button
EndEnumeration

Declare Open_Login()

;- Init
;
If InitNetwork()
  Global ConnectionID = OpenNetworkConnection("192.168.0.6",7000)  
  If ConnectionID
    Open_Login()
  Else
    MessageRequester("Error","Konnte nicht zum Server verbinden!")
    End
  EndIf
Else
  MessageRequester("Error","Netzwerk konnte nicht initialisiert werden")
  End
EndIf

;- Procedure 
;
Procedure ReceiveFromServer()
 *Buffer = AllocateMemory(3072)

  
EndProcedure

Procedure Send2Server()



EndProcedure

Procedure Open_Login()
  If OpenWindow(#Login, 318, 354, 364, 160, "Solania v0.1",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Login))
      StringGadget(#Login, 80, 20, 260, 20, "")
      StringGadget(#password, 80, 80, 260, 20, "")
      TextGadget(#LoginText, 20, 20, 50, 20, "Username")
      TextGadget(#PasswordText, 20, 80, 50, 20, "Password")
      ButtonGadget(#Login_button, 100, 120, 80, 20, "Login")
      ButtonGadget(#Exit_button, 190, 120, 80, 20, "Exit")
    EndIf
  EndIf
EndProcedure

  Procedure Window_Event()
 
    If WindowEvent()
      Select WindowEvent()
        Case #PB_Event_CloseWindow
         FreeMemory(*Buffer)
         End
        Case #PB_Event_Gadget
          MessageRequester("lolo","knopf!")
                 
      EndSelect
    Else
      Delay(1)
    EndIf
  
  EndProcedure

Repeat
Window_Event()

Delay(1)
ForEver
mfg
Cofter

Verfasst: 08.06.2006 21:11
von Green Snake
Du darfst WindowEvent nicht mehrmals abfragen:

Code: Alles auswählen

Procedure Window_Event() 
  Protected EventID.l
  
  EventID = WindowEvent() 
  If EventID
    Select EventID
      Case #PB_Event_CloseWindow 
        FreeMemory(*Buffer) 
        End 
      Case #PB_Event_Gadget 
        MessageRequester("lolo","knopf!") 
        
    EndSelect 
  Else 
    Delay(1) 
  EndIf 
  
EndProcedure 

Verfasst: 08.06.2006 21:12
von PBZecke
Habe den code etwas verändert, da Dein Eventhandling unbrauchbar war!

Code: Alles auswählen


;
Enumeration
  #Login
EndEnumeration

;
Enumeration
  #Login
  #password
  #LoginText
  #PasswordText
  #Login_button
  #Exit_button
EndEnumeration

Declare Open_Login()

;- Init
;
If InitNetwork()
  Global ConnectionID = OpenNetworkConnection("192.168.0.6",7000) 
  If ConnectionID
    Open_Login()
  Else
    MessageRequester("Error","Konnte nicht zum Server verbinden!")
    End
  EndIf
Else
  MessageRequester("Error","Netzwerk konnte nicht initialisiert werden")
  End
EndIf

;- Procedure
;
Procedure ReceiveFromServer()
 *Buffer = AllocateMemory(3072)

 
EndProcedure

Procedure Send2Server()



EndProcedure

Procedure Open_Login()
  If OpenWindow(#Login, 318, 354, 364, 160, "Solania v0.1",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Login))
      StringGadget(#Login, 80, 20, 260, 20, "")
      StringGadget(#password, 80, 80, 260, 20, "")
      TextGadget(#LoginText, 20, 20, 50, 20, "Username")
      TextGadget(#PasswordText, 20, 80, 50, 20, "Password")
      ButtonGadget(#Login_button, 100, 120, 80, 20, "Login")
      ButtonGadget(#Exit_button, 190, 120, 80, 20, "Exit")
    EndIf
  EndIf
EndProcedure




Repeat

    event = WaitWindowEvent()
      Select event
        Case #PB_Event_CloseWindow
         FreeMemory(*Buffer)
         End
        Case #PB_Event_Gadget
          MessageRequester("lolo","knopf!")
                 
      EndSelect



ForEver

Verfasst: 08.06.2006 21:17
von cofter
Danke an euch beide.
Habe die Methode von Green Snake genommen da ich möglichst wenig Code in der Hauptschleife haben möchte.

mfg
Cofter

Verfasst: 08.06.2006 21:23
von a14xerus
PBZecke's code is auch nicht länger, er hat nru den gesammten code geschickt, aber wenn du mit green snakes' code besser klar kommst, ist es ja ok.. ich wollt es nur mal erwähnen
*gg*

Verfasst: 08.06.2006 21:25
von PBZecke
Du solltest jedoch WaitWindowEvent() statt WindowEvent() benutzen.
WindowEvent() in Verbindung mit Delay() ist nur sinnvoll, wenn Du in der
Hauptschleife noch andere Dinge erledigen möchtest, während Du auf ein
Fensterereignis wartest.

Verfasst: 08.06.2006 21:44
von cofter
Ja möchte ich in der Tat. :)
Es kommt noch ein Button "Optionen" und ein Webgadget hinzu.

mfg
Cofter

Verfasst: 09.06.2006 08:50
von ts-soft
cofter hat geschrieben:Ja möchte ich in der Tat. :)
Es kommt noch ein Button "Optionen" und ein Webgadget hinzu.

mfg
Cofter
Trotzdem WaitWindowEvent() und nicht WindowEvent(). Ansonsten reagiert
die Ereignisbehandlung nicht immer korrekt und die CPU wird belastet.

Verfasst: 09.06.2006 08:57
von Kaeru Gaman
WindowEvent() + Delay() brauchst du wirklich nur, wenn du in der hauptschleife etwas anderes machen willst, was unabhängig von eventhandling permanent laufen soll, wie z.b. ne play-schleife bei nem game in nem WindowedScreen().
und auch dann rate ich ausdrücklich zu einem Delay(0), damit keine events verschluckt werden. in PB4 hast du außerdem die möglichkeit, einen verzögerungswert bei WaitWindowEvent() anzugeben.

solange alle deine aktionen durch events und callbacks gesteuert werden, nimm WaitWindowEvent().

Verfasst: 09.06.2006 10:15
von cofter
Ok danke für die ausführlichen Erklärungen hatte einen kleinen Denkfehler. :oops:
In diesem Window reagiere ich tatsächlich nur auf Events.
Wenn der Login erfolgreich war soll mir der Server ein OK + SpielerID schicken und das Spiel wird gestartet wo erst weitere Daten abgefragt werden.

mfg
Cofter