![]() |
Edit eingabe begrenzen (nur EIN Komma)
Hallo Leute
ich habe ein Editfeld in dem möcht ich eine Zahl mit Komma Stelle eingeben. Die einschränkung für das eingeben von nur Zahlen inkl. Komma ist kein Problem. Wie kann ich es anstellen das nur Ein Komma eingegeben wird. :wall: Gruss Tau |
Re: Edit eingabe begrenzen (nur EIN Komma)
Kuck mit
![]() |
Re: Edit eingabe begrenzen (nur EIN Komma)
Hi,
da fällt mir nur eine Schleife durch alle Zeichen ein :-/
Delphi-Quellcode:
Edit: Luckies Methode klingt eleganter :mrgreen: allerdings würde ich statt einer boolschen Variable die Eigenschaft TEdit.Tag benutzen. Was dann noch bleibt, ist das Problem, wenn der User per Copy&Paste einen falschen Wert einfügt...
procedure TForm1.Edit1Change(Sender: TObject);
var i, count: Integer; s: String; begin count := 0; s := Edit1.Text; for i:=Length(s) downto 1 do begin If s[i] = ',' then begin inc(count); If count > 1 then Delete(s, i, 1); end; end; If count > 1 then begin Edit1.Text := s; Edit1.SelStart := MaxInt; end; end; |
Re: Edit eingabe begrenzen (nur EIN Komma)
Zitat:
![]() |
Re: Edit eingabe begrenzen (nur EIN Komma)
Schon, aber doch nur den des ersten Vorkommnisses? Damit weiß er ja noch nicht, wie oft das Zeichen enthalten ist?!
|
Re: Edit eingabe begrenzen (nur EIN Komma)
Wieso? Wenn ich das im OnChange prüfe, dann weiß ich doch sofort, ob ein Komma eingegeben wurde. Und wenn dann im OnKeyPress noch ein Komma kommt, schicke ich es in das Tastatur-Nirvana. das sollte um einiges performanter sein, als deine Lösung mit der Schleife.
|
Re: Edit eingabe begrenzen (nur EIN Komma)
Zitat:
|
Re: Edit eingabe begrenzen (nur EIN Komma)
Das sollte auch ein OnChange auslösen.
|
Re: Edit eingabe begrenzen (nur EIN Komma)
So geht das :
Benutze am besten das OnKeyPress.
Delphi-Quellcode:
ZulZeichen ist in diesem Fall '0'..'9', also ein Set. Auch mit C+P ist es mir dabei nicht gelungen einen 2. Decimalseparator einzufügen.
procedure TRealEdit.KeyPress(var Key: Char);
begin inherited; if Pos(DecimalSeparator, Text) = 0 then // einen . im RealEdit.text zulassen ZulZeichen := ZulZeichen + [DecimalSeparator] else ZulZeichen := ZulZeichen - [DecimalSeparator]; // zweiten . verhindern if not (Key in ZulZeichen) then Key := #0; end; [EDIT1] Vom OnChange ist abzuraten. 8) [EDIT2] Keypress wird viel früher abgearbeitet. Wozu noch das ganze Edit dauernd überwachen ? Lieber nur einen Tastendruck. |
Re: Edit eingabe begrenzen (nur EIN Komma)
Hallo Hansa
deine Lösung gefällt mir mit abstand am besten mir ist noch nicht ganz klar was du für einen Daten Type bei der Deklaration von ZulZeichen und DezimalSeparator verwendest. :?: Gruss Tau |
Re: Edit eingabe begrenzen (nur EIN Komma)
ZulZeichen sind alle die, die du willst, also z.B. ['a','e','0','9'] sonst notfalls nichts. Ist im Constructor eingestellt. Decimalseparator ist vordefiniert -> F1 :!: Das ganze ist aber ohne Gewähr. Bin mir nicht sicher, ob ich da nicht doch noch eine andere Prozedur zusätzlich verwenden mußte.
|
Re: Edit eingabe begrenzen (nur EIN Komma)
Hallo Hansa
DANKE :-D :witch: :-D es klapt Gruss Tau |
Re: Edit eingabe begrenzen (nur EIN Komma)
und dabei gibt es über die suche sehr gut funtionierende Lösungen zu entdecken, wo nicht nur die Anzahl der Kommas, sondern auch dessen Position und gleich auch noch die Position vom - überprüft wird.
(da an meinen schönen Code denke -.-'') |
Re: Edit eingabe begrenzen (nur EIN Komma)
@Hansa: Das OnChange muss zusätzlich noch ausgeführt werden. Zwar geht es mit "Strg + V" nicht mehr da das V abgefangen wird, aber über das Kontextmenü kann man weiterhin ein zweites "," einfügen
|
Re: Edit eingabe begrenzen (nur EIN Komma)
Hallo,
nur noch was am Rande: um zu schauen ob ein Zeichen mehrfach vorkommt braucht man doch nur zu schauen ob pos(string,zeichen)=rpos(string,zeichen) (und natürlich muß pos(..)!=0 sein). |
Re: Edit eingabe begrenzen (nur EIN Komma)
Bei meinem Beispiel ist es aber nun erst gar nicht mehr möglich überhaupt 2 Kommas einzugeben !! Soll ich etwas überprüfen, was gar nicht vorkommen kann ? :shock:
Und wenn ich schon dabei bin: mit dem Kontextmenü könnte man den Code tatsächlich überlisten, aber zu diesem Zweck noch jedes normale Zeichen abzuprüfen, für so einen seltenen Fall ?? Will man das auch noch abfangen, so müßte man tatsächlich noch den ganzen einzufügenden String auf Plausibilität prüfen. Und das auch bei jedem richtigen Zeichen. Dann wäre das schöne logisch nachvollziehbare Bsp. für die Katz. :lol: Ist in dem Feld '123' drin und ich füge per Kontextmenü '0.34' ein. Was dann ?? Egal wo ich genau einfüge, das Resultat wäre immer eine richtige Zahl. Mein Original ist zudem noch etwas größer (Nachkommastellen, Tausender-Separator usw.) und noch dazu in eine eigene Komponente. Ich tendiere deshalb eher dazu, daß jemand, der so blöd ist so etwas zu machen eine Exception verdient hat. Dann weiß er es fürs nächste mal. :mrgreen: Hat jemand allerdings eine Idee, wie man das Einfügen per Kontextmenü komplett unterbinden kann, dann her damit. Das könnte man noch einbauen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz