Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Edit eingabe begrenzen (nur EIN Komma) (https://www.delphipraxis.net/31430-edit-eingabe-begrenzen-nur-ein-komma.html)

Tau 9. Okt 2004 00:49


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

Luckie 9. Okt 2004 01:09

Re: Edit eingabe begrenzen (nur EIN Komma)
 
Kuck mit Delphi-Referenz durchsuchenpos im OnChange Ereignis des Edits, ob ein Komma da ist. Wenn ja, dann setzt du eine boolsche Variable auf True und wenn diese True ist, verhinderst du im OnKeyPress dass ein weiteres Komma eingeben werden kann.

Dani 9. Okt 2004 01:21

Re: Edit eingabe begrenzen (nur EIN Komma)
 
Hi,

da fällt mir nur eine Schleife durch alle Zeichen ein :-/

Delphi-Quellcode:
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;
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...

Luckie 9. Okt 2004 01:23

Re: Edit eingabe begrenzen (nur EIN Komma)
 
Zitat:

Zitat von Dani
da fällt mir nur eine Schleife durch alle Zeichen ein :-/

Und warum? Delphi-Referenz durchsuchenPos gibt dir genau den Index des gefundenen Zeichens zurück.

Dani 9. Okt 2004 01:27

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?!

Luckie 9. Okt 2004 01:33

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.

Dani 9. Okt 2004 01:44

Re: Edit eingabe begrenzen (nur EIN Komma)
 
Zitat:

das sollte um einiges performanter sein, als deine Lösung mit der Schleife
Das ist es auch, aber wenn der Benutzer einen falschen Wert per Copy&Paste einfügt, wird der ohne Prüfung übernommen.

Luckie 9. Okt 2004 02:34

Re: Edit eingabe begrenzen (nur EIN Komma)
 
Das sollte auch ein OnChange auslösen.

Hansa 9. Okt 2004 03:35

Re: Edit eingabe begrenzen (nur EIN Komma)
 
So geht das :

Benutze am besten das OnKeyPress.

Delphi-Quellcode:
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;
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.

[EDIT1] Vom OnChange ist abzuraten. 8)
[EDIT2] Keypress wird viel früher abgearbeitet. Wozu noch das ganze Edit dauernd überwachen ? Lieber nur einen Tastendruck.

Tau 9. Okt 2004 03:51

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

Hansa 9. Okt 2004 04:05

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.

Tau 9. Okt 2004 05:17

Re: Edit eingabe begrenzen (nur EIN Komma)
 
Hallo Hansa

DANKE :-D :witch: :-D

es klapt

Gruss
Tau

himitsu 9. Okt 2004 06:52

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 -.-'')

SirThornberry 11. Okt 2004 10:01

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

fiasko 11. Okt 2004 10:06

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).

Hansa 11. Okt 2004 11:46

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 01:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz