Seite 1 von 2

Was ist hier falsch am SpinGadget

Verfasst: 08.11.2006 15:39
von dibro
Hi,
@all
Warum funktioniert das nicht?
Der Zähler läuft auch, wenn ich nur mit dem Cursor über das Fenster gehe.

Code: Alles auswählen

Enumeration
#Spin1
#Text1
EndEnumeration


Procedure Count() 
  Static zaehler
  a = GetGadgetState(#Spin1)*10
  zaehler +1
  SetGadgetText(#Text1,Str(a)+" Zähler = "+Str(zaehler))
EndProcedure

 
  
If OpenWindow(0, 60, 30, 80,100,"")
  CallDebugger
  If CreateGadgetList(WindowID(0))
    SpinGadget(#Spin1,20,10,50,25,75,150,#PB_Spin_Numeric|#PB_Spin_ReadOnly)
    SetGadgetState(#Spin1,100)
    TextGadget(#Text1,10,50,90,30,"")
    CloseGadgetList()
  EndIf 
  Repeat
      Select EventGadget() 
        Case #Spin1
          Count()
      EndSelect
    Until   WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End 
Wer hilft mir weiter?

Verfasst: 08.11.2006 15:49
von AND51
Du hast vergessen, WindowEvent*( ab zufragen.
Du benoetigst Yeilen, die ich mit *** markiert habe, die du aber nicht bei dir eingebaut hast.

Code: Alles auswählen

Enumeration 
#Spin1 
#Text1 
EndEnumeration 


Procedure Count() 
  Static zaehler 
  a = GetGadgetState(#Spin1)*10 
  zaehler +1 
  SetGadgetText(#Text1,Str(a)+" Zähler = "+Str(zaehler)) 
EndProcedure 

  
  
If OpenWindow(0, 60, 30, 80,100,"") 
  CallDebugger 
  If CreateGadgetList(WindowID(0)) 
    SpinGadget(#Spin1,20,10,50,25,75,150,#PB_Spin_Numeric|#PB_Spin_ReadOnly) 
    SetGadgetState(#Spin1,100) 
    TextGadget(#Text1,10,50,90,30,"") 
    CloseGadgetList() 
  EndIf 
  Repeat 
    Select WaitWindowEvent()*******
      Case #PB_Event_CloseWindow *******
          Break******
      Case #PB_Event_Gadget*******
      Select EventGadget() 
        Case #Spin1 
          Count() 
      EndSelect 
    ForEver *******
EndIf 
End 

Verfasst: 08.11.2006 16:10
von dibro
Danke,
erstens verstehe ich nicht warum und zweitens
meckert der Compiler
in Zeile 34 another end condition is expected here
Da weiß ich auch nicht weiter.

Verfasst: 08.11.2006 16:12
von AND51
Tschuldige, habe ein EndSelect vor ForEver vergessen, bitte einfügen! :oops:

Verfasst: 08.11.2006 16:40
von dibro
danke, :allright:
das hätte ich auch selber finden müssen :evil:

Aber jetzt das eigentliche Problem, weshalb ich den Schnipsel gebaut habe:
Der Zähler läuft bei jedem Klick 2 x weiter.
Warum?
In einem Programm habe ich eine Schleife mit einer linked List (>6000 Werte), die jedesmal abgefragt wird, wenn das Spingadget verändert wird um neue Werte zu berechnen.
Und die wird immer 2 x durchlaufen und das dauert.... :cry:
Ich hoffe Du kannst mir auch hier helfen

Verfasst: 08.11.2006 16:46
von #NULL
>> erstens verstehe ich nicht warum..

weil der rückgabewert von EventGadget() vom letzten aufruf von [Wait]WindowEvent() abhängt, also dort aktualisiert wird. ohne [Wait]WindowEvent() ist er nutzlos. (ebenso auch EventType() ect.)

Verfasst: 08.11.2006 17:10
von tobe
hi dibro,

der doppelte aufruf entsteht, weil bei einem mausklick mehrere events ausgelöst werden.

Code: Alles auswählen

Enumeration
  #Spin1
  #Text1
EndEnumeration

Procedure Count()
  Static zaehler
  a = GetGadgetState(#Spin1)*10
  zaehler +1
  SetGadgetText(#Text1,Str(a)+" Zähler = "+Str(zaehler))
EndProcedure

If OpenWindow(0, 60, 30, 80,100,"")
  If CreateGadgetList(WindowID(0))
    SpinGadget(#Spin1,20,10,50,25,75,150,#PB_Spin_Numeric|#PB_Spin_ReadOnly)
    SetGadgetState(#Spin1,100)
    TextGadget(#Text1,10,50,90,30,"")
  EndIf
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #Spin1
            Select EventType()
              Case #PB_EventType_Change
                Count()
            EndSelect
        EndSelect
    EndSelect
  ForEver
EndIf
End

Verfasst: 08.11.2006 17:36
von dibro
Das wars :allright:

Das muss man aber erst mal wissen, besonders wenn man "by doing" lernt.

Danke allen, ihr habt mir wohl stundenlanges Suchen erspart. :bluescreen:

Tolles Forum, echt gute Hilfe !

Verfasst: 15.11.2006 21:15
von dibro
Hi,
da bin ich nochmal.
Jetzt habe ich das gleiche Problem mit dem Trackbargadget.
Nach einem EventGadget() läuft der Zähler 2 x weiter und auf EventType() reagiert das Teil nicht.
Was kann man da machen ?

/Edit
Hier mein Code

Code: Alles auswählen

Enumeration
  #Trackbar1
  #Text1 
EndEnumeration

Procedure Count()
  Static zaehler
  a = GetGadgetState(#Trackbar1)
  zaehler +1
  SetGadgetText(#Text1,Str(a)+" Zähler = "+Str(zaehler))
EndProcedure

If OpenWindow(0, 60, 30, 80,100,"")
  If CreateGadgetList(WindowID(0))
    TrackBarGadget(#Trackbar1,20,10,100,20,0,100)
    TextGadget    (#Text1,    10,50,90,30,"0")
  EndIf
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget
        If  EventGadget()= #Trackbar1
          If EventType() = #PB_EventType_LeftClick
            Count()
          EndIf
        EndIf
    EndSelect
  ForEver
EndIf
End
Der Zähler läuft jeweils um 1 weiter, wenn ich klicke und wenn ich loslasse. Er soll aber nur einmal weiter laufen.
Es ist auch egal, ob ich die EventType() - Abfrage einbaue oder nicht.
Zur Erklärung: es geht nur ums Prinzip, mit den Tics mache ich was, aber das ist eine lange Schleife und die soll nicht 2 x durchlaufen werden.

Verfasst: 16.11.2006 13:26
von #NULL
ich verstehe nicht ganz.
falls du count nur bei der änderung eines wertes aufrufen willst.. geht so:

Code: Alles auswählen

      Case #PB_Event_Gadget
        If  EventGadget()= #Trackbar1
          If EventType() = #PB_EventType_LeftClick
            If val <> GetGadgetState(#Trackbar1)
              Count()
              val = GetGadgetState(#Trackbar1)
            EndIf
          EndIf
        EndIf