Mit StringGadget Kommazahl einlesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Mit StringGadget Kommazahl einlesen

Beitrag von marcelx »

Hallo,

ich möchte mit StringGadget Kommazahl einlesen.
Im CodeArchiv/Gadgets/StringGadget/ habe ich StringGadget_Numeric.pb gefunden.
Gibt es so was für Kommazahlen (einlesen von z.B. 0,99 oder 123 oder 123,9) ?

Danke und Gruß
MarceX
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Mit StringGadget Kommazahl einlesen

Beitrag von RSBasic »

Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mit StringGadget Kommazahl einlesen

Beitrag von ts-soft »

Der Code im CodeArchiv hat eher nichts mit Deiner Frage zu tun, jedenfalls sehe ich da den Zusammenhang nicht.

Hier ein Beispiel (Windows-Only), das nur die Zahlen, sowie das Komma akzeptieren.
Achtung: Das Komma wird auch mehrfach akzeptiert. Wenn das nicht gewünscht ist, sind noch
Erweiterungen notwendig.

Code: Alles auswählen

EnableExplicit

Procedure cbStringGadget(hWnd, uMsg, wParam, lParam)
  Protected oldproc = GetProp_(hWnd, "oldproc")
 
  Select uMsg
    Case #WM_NCDESTROY
      RemoveProp_(hWnd, "oldproc")
    Case #WM_CHAR
      Select wParam
        Case 48 To 57, 44 ; 0 - 9, komma
        Default
          ProcedureReturn 0 ; kein gültiges Zeichen
      EndSelect
  EndSelect
  
  ProcedureReturn CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
EndProcedure

