EditFeld: nur Zahlen zulassen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Johanna
Beiträge: 5
Registriert: Mo 5. Feb 2007, 18:52
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Schweiz

EditFeld: nur Zahlen zulassen

Beitrag von Johanna »

Hallo zusammen

Ich habe ein Rechenübungsprogramm mit Delphi gemacht. Da dies auf Mac nicht läuft, will ich es nun mit Lazarus übersetzen. Es läuft nun alles....
.... ausser, dass bei den EditFeldern auch Buchstaben und Sonderzeichen eingegeben werden können, aber nur Zahlen zugelassen sind.

Kann mir da jemand weiterhelfen?
Ich habe mal den Delphi-Code kopiert, aber damit funktioniert es irgendwie nicht: :(

Code: Alles auswählen

procedure TForm3.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if not ((key in [0..9]) or (key = 8) or ((Shift = [ssAlt]) and (key = 115)) or ((Shift = [ssCtrl, ssAlt]) and (key = 12))) then
  begin
  key := $0;
  //MessageBeep(0);
  end
end;
 
procedure TForm3.FormKeyPress(Sender: TObject; var Key: char);
begin 
 if not (key in [#48..#57, #8, #96..#105]) then
  begin
  key := #0;
  //MessageBeep(0);
  end;
end;


Ich möchte einfach, dass nur noch Zahlen, Kombinationen wie "Alt+F4" und "Ctrl+Alt+Delete" und so weiter zugelassen sind.

Gruss
Johanna

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

mit diesem code sollte es gehen:

Code: Alles auswählen

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
begin
  if key in [chr(ord('0'))..chr(ord('9')),chr(ord(8)),chr(ord(115))] then begin
  end
  else
    key:=#0;
end;


Alle deine Tasten gehen zwar noch nicht aber du kannst jetzt nur noch zahlen und die lösch taste drücken !
aller anderen Tasten werden nicht beachtet !
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

oder so:

Code: Alles auswählen

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
begin
  if key in [chr(ord('A'))..chr(ord('Z')),chr(ord('"')),chr(ord('-')),chr(ord('*')),chr(ord('$')),chr(ord('%')),chr(ord('&')),chr(ord('/')),chr(ord('(')),chr(ord(')'))] then begin
    key:=#0;
  end
end;
 
bei dieser variante musst du selbst angeben welche tasten nicht beachtet werden sollen !
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Das muss man aber nicht so kompliziert schreiben Pluto:
if key in ['0'..'9',#8,#115] then begin
kommt auf's selber raus wie
if key in [chr(ord('0'))..chr(ord('9')),chr(ord(8)),chr(ord(115))] then begin

Johanna
Beiträge: 5
Registriert: Mo 5. Feb 2007, 18:52
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Schweiz

Beitrag von Johanna »

hallo pluto

danke für deine schnelle antwort.
leider hat das bei mir nicht so ganz funktioniert :cry:

kann es daran liegen, dass ich es versuche auf das ganze formular anzuwenden? ich habe eben 20 editfelder (per array verwaltet) und wenn ich das für jedes feld einzeln schreiben müsste...

aber das mit dem "chr(ord('1')) könnte mich weiterbringen...

gruss
Johanna

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Johanna hat geschrieben: wenn ich das für jedes feld einzeln schreiben müsste...


Du kannst doch überall den gleichen Eventhandler einsetzen.

Ausserdem könntest du auch TMaskEdit verwenden.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

@Johanna
irgenwie verstehe ich dein Problem nicht so ganz: du hast mehrer TEdit Komponenten, richtig ? und in allen TEdit Komponenten, möchtes du nur zahlen und bestimmte Tasten zu lösen aber keine a..z und sowas halt, richtig ?

Eigentlich spielt es überhaupt keine rolle bei wie vielen TEdit du das machen möchtes ! du musst einfach immer nur den gleichen Event benutzen !
MFG
Michael Springwald

Johanna
Beiträge: 5
Registriert: Mo 5. Feb 2007, 18:52
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Schweiz

Beitrag von Johanna »

@theo
danke für die antwort. so hatte ich es - glaube ich - vorher. also bin ich doch nicht weiter gekommen...

@michael
ja das hast du richtig verstanden. ich habe viele rechnungen und für jede rechnungen ein TEdit um das ergebnis reinzuschreiben.
die einzige methode, die mir in den sinn kommt ist für jedes TEdit eine prozedur zu schreiben.
hab noch nie was von eventhandler gehört. hab ich da was wichtiges verpasst??? :oops:

gruss
Johanna

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Jedes Tedit komponente haben ja alle die gleichen Ereignisse wie onKeyPress z.b. jetzt musst du nur noch alle Komponenten markieren anschließend ein Ereignis zu weisen... dann greifen alle Komponenten auf das gleiche Ereignis zurück !

Das kannst du ja mal testen:
schreibe zuzälich in ein event(egal welches) folgendes rein:
ShowMessage(TWinControl(sender).name)
und komplierer dein Projekt... jetzt drück mal eine zahl und aktiviere Vorher ein TEdit komponente

Edit:
mit einem Event handler meint @theo einfach nur ein ereignis was ausgelöst wird wenn was bestimmtes passiert !
z.b. onClick währe ein event handler
(glaube ich aufjedenfall)
MFG
Michael Springwald

Johanna
Beiträge: 5
Registriert: Mo 5. Feb 2007, 18:52
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Schweiz

Beitrag von Johanna »

hallo michael

hab das mal ausprobiert, und dieses nur-zahlen-zulassen mit drei Edit-Feldern getestet. das hat auch funktioniert. :D
mein problem ist nun, dass meine Edit-Felder erst zur laufzeit und in einem array generiert werden, deshalb kann ich sie nicht einfach so markieren und dann das ereignis einfügen.

weisst zu zufälligerweise, wie ich da vorgehen müsste? irgendwie muss man das doch auch im quelltext vermerken können.

gruss
Johanna

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Johanna hat geschrieben:weisst zu zufälligerweise, wie ich da vorgehen müsste? irgendwie muss man das doch auch im quelltext vermerken können.


Jetzt stell dich nicht so an! ;-)

myEdit.OnKeyPress:=@Edit1KeyPress:

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

wobei ich das mit dem @ noch nicht so verstanden habe !
es gibt Ereignisse da brauche ich das nicht und es gibt wieder welche da brauche ich es
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:wobei ich das mit dem @ noch nicht so verstanden habe !
es gibt Ereignisse da brauche ich das nicht und es gibt wieder welche da brauche ich es


Welche denn?

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ich kann dir jetzt kein beispiel geben !
Wenn es mir wieder auffält kan nich es ja posten !
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Es kommt natürlich drauf an, ob du im Delphi-Kompatibilitätsmodus kompilierst.
{$mode delphi}
Dann brauchste das @ nicht.

Antworten