Seite 2 von 2

Verfasst: 09.10.2005 15:47
von NicTheQuick
Nein, das geht nicht.

Re: Allerdings schade ...

Verfasst: 09.10.2005 16:09
von Danilo
hiltwin hat geschrieben:... meine erste Frage hat leider keiner beantwortet - ist es irgendwie möglich, dass man
EventGadgetID() so manipulieren, dass es entweder keinen Wert zurückgibt, oder einen vorgegebenen wie z.B. 15397 oder #Button_Start?
Möglich ist so ziemlich alles, aber es ist nicht nötig. Kiffi hat Dir
bereits gesagt was Du falsch machst. Wenn Du eine ordentliche
Nachrichtenbehandlung schreibst, dann hast Du dieses Problem
mit den dauernd kommenden Nachrichten garnicht erst.
AND51 hat geschrieben:

Code: Alles auswählen

Repeat
If GetGadgetState(6629) = 1 And EventGadgetID() = 6629
     text$=InputRequester("input","Bitte Text eingeben","default wert")
EndIf
;
; weiterer Code
;
Delay(Random(2))
Until WindowEvent() = #PB_Event_CloseWindow
Wie Kiffi schon sagte, hier fehlt der Check ob (Wait)WindowEvent
auch #PB_Event_Gadget zurückgibt.
Nur wenn die Nachricht #PB_Event_Gadget von (Wait)WindowEvent
zurückgegeben wird machst Du mit Deinem Check weiter.

ne lösung für mein problem habe ich aber noch nicht ...

Verfasst: 09.10.2005 18:31
von hiltwin
...

ich möchte mit einem button bei einem countdown mit dem ersten klick den countdown starten, mit dem zweiten klick den countdown stoppen und mit dem dritten klick den countdown resetten ...
(ist allerdings ein anderer fall als der allererste, den ich gepostet hatte)

kriege ich einfach nicht hin - würde ich hinbekommen, wenn ich EventGadgetID() so setzen kann, dass es nicht die letzte Aktion gespeichert behält

Verfasst: 10.10.2005 18:25
von Batze
Das ist doch kein Problem. :wink:

Code: Alles auswählen

Procedure EventGadget_ID(Merken.b)
  Static GID
  if Merken or EventGadgetID() <> GID
    GID = EventGadgetID()
  else
    GID = -1
  endif
  ProcedureReturn GID
EndProcedure
ungetestet
Benutzt du halt die Funktion, auch wenn es unnötig ist, wie es schon andere erklärt haben.

Counter

Verfasst: 10.10.2005 21:10
von PureLust
Hi hiltwin, ...

anbei mal ein Code der evtl. das macht was Du vorhattest. ;)

Code: Alles auswählen

AktCountdownStatus=1
Counter=1000000
If OpenWindow(0,0,0,120,60,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Countdown") And CreateGadgetList(WindowID(0))
   AddKeyboardShortcut(0,#PB_Shortcut_Escape,27)
   If TextGadget(1,5,8,WindowWidth()-10,20,Str(Counter),#PB_Text_Center)
       If ButtonGadget(2,20,30,WindowWidth()-40,22,"Start")
           ActivateGadget(2)
           Repeat
              Delay(10)
              If AktCountdownStatus=2
                 Counter - 1
                 SetGadgetText(1,Str(Counter))
              EndIf
              Event = WindowEvent()
              If Event=#PB_Event_Gadget
                 If EventGadgetID()=2
                    AktCountdownStatus + 1
                    If AktCountdownStatus=2
                       SetGadgetText(2,"Stop")
                    ElseIf AktCountdownStatus = 3
                       SetGadgetText(2,"Reset")
                    Else
                       AktCountdownStatus = 1
                       SetGadgetText(2,"Start")
                       Counter=1000000                 
                       SetGadgetText(1,Str(Counter))
                    EndIf
                 EndIf
              EndIf             
           Until Event=#PB_Event_CloseWindow Or (Event=#PB_Event_Menu And EventMenuID()=27)
       EndIf
   EndIf
CloseWindow(0)
EndIf
End
Gruß, PL.

Verfasst: 11.10.2005 15:18
von NicTheQuick
So finde ich es schöner und vor allem genauer:

Code: Alles auswählen

If OpenWindow(0,0,0,120,60,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Countdown") = 0 : End : EndIf
If CreateGadgetList(WindowID(0)) = 0 : End : EndIf

AddKeyboardShortcut(0, #PB_Shortcut_Escape, 27)

TextGadget(1, 5, 8, WindowWidth() - 10, 20, Str(Counter), #PB_Text_Center)
ButtonGadget(2, 20, 30, WindowWidth() - 40, 22, "Start")
ActivateGadget(2)

AktCountdownStatus.l = 1
Counter.l = 0
CountDelay.l = 10

Repeat
  If AktCountdownStatus = 2
    While ElapsedMilliseconds() > AktDelay
      Counter + 1
      AktDelay + CountDelay
    Wend
    SetGadgetText(1, Str(Counter))
  EndIf
  
  EventID.l = WindowEvent()
  Select EventID
    Case #PB_Event_Gadget
      If EventGadgetID() = 2
        AktCountdownStatus + 1
        If AktCountdownStatus = 2
          AktDelay = ElapsedMilliseconds() + CountDelay
          SetGadgetText(2, "Stop")
        ElseIf AktCountdownStatus = 3
          SetGadgetText(2, "Reset")
        Else
          AktCountdownStatus = 1
          SetGadgetText(2,"Start")
          
          Counter = 0
          SetGadgetText(1, Str(Counter))
        EndIf
      EndIf
    
    Case 0
      Delay(1)
  EndSelect
Until EventID = #PB_Event_CloseWindow Or (EventID = #PB_Event_Menu And EventMenuID() = 27)

CloseWindow(0)

Verfasst: 11.10.2005 18:30
von PureLust
NicTheQuick hat geschrieben:So finde ich es schöner und vor allem genauer:
Nunja, auf Genauigkeit war's ja auch nicht programmiert - war ja nur'n Beispiel für 3 Funktionen bei ein und demselben einem Button. ;)

Und ausserdem isses nun ja kein CountDOWN mehr, sondern ein CountUP !!! :mrgreen:

Verfasst: 11.10.2005 18:51
von nco2k
ich würde den zähler in einen thread packen, dann kann man WaitWindowEvent() für das fenster verwenden.

c ya,
nco2k

Verfasst: 11.10.2005 22:15
von NicTheQuick
nco2k hat geschrieben:ich würde den zähler in einen thread packen, dann kann man WaitWindowEvent() für das fenster verwenden.

c ya,
nco2k
Das wäre eine Möglichkeit, aber so ist das ganze auch mehr
als ausreichend. Man beachte hierbei das [c]Delay(1)[/c] hinter dem [c]Case 0[/c],
was sehr wichtig bei dieser Sache ist

Perfekt!!!

Verfasst: 11.10.2005 22:50
von hiltwin
Vielen Dank Euch allen bei der Lösung meines Problems!

@PL:
In der Art hab ich es umgesetzt, klasse.

@NTQ:
Hast Du meine Festplatte gescannt? Der Teil ist bei mir nämlich tatsächlich nen "CountUp" ich hatte nur den Beispielcode als Countdown geschrieben ;o)
Das mit dem Delay/Case 0 - prima Idee!
@nc02k:
Als Anfänger hab ich mit Threads noch nie was gemacht, von daher ist der Hinweis nur eine Anregung, mit der ich mich aber vermutlich wenn erst ab Release 2.0 beschäftige, da derzeit noch genug anderes zu coden ist ;o)

ciao
hiltwin