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

Re: Dezimalzahlen in Inputrequester
Verfasst: 06.06.2012 21:25
von Mike32
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
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

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