Einzelnen Beitrag anzeigen

Oniessen

Registriert seit: 17. Feb 2010
18 Beiträge
 
#10

AW: Float und Integer in TDBGrid validieren

  Alt 7. Mär 2018, 10:08
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
  Mit Zitat antworten Zitat