Procedure SubClassStringGadget(ID)
  Protected oldproc = SetWindowLongPtr_(GadgetID(ID), #GWL_WNDPROC, @cbStringGadget())
  ProcedureReturn SetProp_(GadgetID(ID), "oldproc", oldproc)
EndProcedure

OpenWindow(0, #PB_Ignore, #PB_Ignore, 250, 80, "")
StringGadget(0, 10, 10, 200, 20, "")
SubClassStringGadget(0)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Mit StringGadget Kommazahl einlesen

Beitrag von marcelx »

Danke RSBasic und ts-soft

damit kann ich schon was anfangen
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mit StringGadget Kommazahl einlesen

Beitrag von ts-soft »

Hab mal so erweitert, das Backspace funktioniert und das Komma nur einmal eingegeben werden kann:

Code: Alles auswählen

EnableExplicit

Procedure cbStringGadget(hWnd, uMsg, wParam, lParam)
  Protected oldproc = GetProp_(hWnd, "oldproc")
 
  Select uMsg
    Case #WM_NCDESTROY
      RemoveProp_(hWnd, "oldproc")
    Case #WM_CHAR
      Select wParam
        Case '0' To '9', #VK_BACK
        Case ','
          If CountString(GetGadgetText(GetProp_(hWnd, "PB_ID")), ",")
            ProcedureReturn 0
          EndIf
        Default
          ProcedureReturn 0 ; kein gültiges Zeichen
      EndSelect
  EndSelect
 
  ProcedureReturn CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
EndProcedure

Procedure SubClassStringGadget(ID)
  Protected oldproc = SetWindowLongPtr_(GadgetID(ID), #GWL_WNDPROC, @cbStringGadget())
  ProcedureReturn SetProp_(GadgetID(ID), "oldproc", oldproc)
EndProcedure

OpenWindow(0, #PB_Ignore, #PB_Ignore, 250, 80, "")
StringGadget(0, 10, 10, 200, 20, "")
SubClassStringGadget(0)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver 
Ich hoffe, ich habe nicht noch mehr übersehen :)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Mit StringGadget Kommazahl einlesen

Beitrag von marcelx »

So funktioniert es.

Was ich haben wollte, ist die Eingabe wie z.B. -123 (negative Werte) 123,56 (positive Werte mit maximale 2 Stellen nach den Komma)

Mit diese Basis kann ich (denke ich) was anfangen.
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mit StringGadget Kommazahl einlesen

Beitrag von ts-soft »

Naja, bin mir nicht so sicher ob Du das packst und wenn ich gerade bei bin :wink:

Code: Alles auswählen

EnableExplicit

Procedure cbStringGadget(hWnd, uMsg, wParam, lParam)
  Protected oldproc = GetProp_(hWnd, "oldproc")
 
  Select uMsg
    Case #WM_NCDESTROY
      RemoveProp_(hWnd, "oldproc")
    Case #WM_CHAR
      Select wParam
        Case '0' To '9', #VK_BACK
        Case '-'
          If CountString(GetGadgetText(GetProp_(hWnd, "PB_ID")), "-")
            ProcedureReturn 0
          EndIf
          SetGadgetText(GetProp_(hWnd, "PB_ID"), "-" +   GetGadgetText(GetProp_(hWnd, "PB_ID")))
          ProcedureReturn 0  
        Case ','
          If CountString(GetGadgetText(GetProp_(hWnd, "PB_ID")), ",")
            ProcedureReturn 0
          EndIf
        Default
          ProcedureReturn 0 ; kein gültiges Zeichen
      EndSelect
  EndSelect
 
  ProcedureReturn CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
EndProcedure

Procedure SubClassStringGadget(ID)
  Protected oldproc = SetWindowLongPtr_(GadgetID(ID), #GWL_WNDPROC, @cbStringGadget())
  ProcedureReturn SetProp_(GadgetID(ID), "oldproc", oldproc)
EndProcedure

OpenWindow(0, #PB_Ignore, #PB_Ignore, 250, 80, "")
StringGadget(0, 10, 10, 200, 20, "")
SubClassStringGadget(0)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver 
Es kann nur einmal minus eingefügt werde und dieses wird auch gleich an den Anfang gerückt.

Man könnte auch auf Len(...) = 0 prüfen und nur dann das - zulassen. Ist vielleicht etwas irritierend,
wenn ein Minus an den Anfang rückt :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Mit StringGadget Kommazahl einlesen

Beitrag von Danilo »

Oder mit regulären Ausdrücken prüfen:

Code: Alles auswählen

;
; by Danilo
;
; http://www.purebasic.fr/german/viewtopic.php?f=16&t=26388&start=7
;
; Nummern-Eingabe Beispiele: 123  567,88  -12  -4,5
;
OpenWindow(0, #PB_Ignore, #PB_Ignore, 250, 80, "")
StringGadget(0, 10, 10, 200, 20, "")

CreateRegularExpression(0,"^\-{0,1}\d*$|^\-{0,1}\d+\,\d{0,2}$|^$") ; ^       = Anfang des Strings
                                                                   ; $       = Ende des Strings
                                                                   ; \d      = Dezimalzahl 0-9
                                                                   ; +       = 1 oder mehr Vorkommen
                                                                   ; *       = 0 oder mehr Vorkommen
                                                                   ; |       = alternative Moeglichkeit (Or in PureBasic)
                                                                   ; \,      = Komma
                                                                   ; \-{0,1} = Minus{0 oder 1 mal}
                                                                   ; \d{0,2} = Dezimalzahl 0-9 { 0 bis 2 mal }
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0 And EventType() = #PB_EventType_Change
        txt$ = GetGadgetText(0)
        If MatchRegularExpression(0,txt$)=0                           ; wenn kein Treffer, dann wieder vorherigen text setzen
          SendMessage_(GadgetID(0),#EM_GETSEL,0,@endpos) : endpos - 1 ; cursor position holen
          SetGadgetText(0,old$)                                       ; alten text wieder setzen
          SendMessage_(GadgetID(0),#EM_SETSEL,endpos,endpos)          ; cursor position wieder setzen
        Else
          old$ = txt$
        EndIf
      EndIf
  EndSelect
ForEver
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mit StringGadget Kommazahl einlesen

Beitrag von ts-soft »

@Danilo
:allright: , aber ich bekomme beim entwerfen des Ausdrucks immer einen Wurm im Kopf :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Mit StringGadget Kommazahl einlesen

Beitrag von marcelx »

@Danilo

deine Lösung mit RegularExpression finde ich super und es funktioniert
Win-10, PB 5.31 (Windows - x86)
Antworten