Mit StringGadget Kommazahl einlesen

Anfängerfragen zum Programmieren mit PureBasic.
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)
nschu
Beiträge: 1
Registriert: 20.01.2010 17:49

Re: Mit StringGadget Kommazahl einlesen

Beitrag von nschu »

Danke @Danilo

Ich finde es toll dass Ihr alle im Forum Beispiele gibt.

So kann man Purebasic gut lernen. :allright:
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: Intel Core i3-4170 CPU 3,70 GHz
8,00 GB Arbeitsspeicher
WIN 10 Pro 64 Bit Betriebssystem
Wohnort: Bremen

Re: Mit StringGadget Kommazahl einlesen

Beitrag von Pelagio »

Ich wollt meinen Senf auch dazu geben,
denn ich finde die Idee von Danilo sehr interessant.
Bis dato habe ich, ähnlich wie ts-soft, meine Stringgadgets auf Numerickurs gebracht
aber ich werde es wohl jetzt auf die Art von Danilo ändern.

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
; mit kleiner Änderung
;

Procedure CreateNumericString(vID.i, vKomma.s = Chr(44), vNKv.a = 0, vNKb.a = 2)
	Protected pText.s = "^\-{0,1}\d*$|^\-{0,1}\d+\"

	pText + vKomma + "\d{"
	pText + Str(vNKv) + ","
	pText + Str(vNKb) + "}$|^$"
	CreateRegularExpression(vID, pText)
;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 }
EndProcedure

Procedure InputNumericString(vID.i)
	Protected pEndPos.i, pString.s = GetGadgetText(vID)
	Static Dim pText.s(1)

	If (pText(0)<>Str(vID)): pText(0) = Str(vID): pText(1) = Left(pString, Len(pString)-1): EndIf
	If (MatchRegularExpression(vID, pString)=#False)              ; wenn kein Treffer, dann wieder vorherigen text setzen
		SendMessage_(GadgetID(vID), #EM_GETSEL, #False, @pEndPos)  ; cursor position holen
		pEndPos - 1
		SetGadgetText(vID, pText(1))                               ; alten text wieder setzen
		SendMessage_(GadgetID(vID), #EM_SETSEL, pEndPos, pEndPos)  ; cursor position wieder setzen
	Else
		pText(1) = pString
	EndIf
EndProcedure

OpenWindow(0, #PB_Ignore, #PB_Ignore, 250, 70, "")
StringGadget(0, 10, 10, 200, 20, ""): CreateNumericString(0)
StringGadget(1, 10, 40, 200, 20, ""): CreateNumericString(1)
SetActiveGadget(0)
Repeat
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow
			Break
		Case #PB_Event_Gadget
			If (EventType()=#PB_EventType_Change)
				Select EventGadget()
					Case 0: InputNumericString(0)
					Case 1: InputNumericString(1)
				EndSelect
			EndIf
	EndSelect
ForEver

End
Auch ich danke für Eure Ideen :praise:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.10 LTS]. :allright:
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Mit StringGadget Kommazahl einlesen

Beitrag von mk-soft »

Ok,

damit es auch auf allen OS funktioniert, kann man auch eigene Gadgets mit dem CanvasGadget erstellen.
Hier mal ein paar Beispiele auch mit einem NumberGadget

Link: https://www.purebasic.fr/english/viewto ... 12&t=74267
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten