Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Editfelder für Buchstaben sperren (https://www.delphipraxis.net/80884-editfelder-fuer-buchstaben-sperren.html)

naudoc 16. Nov 2006 22:47


Editfelder für Buchstaben sperren
 
Hallo,

ich suche (mal wieder für den Taschenrechner :lol: ) einen Code, der Editfelder für Buchstaben und Sonderzeichen sperrt, denn wenn ich zB 'kk'+'kk' "rechne" kommt der Fehler "'kk' ist kein gültiger Gleitkommawert". Dies möchte ich verhindern, oder evtl. sogar so Programmieren, dass sich ein eigenes Popupfeld öffnet mit dem Text "Kann man mit Buchstaben rechnen? Depp!", oder einfach nur in nem Label "Rechnen mit Buchstaben geht nicht wirklich" erscheint.
Wär cool, wenn ihr mir helfen könntet.

Danke schon mal!
mfG Max

PS: Kennt ihr ein nützliches Programm an dem man programmieren üben kann?(Wie zB der Taschenrechner).

mkinzler 16. Nov 2006 22:53

Re: Editfelder für Buchstaben sperren
 
TMaskEdit oder mit Eventbehandlungsroutine auf falsche Eingabe reagieren.

Luckie 16. Nov 2006 22:58

Re: Editfelder für Buchstaben sperren
 
Das haben wir schon so oft hier besprochen. Einfach mal die Suche bemühen.

naudoc 16. Nov 2006 23:03

Re: Editfelder für Buchstaben sperren
 
Hi

@mkinzler: Ich versteh nur Bahnhof, sorry

@Luckie: ich hab nach editfeld buchstaben sperren gesucht, aber nichts gefunden. Wonach muss ich suchen?

Danke!
mfG Max

Mackhack 16. Nov 2006 23:05

Re: Editfelder für Buchstaben sperren
 
Hm,

ich habe eingegeben: keine buchstaben zulassen! Da kommen schon x Taschenrechner-Threads hervor!

naudoc 16. Nov 2006 23:06

Re: Editfelder für Buchstaben sperren
 
danke!

paritycheck 16. Nov 2006 23:10

Re: Editfelder für Buchstaben sperren
 
Ich mach das immer so:

Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject); //Diese Prozedur als OnChange um Copy/Paste zu verhindern
var i: Integer;
begin
  for i:= 1 to length(Edit1.Text) do begin
      if not (Edit1.Text[i] in ['0'..'9']) then begin
         Edit1.Text:= '';
         break;
      end;
  end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); //Das hier im OnKeyPress fängt alles ab was keine Zahl is
begin
  if not (Key in ['0'..'9']) then Key:= #0;
end;

mkinzler 16. Nov 2006 23:15

Re: Editfelder für Buchstaben sperren
 
Zitat:

@mkinzler: Ich versteh nur Bahnhof, sorry
TMaskEdit ist eine Komponente, die eien Eingabemaske besitzt, die regelt was man eingeben kann.
Das mit dem Event hat paritycheck genauer beschrieben.

naudoc 25. Nov 2006 00:38

Re: Editfelder für Buchstaben sperren
 
Hallo,
was ist hier Falsch:
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var a,b,c:real;
begin
if ((edit1.text=floattostr(a)) or (edit1.text='-'+floattostr(a)+'') or (edit1.text='0') or (edit1.text=''))
and ((edit2.text=floattostr(b)) or (edit2.text='-'+floattostr(b)+'') or (edit2.text='0') or (edit2.text=''))
and ((edit3.text=floattostr(c)) or (edit3.text='-'+floattostr(c)+'') or (edit3.text='0') or (edit3.text=''))
then
mfG naudoc

Luckie 25. Nov 2006 00:46

Re: Editfelder für Buchstaben sperren
 
Zitat:

Zitat von naudoc
was ist hier Falsch:

Gar nichts. Kompiliert einwandfrei. Bis auf die Warnungen:
Zitat:

[Warning] Unit1.pas(31): Variable 'a' might not have been initialized
[Warning] Unit1.pas(31): Variable 'b' might not have been initialized
[Warning] Unit1.pas(31): Variable 'c' might not have been initialized
Aber, da du den Variablen keinen Wert zu weist, sind diese warnungen ohne weiteres nachvollziehbar.

OldGrumpy 25. Nov 2006 10:23

Re: Editfelder für Buchstaben sperren
 
Zitat:

Zitat von naudoc
Dies möchte ich verhindern, oder evtl. sogar so Programmieren, dass sich ein eigenes Popupfeld öffnet mit dem Text "Kann man mit Buchstaben rechnen? Depp!", oder einfach nur in nem Label "Rechnen mit Buchstaben geht nicht wirklich" erscheint.

