Dezimalzahlen in Inputrequester

Anfängerfragen zum Programmieren mit PureBasic.
Mike32
Beiträge: 41
Registriert: 27.05.2012 14:24

Dezimalzahlen in Inputrequester

Beitrag von Mike32 »

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
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Dezimalzahlen in Inputrequester

Beitrag von RSBasic »

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.
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: Dezimalzahlen in Inputrequester

Beitrag von ts-soft »

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:") 
Sind natürlich noch kleine Anpassungen nötig, aber als Anfang sollte es nützlich sein :wink:
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.
Bild
Mike32
Beiträge: 41
Registriert: 27.05.2012 14:24

Re: Dezimalzahlen in Inputrequester

Beitrag von Mike32 »

Vielen Dank!! :D

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

Grüße

Mike
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: Dezimalzahlen in Inputrequester

Beitrag von ts-soft »

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.
Bild
Benutzeravatar
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

Beitrag von NicTheQuick »

ts-soft hat geschrieben:Sind natürlich noch kleine Anpassungen nötig, aber als Anfang sollte es nützlich sein :wink:
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.
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: Dezimalzahlen in Inputrequester

Beitrag von ts-soft »

@NicTheQuick

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.
Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Dezimalzahlen in Inputrequester

Beitrag von ProgOldie »

Am schönsten und klarsten finde ich immer noch Danilos Lösung des Problems (Forumsquelle finde ich momentan nicht)

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
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 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
Antworten