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: 8816
 - 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
						
