[Erledigt] Sringfeld Eingabe von Zahlen festlegen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

[Erledigt] Sringfeld Eingabe von Zahlen festlegen

Beitrag 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
Zuletzt geändert von udg am 27.02.2018 00:28, insgesamt 3-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Sringfeld Eingabe festlegen

Beitrag 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.
???
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Sringfeld Eingabe festlegen

Beitrag 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
Zuletzt geändert von udg am 27.02.2018 00:32, insgesamt 1-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
TroaX
Beiträge: 662
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Sringfeld Eingabe festlegen

Beitrag von TroaX »

Dennkanstoß? Kein Thema ... SpinGadget ^^
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Sringfeld Eingabe festlegen

Beitrag 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 )
Zuletzt geändert von ccode_new am 26.02.2018 22:32, insgesamt 2-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Sringfeld Eingabe festlegen

Beitrag 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
Zuletzt geändert von udg am 27.02.2018 02:10, insgesamt 1-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Sringfeld Eingabe festlegen

Beitrag 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
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Sringfeld Eingabe festlegen

Beitrag 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.
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
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Sringfeld Eingabe festlegen

Beitrag von ccode_new »

@hjbremer

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

:mrgreen:
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Sringfeld Eingabe festlegen

Beitrag 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
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Antworten