Seite 1 von 1

Procedure wird in der Eventschleife zwei mal aufgerufen

Verfasst: 14.01.2013 11:22
von dysti
Hallo,
sitze schon stundenlang und kann den Fehler nicht einkreisen.
Folgendes Problem:
Die Procedure Auswahl() wird zweimal aufgerufen, wenn man "1 Banane" auswählt.
Wird innerhalb der Procedure Auswahl() das SetGadgetText aktiviert, dann werden die "Mengen" nicht mehr angezeigt.

Warum werden die "Mengen nicht angezeigt?

Warum wird die Procedure Auswahl() zweimal aufgerufen?

Code: Alles auswählen

Enumeration
  #window_0
EndEnumeration

Enumeration
  #enter_Taste
  #Auswahl1
  #Auswahl2
  #Auswahl3
  #Auswahl4
  #Auswahl5
  #Ueberschrift
  #Mask
  #Maske
  #Text1
  #Obst1
  #Obst2
  #Obst3
  #Obst4
  #Menge1
  #Menge2
  #Menge3
  #Menge1a
  #Menge1b
  #Menge1c
EndEnumeration

Procedure aufbau()
  
  StringGadget(#Auswahl1,-50,50,50,50,"")
  StringGadget(#Auswahl2,-50,50,50,50,"",#PB_String_UpperCase)
  StringGadget(#Auswahl3,-50,50,50,50,"")
  StringGadget(#Auswahl4,-50,50,50,50,"")
  StringGadget(#Auswahl5,-50,50,50,50,"")
  
  
  TextGadget(#Obst1,25,180,300,40,"Was möchten Sie haben?")
  TextGadget(#Obst2,400,180,450,40,"1 - Banane")
  TextGadget(#Obst3,400,220,450,40,"2 - Apfel")
  TextGadget(#Obst4,400,260,450,40,"3 - Birnen")
  TextGadget(#Menge1,25,320,600,40,"Wählen Sie die Menge aus")
  
  TextGadget(#Menge1a,400,320,200,40,"A - 1 kg")
  TextGadget(#Menge1b,400,355,300,40,"B - 5 kg")
  TextGadget(#Menge1c,400,390,150,40,"C - 50 kg")


  HideGadget(#Auswahl2,1)
  HideGadget(#Auswahl3,1)
  HideGadget(#Auswahl4,1)
  HideGadget(#Auswahl5,1)
  HideGadget(#Menge1,1)
  
  HideGadget(#Menge1a,1)
  HideGadget(#Menge1b,1)
  HideGadget(#Menge1c,1)
  
  SetActiveGadget(#Auswahl1)
EndProcedure


Procedure Auswahl()
  Debug "Aufruf der Procedure Auswahl()"
  
  HideGadget(#Auswahl1,1)
  HideGadget(#Auswahl2,0)
  HideGadget(#Menge1,0)
  HideGadget(#Menge1a,0)
  HideGadget(#Menge1b,0)
  HideGadget(#Menge1c,0)
 
  ;SetGadgetText(#Auswahl1,"") verhindert den zweimaligen Aufruf, aber dann werden die Gadgets nicht angezeigt??????
  
  SetActiveGadget(#Auswahl2)
EndProcedure

;- Start

If OpenWindow(#Window_0, 0, 0, 1060, 535,"Test")
  Aufbau()
EndIf

;- Anfang Schleife
Repeat 
  Select WaitWindowEvent()
      
    Case #PB_Event_CloseWindow
      CloseWindow(#window_0): Break
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Auswahl1 ; Gadget Auswahl hat den Fokus erhalten
          
          If GetGadgetText(#Auswahl1)="1"
                Debug "1 ausgewählt"
                auswahl()
          ElseIf GetGadgetText(#Auswahl1)="2"
                Debug "2 ausgewählt"
          ElseIf GetGadgetText(#Auswahl1)="3"
                Debug "3 ausgewählt"
              Else ; was passiert, wenn ein Wert eingegeben wird, der nicht verarbeitet wird?
                ;Debug "Falsche Auswahl, die gibt es nicht!"
            SetGadgetText(#Auswahl1,"")
            SetActiveGadget(#Auswahl1) 
          EndIf ; If-Schleife - Ende
      
        Case #Auswahl2
          If GetGadgetText(#Auswahl2)="A"
            Debug "Auswahl 2"
           
          Else
            SetGadgetText(#Auswahl2,"")
            SetActiveGadget(#Auswahl2) 
          EndIf
      EndSelect ; Ende Select Eventgadget()
  EndSelect ; Ende WaitWindowEvent()
ForEver


Re: Procedure wird in der Eventschleife zwei mal aufgerufen

Verfasst: 14.01.2013 11:57
von ts-soft
Äusserst merkwürdiger GUI Aufbau :mrgreen:
Du legst den Focus auf versteckte StringGadgets, ist das so sinnvoll?
Ich wäre als Anwender irgendwie abgeschreckt von Deiner GUI.

Okay, wenn es denn so sein soll, dann nutze doch besser KeyBoardshortcuts,
das sollte dann etwas genauer und unabhängig vom Focus funktionieren.

Gruß
Thomas

Re: Procedure wird in der Eventschleife zwei mal aufgerufen

Verfasst: 14.01.2013 12:00
von Kurzer
Hallo Disty,

soweit ich das sehe fragst Du gar nicht ab welche Art von event das Stringgadget auslöst.
Da kommen unter Umständen mehr als ein Event.

Wenn Du hinter Debug "1 ausgewählt" noch ein Debug Hex(EventType()) schreibst, siehst Du, dass zwei unterschiedliche Eventtypen kommen.

$300 und $36B1.

Von der $300 weiß ich, dass es der PB Konstante #PB_EventType_Change entspricht - wird also gesendet, wenn das Gadget seinen Inhalt geändert hat.
Du solltest also auf jeden Fall noch den EventType() mit auswerten und nur auf den richtigen Typen reagieren.

PS: Ja, wie ts-soft schon angemerkt hat. Sehr eigewillige herangehensweise was den Aufbau und den Ablauf der GUI Eingaben angeht. So ein linearer Abfrageablauf wäre eher was für eine Consoleanwendung, nicht für eine Anwendung mit grafischer GUI.

Re: Procedure wird in der Eventschleife zwei mal aufgerufen

Verfasst: 14.01.2013 13:29
von dysti
Habe den Code bekommen und möchte trotz des Aufbaus wissen, warum PB so reagiert.
Einfacher wäre es, den Code neu zu schreiben. Aber darum geht es aus pädagogischen Gründen nicht.
Wie heißt es in der einen Sendung immer: Warum, Wieso, Weshalb

Warum wird die Procedure zweimal aufgerufen?
Wieso werden die Gadgets nicht angezeigt?
Weshalb reagiert das Programm so?

Re: Procedure wird in der Eventschleife zwei mal aufgerufen

Verfasst: 14.01.2013 13:42
von NicTheQuick
dysti hat geschrieben:Warum wird die Procedure zweimal aufgerufen?
Siehe Antwort von Kurzer.
dysti hat geschrieben:Wieso werden die Gadgets nicht angezeigt?
Weil da jede Menge 'HideGadget()'s drin sind?
dysti hat geschrieben:Weshalb reagiert das Programm so?
Weil man nicht mit versteckten Gadgets arbeitet, die Eingaben abfangen sollen. Dazu fängt man die Tastatureingaben entweder direkt per WindowCallback ab oder nutzt Shortcuts wie es ts-soft vorgeschlagen hat.

Das ist einfach unsaubere Programmierung, bei der man nicht genau vorher sagen kann, was wie und warum passiert. Mein Linux reagiert auch anders. Da kommen sogar regelmäßig, ohne dass ich was tue, Events rein und führen somit deine "Auswahl()"-Procedure aus.

Re: Procedure wird in der Eventschleife zwei mal aufgerufen

Verfasst: 14.01.2013 14:51
von dysti
Danke für die Antworten