Hallo!
Hab den Fehler gefunden!
Vielen Dank für eure Hilfe!
Das Problem war, mit:
CellText:= (Sender as TDBGrid).SelectedColumn.Field.AsString;
Bekam ich immer nur den "alten", im Grid gespeicherten Wert/String zurück.
Damit funktioniert das natürlich nicht.
Mit Änderung auf:
CellText:= TStringCellEditor(MyGrid.Editor).Text;
Funktioniert es jetzt, da der wirkliche, aktualisierte "editor"-string zurück gegeben wird.
Die Case Version habe ich mal ausprobiert, finde sie jedoch auch nicht wirklich Übersichtlicher.
mit If else if habe ich insgesamt 4 zeilen (3 wenn ich das 'and' der 2. Bedingung noch in eine zeile Packe oder 6 etwas anders formatiert)
Mit Case habe ich min. 6 Zeilen...
Dazu kommt noch, das Case konstanten erwartet und ich dann den MyDecSep auch irgendwie verpacken muss
Vom Grundsatz her gebe ich dir allerdings vollkommen Recht, das Case meist eleganter ist!!!!
(Und ich habe gar nicht mehr dran gedacht, das das ja auch mit Chars geht)
Hier also mal (m)eine Version, die funktioniert:
Delphi-Quellcode:
procedure TMyForm.MyDBGridKeyPress(Sender: TObject;
var Key: char);
var
CellText: Widestring;
selStart : integer;
cellRow, cellCol : integer;
MyGrid : TStringGrid;
MyDecSep : Char;
begin
// First some Typecasting to access the Cell Editor
MyGrid := TStringGrid(Sender
as TDBGrid);
// to avoid copy/paste - no multiple Chars
if TStringCellEditor(MyGrid.Editor).SelLength > 0
then
TStringCellEditor(MyGrid.Editor).SelText:= '
';
// get the system-Decimal-Separator ',' or '.'
MyDecSep := DefaultFormatSettings.DecimalSeparator;
cellRow:= MyGrid.Row;
cellCol:= MyGrid.Col;
// Typecast to access SelStart and actual typed Text
selStart:= TStringCellEditor(MyGrid.Editor).SelStart ;
CellText:= TStringCellEditor(MyGrid.Editor).Text;
// #8 = Backspace; #0 = empty key ;
if not (Key
in [#8, '
0'..'
9', '
-', MyDecSep])
then Key := #0
// '-' minus and decimal separator only once
else if ((Key = MyDecSep)
or (Key = '
-'))
and (Pos(Key, CellText) > 0)
then Key := #0
// '-' minus always first character
else if (Key = '
-')
and (selStart <> 0)
then Key := #0;
end;
---
Eine andere Sache noch:
Ich habe festgestellt, das leider die "OnEditingDone" Methode des TDBGrids nicht so funktioniert wie gedacht oder gehofft.
Es scheint, als würde sie erst aufgerufen, nachdem die Daten schon an die DataSource übergeben wurden.
Zumindest, wenn ich einfach nur eine " ShowMessage()" dort hinein setze, knallts bei Fehleingaben, bevor die Message überhaupt angezeigt wird
(bei korrekter Eingabe wird die Box angezeigt)
Könnte das ein Fehler der Implementierung sein oder doch Absicht?
Gruß, Oliver