Seite 1 von 1

Kurzfristige Änderungen eines SpinGG übergehen

Verfasst: 10.06.2006 16:59
von dibro
Hallöchen,
ich hab schon wieder ein Problemchen.
Ich hab ein Prog in dem man mit einem SpinGG verschiedene Werte einstellen kann. Einige davon sind unzulässig. Dann soll der MsGReq erscheinen. soweit alles klar. Aber wenn der Anwender schnell über die unzulässigen Werte hinweg"Spint", soll nichts passieren, damit man nicht dauernd ok klicken muss.

Ich hab das Prob mal in ein Beispiel vereinfachtes Beispiel gefasst.
Hab auch schon mal was mit 'nem Thread versucht, hat aber nicht geklappt.

Code: Alles auswählen

;
Procedure Test() 

a = Val(GetGadgetText(5))
b = Val(GetGadgetText(6))
c = GetGadgetState(1)
b = a/c
d = b * c
SetGadgetText(7,Str(d))
If d <> a
  MessageRequester("", "ungeeignete Kombination")
EndIf
EndProcedure

 
  
If OpenWindow(0, 60, 30, 60,200,"")
  If CreateGadgetList(WindowID(0))
    TextGadget  (0, 5,  10, 25,20,"c= ")
    SpinGadget  (1, 40, 10, 25,20,1,50,#PB_Spin_Numeric)
    TextGadget  (2, 5,  80, 25,20,"a=")
    TextGadget  (3, 5,  110,25,20,"b=")
    TextGadget  (4, 5,  140,25,20,"Res.")
    StringGadget(5, 40, 80, 35,20,"50")
    StringGadget(6, 40, 110,35,20,"5")
    StringGadget(7, 40, 140,35,20,"50")
    SetGadgetState(1,1)
  EndIf 

EndIf    
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select  EventGadget()
        Case 1
          Test()
      EndSelect
    EndIf
  Until   EventID = #PB_Event_CloseWindow
End 
Wer kann mir da helfen?

Verfasst: 10.06.2006 17:13
von Jilocasin
Zugegeben ich kapier nicht ganz was du willst.
Kannst du das bitte nochmal genau erklären? :D

Re: Kurzfristige Änderungen eines SpinGG übergehen

Verfasst: 10.06.2006 17:14
von Kiffi

Code: Alles auswählen

MessageRequester("", "ungeeignete Kombination")
ich würde aus Gründen der Anwenderfreundlichkeit keinen
MessageRequester aufploppen lassen, sondern unter dem SpinGadget ein
kleines TextGadget in roter Farbe positionieren, das dann sichtbar wird, wenn
eine ungeeignete Kombination ausgewählt wurde. Zusätzlich würde ich dann
einen evtl. vorhandenen OK- oder Übernehmen-Button disablen.

Grüße ... Kiffi

Verfasst: 10.06.2006 17:45
von Kaeru Gaman
grundsätzlich hat kiffi da recht, kein MSG-req wenn nicht unbedingt nötig.

zusätzlich könntest du das einstellen von ungültigen werten generell verhindern,
wenn du ein Array anlegst, das die gültigen werte enthält, und nur durch diese spinnen lässt.
natürlich müsstest du dann im falle einer tastatureingabe den nächsten möglichen gültigen wert ermitteln und anzeigen,
damit wärst du aber besser, als die werteeingabe im standard-color-requester von MS,
wo du die anweichenden werte bei direkteingabe von farbe/intensität/helligkeit erst bei erneutem aufruf angezeigt bekommst...

Verfasst: 10.06.2006 17:54
von dibro
Der Vorschlag von Kiffi wäre eine Lösung.
Allerdings hatte ich mir zunächst was mit 'nem Thread vorgestellt, in dem ein Timer läuft und der MsGReq erst nach dieser Zeit erscheint, wenn der Spin auf der Stellung stehen geblieben ist.
Das mit einem Array mit vordefiniereten Werten lässt sich nicht verwenden, da da noch ein paar andere Größen mitspielen, ist etwas komplexer als das Beispiel. Werde wohl die Lösung mit dem Warntext machen, der beim Überspinnen ja dann wieder verschwindet.
Danke. :allright:

Verfasst: 11.06.2006 01:18
von PureLust
Hallo dibro,

also das mit dem eigene Thread nur für den Timer ist ein bischen wie mit Kanonen auf Spatzen zu schießen.

So eine Timergeschichte lässt sich auch einfach so lösen:

Code: Alles auswählen

Global OutOfRange, DelayTimer

Procedure Test() 

a = Val(GetGadgetText(5)) 
b = Val(GetGadgetText(6)) 
c = GetGadgetState(1) 
b = a/c 
d = b * c 
SetGadgetText(7,Str(d)) 
If d <> a 
	If Not OutOfRange : DelayTimer = ElapsedMilliseconds()+1000 : EndIf
	OutOfRange = 1
Else
	OutOfRange = 0
EndIf 
EndProcedure 

  
  
If OpenWindow(0, 60, 30, 60,200,"") 
  If CreateGadgetList(WindowID(0)) 
    TextGadget  (0, 5,  10, 25,20,"c= ") 
    SpinGadget  (1, 40, 10, 25,20,1,50,#PB_Spin_Numeric) 
    TextGadget  (2, 5,  80, 25,20,"a=") 
    TextGadget  (3, 5,  110,25,20,"b=") 
    TextGadget  (4, 5,  140,25,20,"Res.") 
    StringGadget(5, 40, 80, 35,20,"50") 
    StringGadget(6, 40, 110,35,20,"5") 
    StringGadget(7, 40, 140,35,20,"50") 
    SetGadgetState(1,1) 
  EndIf 

EndIf    
  Repeat 
    EventID = WindowEvent() 
    If EventID = #PB_Event_Gadget 
      Select  EventGadget() 
        Case 1 
          Test() 
      EndSelect 
    EndIf
    If OutOfRange And ElapsedMilliseconds() > DelayTimer
		 MessageRequester("", "ungeeignete Kombination")
		 OutOfRange = 0
    EndIf
    Delay(10)
  Until   EventID = #PB_Event_CloseWindow 
End 
Generell würde ich aber auch zu der Lösung von Kiffi tendieren, da der User hierdurch eine direktere, unterbrechungsfreie und dadurch auch intuitivere Rückmeldung bekommt.

Grüße, PL.

Verfasst: 12.06.2006 10:13
von dibro
Danke PureLust
Ich hab in der Zwischenzeit die Lösung von Kiffi auch schon implementiert.
Bin ich als Anfänger nicht von alleine drauf gekommen. Man denkt ja manchmal zu kompliziert um die Ecke.
Deinen Vorschlag habe ich mir direkt mal kopiert. man weiß ja nie, wann man so etwas braucht. :allright: