Dezimalzahlen in Inputrequester
Dezimalzahlen in Inputrequester
Ich habe folgende Probleme/Fragen.
1. Ich möchte ein Inputrequester starten, in das man nur Dezimalzahlen eingeben kann. Gibt es ggf. hierfür einen Parameter? Und gibt es ggf. einen Parameter für einen Wertebereich, der zulässig ist?
2. Wenn nein, habe ich festgestellt, dass man als Dezimalzahl einen Punkt und nicht ein Komma verwenden muss, damit man mit ValF() dies umgewandelt bekommt. Jetzt ist es aber so, dass der Anwender z.B. für die Eingabe von 10 Cent 0,1 stattdessen eingibt. Was mache ich da?
Thx
Grüße
Mike
1. Ich möchte ein Inputrequester starten, in das man nur Dezimalzahlen eingeben kann. Gibt es ggf. hierfür einen Parameter? Und gibt es ggf. einen Parameter für einen Wertebereich, der zulässig ist?
2. Wenn nein, habe ich festgestellt, dass man als Dezimalzahl einen Punkt und nicht ein Komma verwenden muss, damit man mit ValF() dies umgewandelt bekommt. Jetzt ist es aber so, dass der Anwender z.B. für die Eingabe von 10 Cent 0,1 stattdessen eingibt. Was mache ich da?
Thx
Grüße
Mike
Re: Dezimalzahlen in Inputrequester
1. Das ist so direkt nicht möglich. Du kannst zwar nach der Eingabe überprüfen, ob die Zeichen, die eingegeben wurden, für dein Programm zulässig sind, aber dann müsste der Anwender die Eingabe wiederholen. Am besten einfach ein eigenes Fenster erstellen. Auf dein Fenster erstellst du ein TextGadget, StringGadget und zwei Buttons (z.B. Übernehmen und Abbrechen). Bei deinem StringGadget kannst du im Event-Bereich in Echtzeit überprüfen, ob verbotene Zeichen eingegeben wurden. Daraufhin kannst du diese automatisch entfernen.
Beispiel: http://www.rsbasic.de/aktualisierung/wi ... stellen.pb
2. Du kannst für so was auch ReplaceString nutzen, um anschließend "," durch "." zu ersetzen und zum Schluss dann in Fließkommazahl konvertieren.
Beispiel: http://www.rsbasic.de/aktualisierung/wi ... stellen.pb
2. Du kannst für so was auch ReplaceString nutzen, um anschließend "," durch "." zu ersetzen und zum Schluss dann in Fließkommazahl konvertieren.
- 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: Dezimalzahlen in Inputrequester
Code: Alles auswählen
EnableExplicit
Procedure.f FloatInputRequester(Titel.s, Text.s, parent = 0)
Protected win, txt, str1, txt2, str2, btn
Protected result.s, flag = #PB_String_Numeric
If parent
win = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 300, 100, Titel, #PB_Window_MinimizeGadget, WindowID(parent))
Else
win = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 300, 100, Titel, #PB_Window_MinimizeGadget)
EndIf
If parent : DisableWindow(parent, #True) : EndIf
If win
txt = TextGadget(#PB_Any, 10, 53, 100, 30, text)
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
flag | #SS_RIGHT
CompilerEndIf
str1 = StringGadget(#PB_Any, 120, 50, 50, 20, "0", flag)
txt2 = TextGadget(#PB_Any, 171, 50, 5, 30, ".")
str2 = StringGadget(#PB_Any, 178, 50, 50, 20, "0", #PB_String_Numeric)
SetGadgetFont(txt2, FontID(LoadFont(#PB_Any, "Arial", 16)))
btn = ButtonGadget(#PB_Any, 240, 50, 30, 25, "Ok")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = btn
Break
EndIf
EndSelect
ForEver
EndIf
If parent : DisableWindow(parent, #False) : EndIf
result = GetGadgetText(str1) + "." + GetGadgetText(str2)
CloseWindow(win)
ProcedureReturn ValF(result)
EndProcedure
Debug FloatInputRequester("Mein Requester", "Bitte Zahl eingeben:")

Zuletzt geändert von ts-soft am 06.06.2012 22:55, insgesamt 2-mal geändert.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Dezimalzahlen in Inputrequester
Vielen Dank!!
Ich werde mal alle drei Varianten durchtesten.
Schön wäre es, wenn es Zusatzparameter für den Inputrequest gäbe.
Grüße
Mike

Ich werde mal alle drei Varianten durchtesten.
Schön wäre es, wenn es Zusatzparameter für den Inputrequest gäbe.

Grüße
Mike
- 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: Dezimalzahlen in Inputrequester
Ich hab noch einen kleinen Fehler wegen des Parents beseitigt!
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- NicTheQuick
- Ein Admin
- Beiträge: 8808
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Dezimalzahlen in Inputrequester
Die wichtigste Anpassung wäre wohl, dass das Requester nur geschlossen wird, wenn man auf das X des Requesters klickt und nicht auf irgendein X in einem offenen Fenster, das im Hintergrund geöffnet sein könnte.ts-soft hat geschrieben:Sind natürlich noch kleine Anpassungen nötig, aber als Anfang sollte es nützlich sein
- 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: Dezimalzahlen in Inputrequester
@NicTheQuick
Wie meinst Du das? Die ParentID sorgt doch dafür, dass das Hauptfenster nicht geschlossen werden kann,
der Requester ist doch Modal!
Wie meinst Du das? Die ParentID sorgt doch dafür, dass das Hauptfenster nicht geschlossen werden kann,
der Requester ist doch Modal!
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- ProgOldie
- Beiträge: 236
- Registriert: 19.05.2012 17:09
- Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02
Re: Dezimalzahlen in Inputrequester
Am schönsten und klarsten finde ich immer noch Danilos Lösung des Problems (Forumsquelle finde ich momentan nicht)
Das könnte man sogar noch erweitern, um einen Wertebereich für Zahlen. Dazu müsste aber festgelegt werden, was geändert werden soll, wenn die Zahl zu groß ist. (1. Stelle?)
Aus Danilos Ansatz kann man auch hübsche Sachen wie die folgende ableiten, bei der nur ein bestimmter ASC-Bereich und Sonderzeichen erlaubt sind und die maximale Stringlänge vorgegeben ist:
Code: Alles auswählen
Procedure checkFloatInput(gadget)
; Autor Danilo
SendMessage_(GadgetID(gadget),#EM_GETSEL,@start,0)
txt$ = GetGadgetText(gadget)
*p.Character = @txt$
While *p\c = '.' Or (*p\c >= '0' And *p\c <= '9')
If *p\c = '.'
pointcount+1
If pointcount > 1 : *p + SizeOf(Character) : start-1 : Continue : EndIf
EndIf
new$ + Chr(*p\c) : *p + SizeOf(Character)
Wend
SetGadgetText(gadget,new$)
SendMessage_(GadgetID(gadget),#EM_SETSEL,start,start)
EndProcedure
Aus Danilos Ansatz kann man auch hübsche Sachen wie die folgende ableiten, bei der nur ein bestimmter ASC-Bereich und Sonderzeichen erlaubt sind und die maximale Stringlänge vorgegeben ist:
Code: Alles auswählen
Procedure checkstringInput(gadget,vonAsc,bisAsc,Sonderzeichen.s,Laenge)
;Abänderung von Danilos checkfloat; Autor:ProgOldie
Protected start, count, pointcount, new$
SendMessage_(GadgetID(gadget), #EM_GETSEL, @start, 0)
Protected txt$ = GetGadgetText(gadget)
Protected *p.Character = @txt$
While *p\c And Len(new$) <= Laenge; alle eingegebenen Zeichen durchlaufen
If (*p\c >= vonAsc And *p\c <= bisAsc) Or FindString(Sonderzeichen,Chr(*p\c),1)
new$+Chr(*p\c)
EndIf
*p + SizeOf(Character) ; zum nächsten Buchstaben
count + 1
Wend
SetGadgetText(gadget, new$)
SendMessage_(GadgetID(gadget), #EM_SETSEL, start, start)
EndProcedure
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18