Seite 1 von 1

Dezimalzahlen in Inputrequester

Verfasst: 06.06.2012 20:52
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

Re: Dezimalzahlen in Inputrequester

Verfasst: 06.06.2012 20:58
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.

Re: Dezimalzahlen in Inputrequester

Verfasst: 06.06.2012 21:19
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:

Re: Dezimalzahlen in Inputrequester

Verfasst: 06.06.2012 21:25
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

Re: Dezimalzahlen in Inputrequester

Verfasst: 06.06.2012 21:35
von ts-soft
Ich hab noch einen kleinen Fehler wegen des Parents beseitigt!

Re: Dezimalzahlen in Inputrequester

Verfasst: 06.06.2012 21:54
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.

Re: Dezimalzahlen in Inputrequester

Verfasst: 06.06.2012 22:03
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!

Re: Dezimalzahlen in Inputrequester

Verfasst: 09.07.2012 09:45
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