Also erstens: Man kann sehr wohl mit Buchstaben rechnen, sogar auf mehrere Arten. Ist also wohl eher PEBKAC beim Programmierer als "Depp"-User. Und zweitens wirds ein Programm das den User beschimpft wohl kaum größere Verbreitung erfahren. Vielleicht sollte man Dir eine Extraversion von Delphi besorgen die statt "Compiler error" "Du Idiot" ins Log schreibt :mrgreen: :mrgreen: :mrgreen:

Sorry, den konnte ich mir echt nicht verkneifen :angel:

Cöster 25. Nov 2006 12:59

Re: Editfelder für Buchstaben sperren
 
Zitat:

Zitat von naudoc
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var a,b,c:real;
begin
if ((edit1.text=floattostr(a)) or (edit1.text='-'+floattostr(a)+'') or (edit1.text='0') or (edit1.text=''))
and ((edit2.text=floattostr(b)) or (edit2.text='-'+floattostr(b)+'') or (edit2.text='0') or (edit2.text=''))
and ((edit3.text=floattostr(c)) or (edit3.text='-'+floattostr(c)+'') or (edit3.text='0') or (edit3.text=''))
then

Was willst du mit dem Code denn erreichen? a, b und c sind nicht zugewiesene Real-Typen. Du solltest prüfen, ob die Methode StrToFloat auf das Edit angewendet einen Fehler hervorruft. Das kann man mit einem try...except...end-Block (näheres dazu in der Delphi-Hilfe) machen.

naudoc 26. Nov 2006 09:59

Re: Editfelder für Buchstaben sperren
 
Hi,
so solls aussehen.

Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var a,b,c:real;
begin
a:=strtofloat(edit1.Text);
b:=strtofloat(edit2.Text);
c:=strtofloat(edit3.Text);
if ((edit1.text=floattostr(a)) or (edit1.text='-'+floattostr(a)+'') or (edit1.text='0') or (edit1.text=''))
and ((edit2.text=floattostr(b)) or (edit2.text='-'+floattostr(b)+'') or (edit2.text='0') or (edit2.text=''))
and ((edit3.text=floattostr(c)) or (edit3.text='-'+floattostr(c)+'') or (edit3.text='0') or (edit3.text=''))
then
Es soll erreicht werden, das sich ein Labelfeld nur verändert, wenn das Editfeld eine Zahl, oder leer ist...

mfG

Hawkeye219 26. Nov 2006 10:16

Re: Editfelder für Buchstaben sperren
 
Hallo Max,

durch das ständige Umwandeln zwischen String und Float erreichst du nicht das von dir gewünschte Verhalten. So wird z.B. die Eingabe '1E4' durch StrToFloat in den Wert 10000 umgewandelt, die Anwendung von FloatToStr auf diesen Wert führt dann aber nicht zum ursprünglichen Eingabestring. Auch die (versuchte) Berücksichtigung des Vorzeichens ist nicht richtig.

Vielleicht ist der folgende Code ja das, was du suchst:

Delphi-Quellcode:
procedure TForm1.Edit1Change (Sender: TObject);

  function CheckEdit (aEdit: TEdit): Boolean;
    var Dummy : Double;
  begin
    Result := (aEdit.Text = '') or TryStrToFloat(aEdit.Text, Dummy);
  end;

begin
  if CheckEdit(Edit1) and CheckEdit(Edit2) and CheckEdit(Edit3) then
    ...
end;
Gruß Hawkeye

naudoc 26. Nov 2006 21:33

Re: Editfelder für Buchstaben sperren
 
Sorry, aber ich versteh nicht wie die Funktion funktioniert, deshalb kann ich sie nicht anwenden...
Weiss nicht was an welche Stelle kommt, und warum...

Danke trotzdem!

mfg naudoc

3_of_8 26. Nov 2006 22:05

Re: Editfelder für Buchstaben sperren
 
Erm, lol?

Da gibts doch nicht viel zu verstehen.

Eine bestimmte Aktion wird ausgeführt, wenn die zu überprüfenden Edits entweder leer sind oder gültige Zahlenwerte enthalten.

naudoc 26. Nov 2006 22:59

Re: Editfelder für Buchstaben sperren
 
Hallo,
so kann man ja nicht mal mit der Taste über Enter löschen, aber 3,,,4--4,,, usw kann eingegeben werden...
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); //Das hier im OnKeyPress fängt alles ab was keine Zahl is
begin
  if not (Key in ['0'..'9']) then Key:= #0;
end;
Geht das nicht noch etwas besser?
mfG naudoc

naudoc 26. Nov 2006 23:03

Re: Editfelder für Buchstaben sperren
 
Hallo,
Zitat:

Zitat von 3_of_8
Erm, lol?

Da gibts doch nicht viel zu verstehen.

Eine bestimmte Aktion wird ausgeführt, wenn die zu überprüfenden Edits entweder leer sind oder gültige Zahlenwerte enthalten.


was ist Dummy, was ist Double, wie funktioniert CheckEdit? :gruebel:

Könntest du das mal programmieren für die variablen a und b, wenn a+b gerechnet werden soll?(Ergebnis soll c sein, und die Editfelder Edit1, Edit2 und Edit3)

Wär vielleicht hilfreich...

Danke! :thumb:

Naudoc

3_of_8 26. Nov 2006 23:17

Re: Editfelder für Buchstaben sperren
 
Aaalso...

Double ist einfach ein Gleitkommatyp, also eine Zahl mit Nachkommastellen. Dummy ist eine Variable, die man einfach braucht, um sie als var-Parameter an die Funktion TryStrToInt zu übergeben.

Wenn du jetzt die Zahlenwerte von edit1 und edit2 addieren willst, geht das so:

Delphi-Quellcode:
showmessage(inttostr(strtointdef(edit1.text, 0)+strtointdef(edit2.text, 0)));
Das bedeutet, dass versucht wird, die Zahlenwerte der beiden Edits zu addieren. Wenn ein Edit keine Zahl enthält, wird der Wert als 0 angenommen.

Delphi-Quellcode:
var a, b: Integer;
begin
  if not (trystrtoint(edit1.text, a) and trystrtoint(edit1.text, b)) then
    showmessage('Bitte geben sie gültige Zahlenwerte ein.')
  else
    showmessage(inttostr(a+b));
end;
Das bedeutet, dass die Zahlenwerte der Edits addiert werden, wenn sie gültig sind. Ansonsten wird eine Fehlermeldung ausgegeben.


CheckEdit rufst du am besten in OnChange auf und machst dann irgendne Spielerei wie das Edit rot färben, wenn es keinen gültigen Wert enthält.

Hansa 27. Nov 2006 01:37

Re: Editfelder für Buchstaben sperren
 
Zitat:

Zitat von naudoc
...aber 3,,,4--4,,, usw kann eingegeben werden...
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); //Das hier im OnKeyPress fängt alles ab was keine Zahl is
begin
  if not (Key in ['0'..'9']) then Key:= #0;
end;

Die Behauptung ist ja wohl nicht Dein Ernst ? :shock: Das hier ist jetzt keine Frage, sondern eine Feststellung : es gibt in dem Fall zwei Fehlerquellen. Entweder wurde nicht Edit1 usw. benutzt sondern Edit2 usw. Die nächste wäre, Edit1 benutzt das Edit2KeyPress oder sonstwas.

naudoc 27. Nov 2006 17:30

Re: Editfelder für Buchstaben sperren
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von naudoc
...aber 3,,,4--4,,, usw kann eingegeben werden...
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); //Das hier im OnKeyPress fängt alles ab was keine Zahl is
begin
  if not (Key in ['0'..'9']) then Key:= #0;
end;

Die Behauptung ist ja wohl nicht Dein Ernst ? :shock: Das hier ist jetzt keine Frage, sondern eine Feststellung : es gibt in dem Fall zwei Fehlerquellen. Entweder wurde nicht Edit1 usw. benutzt sondern Edit2 usw. Die nächste wäre, Edit1 benutzt das Edit2KeyPress oder sonstwas.

Ich hab natürlich noch ',' und '-' eingefügt, sonst gingen ja weder negative Zahlen, noch Zahlen mit Komma. Und wie man es möglich macht, dass Zahlen gelöscht werden weiss ich auch nicht...

mfG

PS:
@3_of_8: Danke, ich werds versuchen... ;)

Klaus01 27. Nov 2006 17:32

Re: Editfelder für Buchstaben sperren
 
zum Löschen der Zeichen noch ein #8 in die Auflistung.

Grüße
Klaus

naudoc 27. Nov 2006 17:40

Re: Editfelder für Buchstaben sperren
 
Zitat:

Zitat von 3_of_8
Aaalso...

Delphi-Quellcode:
var a, b: Integer;
begin
  if not (trystrtoint(edit1.text, a) and trystrtoint(edit1.text, b)) then
    showmessage('Bitte geben sie gültige Zahlenwerte ein.')
  else
    showmessage(inttostr(a+b));
end;
Das bedeutet, dass die Zahlenwerte der Edits addiert werden, wenn sie gültig sind. Ansonsten wird eine Fehlermeldung ausgegeben.


CheckEdit rufst du am besten in OnChange auf und machst dann irgendne Spielerei wie das Edit rot färben, wenn es keinen gültigen Wert enthält.

Ich nehme an, dass vor das 2. trystrtoint auch noch ein Komma soll!?
Wenn ich es genau so mache, bekomme ich in dem PopUp immer die Zahl die in Edit1 steht, ist dort ein Buchstabe, dann Word 0 angezeigt. Die Fehlermeldung kommt nie...
Und: Geht das ganze auch mit 'real'-Zahlen? und mit...tofloat und floatto... ?

mfG

PS: ich probier jetzt deine 1. Lösung...


Edit: Danke Klaus!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:26 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