Event_Gadget reagiert erst nach 100mal klicken?!

Anfängerfragen zum Programmieren mit PureBasic.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Event_Gadget reagiert erst nach 100mal klicken?!

Beitrag 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
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag 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 
-.-"
Benutzeravatar
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Beitrag 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
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag 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
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag 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*
Benutzeravatar
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Beitrag 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.
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Ja möchte ich in der Tat. :)
Es kommt noch ein Button "Optionen" und ein Webgadget hinzu.

mfg
Cofter
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
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

Beitrag 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.
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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().
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag 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
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Antworten