Was ist hier falsch am SpinGadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Was ist hier falsch am SpinGadget

Beitrag 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?
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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 
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Beitrag 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.
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Tschuldige, habe ein EndSelect vor ForEver vergessen, bitte einfügen! :oops:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Beitrag 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
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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.)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag 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
PureBasic 4.40 (Windows - x86)
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Beitrag 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 !
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
dibro
Beiträge: 143
Registriert: 11.03.2006 12:52
Computerausstattung: Win 10 64 bit
Wohnort: Solingen

Beitrag 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.
Gruß aus Solingen, PB 6.0 Win 10 Pro
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten