Seite 1 von 1

[Erledigt] Sringfeld Eingabe von Zahlen festlegen

Verfasst: 26.02.2018 19:18
von udg
Ich habe ein Stringgadget welches Eingaben verwerten soll von, ab 10 bis 500

sollte man einen Wert kleiner 10 eingeben, soll die Eingabe von zb 5 verweigert und auf 10 aufgerundet und als 10 im StringGadget angezeigt werden. Selbiges soll gelten für eine Eingabe größer 500. Hier soll ein Wert von zb 600 abgerundet und auf 500 gesetzt und eingetragen werden.

Bräuchte einen Denkanstoß ;)

Dankeschön

EDIT:
Code angepasst

ein simples Beispiel:

Bild

Code: Alles auswählen

EnableExplicit

Enumeration
  #Wnd
EndEnumeration

Enumeration
  #Str
  #Txt_1
  #Txt_2
  #Fnt_SegoeUI18
  #Btn
EndEnumeration

  LoadFont(#Fnt_SegoeUI18, "Segoe Ui", 18, #PB_Font_HighQuality)

Define Event, EventWindow, EventGadget
Procedure String()
Protected String.s = GetGadgetText(EventGadget())
Protected Gadget = EventGadget() 

  If EventType() = #PB_EventType_LostFocus
    If Val(String) <= 10
      String = "10"
    ElseIf Val(String) >= 500
      String = "500"
    EndIf
    SetGadgetText(EventGadget(), String)
  EndIf
  If EventType() = #PB_EventType_Focus
    Select Gadget
      Case #Str
        If GetGadgetText(Gadget) = "0,00"
           SetGadgetText(Gadget, "")
           SetGadgetColor(Gadget, #PB_Gadget_FrontColor, RGB(65,110,182))
        EndIf
    EndSelect
  EndIf
 
EndProcedure
Procedure Main()
  OpenWindow(#Wnd, 685, 480, 272, 197, "",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_BorderLess)
   
      TextGadget(#Txt_1, 55, 45, 55, 20, "min: 10")
      TextGadget(#Txt_2, 170, 45, 45, 20, "max: 500")
     
      StringGadget(#Str, 55, 70, 160, 34, "0,00", #PB_String_BorderLess|#ES_CENTER|#PB_String_Numeric)
      SetGadgetColor(#Str, #PB_Gadget_FrontColor, RGB(65,110,182))
      SetGadgetFont(#Str, FontID(#Fnt_SegoeUI18))
      BindGadgetEvent(#Str, @String())
      ButtonGadget(#Btn, 86, 130, 100, 34, "Weiter")
EndProcedure

Main()

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Wnd
        CloseWindow(#Wnd)
        Break
      EndIf
  EndSelect
ForEver

Re: Sringfeld Eingabe festlegen

Verfasst: 26.02.2018 19:39
von ccode_new
Hallo udg,

es ist etwas knifflig.

Möchtest du ständig eine Aktualisierung abfragen oder muss erst z.B. eine Taste zur Bestätigung (Enter,...) gedrückt werden oder ist die Endbedingung ein Fokusverlust des String-Gadgets. (Das würde die Sache einfacher machen.)

Man könnte auch auf das Ende der Cursorposition prüfen und zusätzlich noch einen Timer einsetzen.
???

Re: Sringfeld Eingabe festlegen

Verfasst: 26.02.2018 20:26
von udg
Enter muss in meinem Programm nicht gedrückt werden. Lost Fokus wäre eine Idee aber so lang man eine zu hohe oder zu niedrige Zahl eingibt, besitzt das StringGadget ja noch den Fokus. Obwohl es nicht schlimm wäre, wenn der Wert sich dann bei lost Fokus anpasst.
Natürlich könnte man auch andere Auswahl Methoden verwenden aber ich möchte ein StringGadget haben. Es müsste irgendwie in Echtzeit, also während man im gadget tippt, überprüfen. Wäre am besten.
Es gibt ja Autovervollständigen. So in der Art der Echtzeit passt.

Oder sowas wie:

for input < 10 Set 10 und if input > 500 set 500 Next

Re: Sringfeld Eingabe festlegen

Verfasst: 26.02.2018 20:35
von TroaX
Dennkanstoß? Kein Thema ... SpinGadget ^^

Re: Sringfeld Eingabe festlegen

Verfasst: 26.02.2018 20:50
von ccode_new
@udg

Das hier würde funktionieren (ist aber eine absolute "Dreckslösung")

Code: Alles auswählen

;Ohne Timer-Schwipp und Schwapp
EnableExplicit

Enumeration
  #Wnd
EndEnumeration

Enumeration
  #Str
  #Txt_1
  #Txt_2
  #Fnt_SegoeUI18
EndEnumeration

LoadFont(#Fnt_SegoeUI18, "Segoe Ui", 18, #PB_Font_HighQuality)

Define Event, EventWindow, EventGadget

Global Counter

Procedure Main()
  OpenWindow(#Wnd, 685, 480, 272, 197, "",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_BorderLess)
  
  TextGadget(#Txt_1, 55, 45, 55, 20, "min: 10")
  TextGadget(#Txt_2, 170, 45, 45, 20, "max: 500")
  
  StringGadget(#Str, 55, 70, 160, 34, "000", #PB_String_BorderLess|#PB_String_Numeric)
  SetGadgetColor(#Str, #PB_Gadget_FrontColor, RGB(65,110,182))
  SetGadgetFont(#Str, FontID(#Fnt_SegoeUI18))
  
  Counter = ElapsedMilliseconds() ;Tipptoleranz
EndProcedure

Main()

Procedure SetzeCursor()
  SetActiveGadget(#Str)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      SendMessage_(GadgetID(#Str), #EM_SETSEL, $fffffff, $fffffff)
    CompilerCase #PB_OS_Linux
      gtk_editable_set_position_(GadgetID(#Str), -1)
  CompilerEndSelect
EndProcedure

Repeat
  Event = WaitWindowEvent()
  
  If Counter <= ElapsedMilliseconds() - 4000
    If GetGadgetText(#Str) <> "000" And ValD(GetGadgetText(#Str)) <> 0
      If ValD(GetGadgetText(#Str)) < 10
        SetGadgetText(#Str, "10")
        SetzeCursor()
        Counter = ElapsedMilliseconds()
      EndIf
    EndIf
  EndIf
  
  If ValD(GetGadgetText(#Str)) > 500
    SetGadgetText(#Str, "500")
    SetzeCursor()
  EndIf
  
  Select Event
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Wnd
        CloseWindow(#Wnd)
        Break
      EndIf
  EndSelect
ForEver
Anbei: Eine Stringfeld (aber nicht Gadget)-Lösung

Code: Alles auswählen

EnableExplicit

Global wert.s

Repeat
  wert = InputRequester("Werteingabe", "Bitte einen Wert zwischen 10 und 500 eingeben.", "000")
Until ValD(wert) <> 0 And ( ValD(wert) > 9 And ValD(wert) < 501 )

Re: Sringfeld Eingabe festlegen

Verfasst: 26.02.2018 21:07
von udg
TroaX hat geschrieben:Dennkanstoß? Kein Thema ... SpinGadget ^^
Oh danke :allright:

Ich hab doch geschrieben, dass ich weiß, es gibt andere Möglichkeiten, ABER EIN STRINGGADGET möchte ich nutzen und dafür bedarfs einen Denkanstoß, eine Idee, einen Weg ;)
Ich kann auch Checkboxen oder Radiobutton verwenden. Soll aber nicht.
Grüße

Re: Sringfeld Eingabe festlegen

Verfasst: 26.02.2018 21:12
von udg
ccode_new hat geschrieben:@udg

Das hier würde funktionieren (ist aber eine absolute "Dreckslösung")
Danke. Du sagst es und mit Timern jonglieren möchte ich nicht.

Ich werd dann mal Kaffee machen und eine Schicht einlegen bis das geht. Das StringGadget Gedöhns

Re: Sringfeld Eingabe festlegen

Verfasst: 26.02.2018 22:32
von hjbremer
Denkanstooooss

Code: Alles auswählen

EnableExplicit

Enumeration
   #mainwindow
   #strg1
   #strg2
EndEnumeration

#propname_mem = "propname_mem"
#propname_pbnr = "propname_pbnr"

Procedure.i StringgadgetEvent(hwnd, msg, wParam, lParam)
   
   Protected oldproc = GetProp_(hwnd, #propname_mem) 
   Protected pbnr = GetProp_(hwnd, #propname_pbnr) 
   
   Select msg 
      Case #WM_NCDESTROY: 
         RemoveProp_(hwnd, #propname_mem)
         RemoveProp_(hwnd, #propname_pbnr)
         
      Case #WM_SETFOCUS   
         SendMessage_(hwnd, #EM_SETSEL, 0, 1000)  
         
      Case #WM_KILLFOCUS        
         
         Protected t$ = GetGadgetText(pbnr)
         
         If Val(t$) < 10: SetGadgetText(pbnr, "10"): EndIf
         If Val(t$) > 500: SetGadgetText(pbnr, "500"): EndIf
                  
   EndSelect
   
   ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wParam, lParam)
EndProcedure

Define fontid = LoadFont(1, "Consolas", 12)   

Define oldproc, event

OpenWindow(#mainwindow, 0, 0, 680, 390, "Beispiel...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

StringGadget(#strg1, 20, 20, 250, 24, "", #ES_CENTER|#PB_String_Numeric) 
SetGadgetFont(#strg1, fontid)

oldproc = SetWindowLongPtr_(GadgetID(#strg1), #GWL_WNDPROC, @StringgadgetEvent())  
SetProp_(GadgetID(#strg1), #propname_mem, oldproc) 
SetProp_(GadgetID(#strg1), #propname_pbnr, #strg1) 

StringGadget(#strg2, 20, 60, 250, 24, "xxxxx") 
SetGadgetFont(#strg2, fontid)

SetActiveGadget(#strg1)

Repeat: Event = WaitWindowEvent()   
Until Event = #PB_Event_CloseWindow
PS: Echtzeit ist kaum möglich. z.B. Eingabe soll 50 sein.
1.Ziffer ist eine 5. Nach Eingabe der 5 würde in Echtzeit daraus eine 10 gemacht. Es wäre kaum möglich 50 einzugeben.
Möglich ist natürlich alles, aber der Aufwand steht in keinem Verhältnis, finde ich.

Re: Sringfeld Eingabe festlegen

Verfasst: 26.02.2018 22:38
von ccode_new
@hjbremer

Das wäre ja eine Lösung mit Endbedingung: Fokusverlust

:mrgreen:

Re: Sringfeld Eingabe festlegen

Verfasst: 27.02.2018 00:23
von udg
hjbremer hat geschrieben:Denkanstooooss

PS: Echtzeit ist kaum möglich. z.B. Eingabe soll 50 sein.
1.Ziffer ist eine 5. Nach Eingabe der 5 würde in Echtzeit daraus eine 10 gemacht. Es wäre kaum möglich 50 einzugeben.
Möglich ist natürlich alles, aber der Aufwand steht in keinem Verhältnis, finde ich.
Da hast Du natürlich vollkommen Recht. Soweit hatter nit gedacht :D


Danke an alle fleißgen Helferleins. Ich hab im Post 1 Den Code geändert.
LÄUFT