Seite 1 von 1

Setgadgettext Aktualisierung

Verfasst: 30.06.2008 12:53
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

Verfasst: 30.06.2008 13:10
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 ....

Verfasst: 30.06.2008 13:34
von Elektrolurch
Hi Bisonte

Klappt Astrein

Danke Andre

Verfasst: 30.06.2008 20:50
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.

Verfasst: 01.07.2008 14:11
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