Seite 1 von 2

spingadget - stepping problem

Verfasst: 13.03.2010 00:43
von broozar
hallo allerseits,

habe ein spingadget, das sich meim click auf die arrows nicht um +-1, sonders um, in diesem falle, 5 ändern soll. erstmal der relevante code:

Code: Alles auswählen


[...]

SpinGadget(#s_host_time, 220, 210, 60, 20, 5, 55, #PB_Spin_Numeric | #PB_Spin_ReadOnly)
   SetGadgetText(#s_host_time, "20")
   SetGadgetState(#s_host_time, 20)

[...]

Repeat
[...]  
  Select WaitWindowEvent()
[...]
    Case #PB_Event_Gadget
      Select EventGadget()
      [...]          
        Case #s_host_time ; mein spinner-gadget
          Select EventType()
            Case 1 ; up arrow
              If Int(ValF(GetGadgetText(#s_host_time)))<55
                SetGadgetText(#s_host_time, Str(Int(ValF(GetGadgetText(#s_host_time))+ValF("4"))))
                EndIf
            Case -1 ; down arrow
              If Int(ValF(GetGadgetText(#s_host_time)))>5
                SetGadgetText(#s_host_time, Str(Int(ValF(GetGadgetText(#s_host_time))-ValF("4"))))
                EndIf
          EndSelect

      EndSelect
  EndSelect

[...]

problem 0: ich muss "4" angeben, statt 5, da er zu meinem event selbstständig seine +-1 hinzufügt. damit kann ich ja noch leben, aber wieso macht er das.
problem 1: sobald ich die arrows halte und das gadget "in seinen auto-hochzählmodus" springt, wird immer nur 1 addiert/subtrahiert. damit komme ich dann auf werte, die nicht mehr durch 5 teilbar sind, was ich ja doch vermeiden will. das könnte ich jetzt umgehen, indem ich vor dem schreiben ins feld prüfe, ob der wert durch 5 teilbar ist, mit wäre es aber lieber, wenn ich diesen auto-hochzähler abschalten könnte, denn..
problem 2: ...in diesem modus ist es möglich, unter meine grenze von 5 zu kommen - bis 2, um genau zu sein, dann springt er zurück auf 5. wie ist das möglich?

ps - wo wir grad dabei sind. Str(Int(ValF()+ValF())) is ja dann doch ein wenig massiv. gibt's da was kürzeres?

Re: spingadget - stepping problem

Verfasst: 13.03.2010 01:04
von ts-soft
Ein Testbarer Code wäre schon nett.
So sehe ich nicht viel und testen kann ich garnichts, es sei denn ich setze mich hin und
schreibe den Testcode für Dich /:->

Code: Alles auswählen

Repeat
[...] 
  Select WaitWindowEvent()
zwischen Repeat und Select WaitWindowEvent() gehört niemals code!

Gruß
Thomas

Re: spingadget - stepping problem

Verfasst: 13.03.2010 01:25
von hjbremer
du mußt alles selbst machen

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 140, 70, "SpinGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    min = 5
    max = 55
    wert = min
    SpinGadget     (0, 20, 20, 100, 25, min, max, #PB_Spin_ReadOnly)
    SetGadgetState (0, wert) : SetGadgetText(0, Str(wert))

    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        If EventGadget() = 0
                    
          If EventType() = 1
             wert + 5
             If wert > max: wert = max: EndIf
             
          ElseIf EventType() = -1
             wert - 5
             If wert < min: wert = min: EndIf

          EndIf
          
          SetGadgetState(0,wert)
          SetGadgetText(0, Str(wert))          
     
        EndIf
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


Re: spingadget - stepping problem

Verfasst: 13.03.2010 01:54
von broozar
@ts-soft:

Code: Alles auswählen

;- Window Constants
;
Enumeration
  #hostwin
EndEnumeration

;- Gadget Constants
;
Enumeration
  #s_host_time
EndEnumeration

Procedure Open_hostwin()
  If OpenWindow(#hostwin, 294, 20, 590, 290, "spinnertest breakdown",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered)
    SpinGadget(#s_host_time, 220, 210, 60, 30, 5, 55, #PB_Spin_Numeric | #PB_Spin_ReadOnly)
    SetGadgetText(#s_host_time, "20")
    SetGadgetState(#s_host_time, 20)

  EndIf
EndProcedure

Open_hostwin()

Global Quit = 0

Repeat
  
  Select WaitWindowEvent()

    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #hostwin
          Quit=1
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case #s_host_time ; mein spinner-gadget
          Select EventType()
            Case 1 ; up arrow
              If Int(ValF(GetGadgetText(#s_host_time)))<55
                SetGadgetText(#s_host_time, Str(Int(ValF(GetGadgetText(#s_host_time))+ValF("4"))))
                EndIf
            Case -1 ; down arrow
              If Int(ValF(GetGadgetText(#s_host_time)))>5
                SetGadgetText(#s_host_time, Str(Int(ValF(GetGadgetText(#s_host_time))-ValF("4"))))
                EndIf
          EndSelect

      EndSelect
  EndSelect

Until Quit = 1

End   ; Happy End!
und das musst du mal erläutern:
zwischen Repeat und Select WaitWindowEvent() gehört niemals code
der code, der daziwschen stand (den ich mittlerweile nicht mehr brauche, alles auskommentiert) war nicht von irgend einem window event abhängig, sondern fing ein paar signale aus einem anderen thread ab und warf ggf ne debug-meldung. lief eigentlich problemlos.

@brehmer - sieht doch ziemlich so aus wie das, was ich habe. treten bei dir die fehler nicht auf?

ps - habe interessehalber das mal auf mac kompiliert, da gab's ganz seltsame resultate.

Re: spingadget - stepping problem

Verfasst: 13.03.2010 02:01
von Kaeru Gaman
broozar@web.de hat geschrieben:@brehmer - sieht doch ziemlich so aus wie das, was ich habe.
nein. sieht völlig anders aus. ist auch was völlig anderes.
broozar@web.de hat geschrieben:treten bei dir die fehler nicht auf?
sein code ist lauffähig. hast du mal getestet?

Re: spingadget - stepping problem

Verfasst: 13.03.2010 02:19
von ts-soft
broozar@web.de hat geschrieben: und das musst du mal erläutern:
zwischen Repeat und Select WaitWindowEvent() gehört niemals code
der code, der daziwschen stand (den ich mittlerweile nicht mehr brauche, alles auskommentiert) war nicht von irgend einem window event abhängig, sondern fing ein paar signale aus einem anderen thread ab und warf ggf ne debug-meldung. lief eigentlich problemlos
Wenn Du nach jedem Event einen Code ohne Event ausführst, das passiert, wenn zwischen Schleifenanfang
und WaitWindowEvent(), bzw. nach Eventbearbeitung und vor Until/ForEver, Code steht, dann werden
Deine Events auflaufen und ein vernünftiges reagieren des Fensters ist nicht mehr gegeben.

Gruß
Thomas

<offtopic>
An die Spielregel, die dem User aufgezwungen wird, das, er nicht mehr löschen darf, wenn weitere User
gepostet haben, sollte sich auch ein Moderator halten, auch wenn er andere Möglichkeiten hat.
Die Möglichkeiten sind im Sinne der Allgemeinheit zu nutzen, nicht zum Eigennutzen
</offtopic>

Re: spingadget - stepping problem

Verfasst: 13.03.2010 02:31
von broozar
ja, ist lauffähig, habe getestet. bleibt die frage, wieso meiner nicht einwandfrei läuft ("sieht doch ziemlich so aus wie...").

was mir an brehmers code nicht gefällt, ist, dass keine rückkopplung mit dem ist-wert des spinners erfolgt, sondern "blind" eine zahl gesetzt wird. das ist zB aufm mac nicht toll, wenn man mit seinem code mal von einem arrow auf den anderen wechselt, springt der wert lustig durch die gegend.

wieso treten bei brehmers code das "+1"- und das halten-und-hochzählen-problem nicht auf? er fängt das event ja nicht grundlegend anders ab als ich (select-case und if-sowieso sollten ja nur verschiedene schreibweisen sein...)? ich will ja was lernen, also erklärt's mir bitte.

Re: spingadget - stepping problem

Verfasst: 13.03.2010 02:36
von a14xerus
du hast das "getgadgetstate" mit drin, er nicht ;)

Re: spingadget - stepping problem

Verfasst: 13.03.2010 03:08
von Kaeru Gaman
@ts
das war kein Eigennutz. mein Posting war überflüssig, zumal hj ein funktionierenden Beispiel gepostet hatte.

Re: spingadget - stepping problem

Verfasst: 13.03.2010 03:13
von ts-soft
Kaeru Gaman hat geschrieben:@ts
das war kein Eigennutz. mein Posting war überflüssig, zumal hj ein funktionierenden Beispiel gepostet hatte.
Meins ist später auch oft überflüssig, das ändert also gar nichts an dem was ich gesagt habe.
Wollte auch nur freundlich drauf hinweisen :wink: