Edit Eingabe überprüfen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Edit Eingabe überprüfen

Beitrag von Andromeda »

Hallo,

in einem Editfeld soll nur die Eingabe von Ziffer, Komma und Backspace möglich sein. Deshalb habe ich in das KeyPress-Ereignis den folgenden Code geschrieben:

Code: Alles auswählen

 
procedure TFormHaupt.Edit1KeyPress(Sender: TObject; var Key: char);
begin
  if not (Key in [#8, #13,'0'..'9', ',']) then // #8=BACKSPACE #13=RETURN
    Key := #0;  // erlaubt nur die Eingabe von Zahlen, BACKSPACE, RETURN und ,
end;
 
Das funktioniert auch wie gewünscht, aber ich möchte zusätzlich auch noch, dass man mit Strg+V die Zwischenablage einfügen kann. Wie muss ich denn dann den obigen Code ändern, damit das möglich ist?

Dass ich den eingefügten Text dann nochmal separat überprüfen muss, ist mir klar. Ich weiss nur nicht, welchen Code ich für Strg+V verwenden muss.

Vielen Dank für Eure Mühen

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Edit Eingabe überprüfen

Beitrag von Michl »

Andromeda hat geschrieben:aber ich möchte zusätzlich auch noch, dass man mit Strg+V die Zwischenablage einfügen kann. Wie muss ich denn dann den obigen Code ändern, damit das möglich ist?
Dazu bist du im falschen Event. Nutze doch OnKeyDown z.B.:

Code: Alles auswählen

uses ..., LCLType;
...
procedure TFormHaupt.Edit1KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  case Key of
    VK_0..VK_9, VK_RETURN, VK_BACK, VK_OEM_COMMA: Exit;
    VK_V: if Shift = [ssCtrl] then Exit; 
  end;
  Key := 0;
end; 
Wobei, wenn du Zahlen eingeben willst, würde sich auch ein Control, was für Zahleneingaben bestimmt ist, wie TMaskEdit, TSpinEdit oder TFloatSpinEdit anbieten.

[EDIT]
Mit Abfrage, ob sich ein Float in der Zwischenablage befindet, könnte die Lösung in etwa so aussehen:

Code: Alles auswählen

uses ..., LCLType, Clipbrd;
...
procedure TFormHaupt.Edit1KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
 
  function CanInsertClipboard: Boolean;
  var
    d: double;
  begin
    Result := False;
    if Clipboard.HasFormat(CF_TEXT) and TryStrToFloat(Clipboard.AsText, d) then begin
      Edit1.Text := '';
      Result := True;
    end;
  end;
 
begin
  if Shift = [] then
    case Key of
      VK_0..VK_9, VK_RETURN, VK_BACK, VK_OEM_COMMA, VK_DELETE, VK_TAB: Exit;  //Del, Tab noch eingefügt
    end;
  if Shift = [ssCtrl] then
    case Key of
      VK_V: if CanInsertClipboard then Exit;
      VK_A, VK_C: Exit;  //Markieren, Kopieren
    end;
  Key := 0;
end;  
Zuletzt geändert von Michl am Fr 4. Sep 2015, 12:55, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Edit Eingabe überprüfen

Beitrag von Andromeda »

tausend Dank,

das war eine fundierte Antwort. Du hast mir ja schon das halbe Programm geschrieben. Funktioniert wunderbar und den Code habe sogar ich durchschaut.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Edit Eingabe überprüfen

Beitrag von Michl »

Danke für die Blumen :) ,

zwei Hinweise noch, es gibt in anderen Ländern andere Dezimaltrenner (DecimalSeparator) und auch der Hinweis von wp_xyz ist evtl. nicht verkehrt: http://www.lazarusforum.de/viewtopic.php?p=79276#p79276

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
Swirl
Beiträge: 99
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 11 / Mint 22.1 / Lazarus 36 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: Edit Eingabe überprüfen

Beitrag von Swirl »

Noch'n Vorschlag

OnKeyPress...
if pos(Key, '0123456789,' + #8#22#24) = 0 then Key := #0;

#8 für Backspace, #22 für STRG-V und #24 für STRG-X, usw.

Gruß,
Swirl
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: Edit Eingabe überprüfen

Beitrag von SoE »

Cool, das muß ich mir merken...

Antworten