Aloha he, verehrte Freunde...
heute habe ich ein gaenzlich anderes Problem:
Ich habe ein (oder mehrere) TDBEdit- Feld(er), in dem ich ausschließlich Fließkommazahlen von einer festen Länge drin haben mag. Mit einer maximalen Ziffernzahl von 3... wobei der Nachkommastellenanteil bei exakt 1 liegt....
auf gut deutsch... ich mag nur Zahlen von 0.1 bis 99.9 eingeben können.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57:
| procedure TNakataForm.DataFieldExit(Sender: TObject); begin
if Sender is TDBEdit then begin with TDBEdit(Sender) do begin
if TTable(DataSource.DataSet) = TempTable then begin with TTable(DataSource.DataSet) do begin if Modified then begin
if (Text = '') or (Text = '0') then begin Edit; FieldByName(DataField).Clear; end else begin if (RoundEx(FieldByName(DataField).AsFloat, 1) > 99.9) or (RoundEx(FieldByName(DataField).AsFloat, 1) < 0.1) and (not FieldByName(DataField).IsNull) then begin MessageDlg( 'Der eingegebene Wert liegt ausserhalb der' + #13#10 + 'gültigen Abmessungen. [0.1 - 99.9 mm]', mtError, [mbOK], -1 );
Refresh; ActiveControl := TDBEdit(Sender); exit; end; end; end; end; end; end; end;
with TTable(DataSource.DataSet) do begin if State in [dsEdit, dsInsert] then Post; end; end; |
Das ganze hab ich soweit auch hinbekommen... ABER... da ich Feheleingaben vermeiden mag, ist das nicht der einzige Schritt:
Ein Einfügen via "Strg+V" fügt auch Buchstaben und beliebige Texte ein... genauso wird keine Rücksicht mehr auf die von mir maximal vorgegebene Länge genommen... aber auch das habe ich hinbekommen... die Tastenkombination "Strg-V" liefert in dem Event-Handler OnKeyPress einen Wert von #22 ... und somit kann ich das Ereignis abfangen und hier beschränken, wie viele Zeichen maximal eingefügt werden können... und das Texte herausgefiltert werden...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99:
| procedure TNakataForm.DataFieldKeyPress(Sender: TObject; var Key: Char); var t : double; i : integer; s : string; begin if (Key in [#48..#57]) and (TDBEdit(Sender).SelLength = 0) then begin if ( (Pos(',', TDBEdit(Sender).Text) > 0) and (Pos(',', TDBEdit(Sender).Text) < Length(TDBEdit(Sender).Text)) ) or ( (Pos(',', TDBEdit(Sender).Text) = 0) and (Length(TDBEdit(Sender).Text) >= 2) ) then Key := #0; end else if (Key = Chr(22)) then begin Val(StringReplace(Clipboard.AsText, ',', '.', []), t, i);
if i <> 0 then Key := #0 else begin s := StringReplace(Clipboard.AsText, '.', ',', []);
if TDBEdit(Sender).SelLength <> Length(TDBEdit(Sender).Text) then begin
with TDBEdit(Sender) do begin s := copy(Text, 0, SelStart) + Clipboard.AsText + copy(Text, SelStart + SelLength + 1, Length(Text) - (SelStart + SelLength)); end; end;
Val(StringReplace(s, ',', '.', []), t, i); if (RoundEx(t, 1) > 99.9) or (RoundEx(t, 1) < 0.1) then begin TDBEdit(Sender).Text := s; MessageDlg( 'Der eingegebene Wert liegt ausserhalb der' + #13#10 + 'gültigen Abmessungen. [0.1 - 99.9 mm]', mtError, [mbOK], -1 );
TTable(TDBEdit(Sender).DataSource.DataSet).Refresh; end else begin TDBEdit(Sender).Text := FloatToStr(RoundEx(t, 1)); with TTable(TDBEdit(Sender).DataSource.DataSet) do begin if not (State in [dsEdit, dsInsert]) then Edit;
FieldByName(TDBEdit(Sender).DataField).AsFloat := t; Post; end; end; Key := #0; end; end; end; |
so... nun hab ich das problem gelöst... aaaber: etwas funktioniert immer noch: rechtsklick auf das eingabefeld... und dann Einfügen... da ich nicht die gesamte Funktionalität des Edit- Menüs neu schreiben mag... würde ich es gerne behalten...
gibt es irgendeine Windows Message, die unmittelbar vor dem Einfügen ausgesendet wird ? Meine Ideee ist einfach, dass ich nicht den Wert, der in der Zwischenablage liegt verändere... und dass ich ihn nur dann einfüge, wenn es möglich ist...
hat jemand vielleicht noch eine alternative parat ? oder sonst eine idee ?
vielen Dank
uruz
p.s.: die Funktion RoundEx rundet einen Fließkommawert auf die im zweiten Parameter übergebene Nachkommastelle