Setgadgettext Aktualisierung

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Setgadgettext Aktualisierung

Beitrag von Elektrolurch »

Hi All

Ich versuche in meinem Program bei einem Buttondruck eine Schleife hochzählen zu lassen.
Bei jedem Durchlauf soll in ein Stringadget eine Ausgabe erfolgen.
Leider wird nur der letzte Wert angezeigt.
Das hängt wohl mit der Abarbeitung von Events zusammen.
Wie kann man das lösen ?
Das Program zeigt nur "gerade" am Ende an

z.B

Code: Alles auswählen

  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Test1
      ElseIf EventGadget = #SucheButton
       For I = 1 To 10
                If I = 1 Or I = 3 Or I = 5 Or I= 7 Or I = 9
                   SetGadgetText(#AusgabeString,"ungerade")
                Else
                   SetGadgetText(#AusgabeString,"gerade")
                EndIf
                Gosub Pause  ; Unterprogramm wo das Program per Delay eine Sekunde wartet-
        Next
        
      ElseIf EventGadget = #TestButton
      ElseIf EventGadget = #StopButton
      ElseIf EventGadget = #ENDButton
      End
      ElseIf EventGadget = #AusgabeString
      EndIf
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
Bye Andre
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Füge doch in deine, per Gosub angesprungene Routine ein

Code: Alles auswählen

While WindowEvent() : Wend


ein.

Das sollte es sein. Jede Gadgetaktualisierung ist im Grunde ja ein Event,
das auch abgearbeitet werden will...

Wenn man eine Schleife hat, in der Automatisch (ohne das der Anwender etwas macht)
etwas ablaufen soll benutze ich statt WaitWindwowEvent() nur WindowEvent() mit Delay(1) wegen CPU Auslastung ....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Beitrag von Elektrolurch »

Hi Bisonte

Klappt Astrein

Danke Andre
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Bisonte hat geschrieben:Füge doch in deine, per Gosub angesprungene Routine ein

Code: Alles auswählen

While WindowEvent() : Wend


ein.
Damit werden aber 10 Sekunden lang (10 Schleifendurchläufe mit je 1 Sekunde
Verzögerung) jegliche Nachrichten verschluckt. Das Schliessen des Fensters,
was hier in der Hauptschleife abgefragt wird, wird somit einfach ignoriert.

Leider hat es sich hier im Forum eingebürgert 'While WindowEvent() : Wend'
als Hammermethode für alles zu verwenden, dabei ist das nur ein Workaround
für spezielle Situationen.

Im obigen Falle wäre das nur schlechte Programmierung. Besser wäre
das wohl mit einem TimerEvent (Boardsuche). Timer starten wenn Button
gedrückt wurde, und nach 10 mal Timer beenden. Um Überlagerungen
zu vermeiden, am besten den Button in der Zwischenzeit disablen.

Oder man macht eine Prozedure in der trotzdem #PB_Event_CloseWindow
mit WindowEvent() überprüft wird, statt nur While .. Wend ohne Überprüfungen drin.
Auf jeden Fall sollte man einige Nachrichten während dieser 10 Sekunden
trotzdem weiterhin prüfen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

völlig richtig.

eine in sich geschlossene Schleife innerhalb der Hauptschleife einzusetzen ist etwas,
was dem Grundgedanken der Event-Steuerung komplett zuwider läuft.

man kann ohne Schwierigkeit innerhalb der Hauptschleife einen Zeitcheck einbaun,
besonders seit dem es WaitWindowEvent(Timeout) gibt.

While WindowEvent() : Wend
ist kein Hänger-Vermeider, sondern ein Eventfresser,
und sollte auch nur ausdrücklich als solcher eingesetzt werden.
mir fällt kaum eine andere Anwendung ein,
als ein versteckter Fensteraufbau mit vielen Gadgets.


@ElektroLurch

wenn dein Code lauffähig wäre, hätte ich dir ja jetzt ne einfache ElapsedMilliseconds()-Lösung reingebastelt...

PS:
hab mal was zurechtgeschraubt, mangels Fenster aber nicht getestet.

Code: Alles auswählen

Event = WaitWindowEvent(50)

; ...

      ElseIf EventGadget = #SucheButton
        If SucheLaeuft = 0
          SucheLaeuft = 1
          Zaehler = 0
          SucheTimer = ElapsedMilliseconds() + 1000
        EndIf

; ...

If SucheLaeuft = 1 And Event = 0
  If SucheTimer > ElapsedMilliseconds()
    SucheTimer + 1000
    Zaehler +1
    If Zaehler > 10
      SucheLaeuft = 0
      SetGadgetText(#AusgabeString,"#")
    Else
      If Zaehler % 2 > 0
         SetGadgetText(#AusgabeString,"ungerade")
      Else
         SetGadgetText(#AusgabeString,"gerade")
      EndIf
    EndIf
  EndIf
EndIf
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten