spingadget - stepping problem

Anfängerfragen zum Programmieren mit PureBasic.
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

spingadget - stepping problem

Beitrag 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?
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
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: spingadget - stepping problem

Beitrag 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
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: spingadget - stepping problem

Beitrag 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

Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: spingadget - stepping problem

Beitrag 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.
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: spingadget - stepping problem

Beitrag 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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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: spingadget - stepping problem

Beitrag 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>
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: spingadget - stepping problem

Beitrag 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.
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Re: spingadget - stepping problem

Beitrag von a14xerus »

du hast das "getgadgetstate" mit drin, er nicht ;)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: spingadget - stepping problem

Beitrag von Kaeru Gaman »

@ts
das war kein Eigennutz. mein Posting war überflüssig, zumal hj ein funktionierenden Beispiel gepostet hatte.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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: spingadget - stepping problem

Beitrag 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:
Antworten