Procedure wird in der Eventschleife zwei mal aufgerufen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Procedure wird in der Eventschleife zwei mal aufgerufen

Beitrag 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

PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
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: Procedure wird in der Eventschleife zwei mal aufgerufen

Beitrag 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
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
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Procedure wird in der Eventschleife zwei mal aufgerufen

Beitrag 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.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Procedure wird in der Eventschleife zwei mal aufgerufen

Beitrag 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?
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
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: Procedure wird in der Eventschleife zwei mal aufgerufen

Beitrag 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.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Procedure wird in der Eventschleife zwei mal aufgerufen

Beitrag von dysti »

Danke für die Antworten
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Antworten