Re: (N)umerisches Feld akzeptiert keinen Punkt
Jetzt wäre es gut die relevanten Zeilen zu sehen, mit denen du die Berechnung versuchst. Zumindest an der Translate-Funktion kann es nicht liegen - vorausgesetzt, der DecimalSeparator ist korrekt gesetzt und nicht von dir verstellt worden. So habe ich getestet:
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.ButtonClick(Sender: TObject);
begin ShowMessage( FloatToStr( StrToFloat( Translate('123,456.78', '.,', DecimalSeparator) ) ) ); end; |
Re: (N)umerisches Feld akzeptiert keinen Punkt
Hallo marabu,
würdest Du bitte prüfen, was ich falsch mache:
Delphi-Quellcode:
Hab's ohne Erfolg auch mit Deiner Tax-Demo ausprobiert.
implementation
... function Translate(const s, sOld, sNew: String): String; var i, iPos, iLen: integer; begin SetLength(Result, Length(s)); Result := s; iLen := 0; for i := 1 to Length(s) do begin iPos := Pos(s[i], sOld); if iPos > Length(sNew) then Continue; Inc(iLen); if iPos > 0 then Result [iLen] := sNew[iPos] else Result[iLen] := s[i]; end; SetLength(Result, iLen); end; procedure TDemoForm.EditEKpreisExit(Sender: TObject); // keine DBGridAnzeige, Code funktioniert auch ohne var e: Extended var e: Extended; begin e := StrToFloat(Translate('123,456.78', '.,', DecimalSeparator)); end; oder procedure TDemoForm.EditEKpreisExit(Sender: TObject); // DBGridanzeige, nur mit ',' sonst Fehlermeldung begin QueryArtikel.FieldByName('EKpreis').AsFloat := StrToFloat(EditEKpreis.Text); end; Was bedeutet: '123,456.78'? Grüße Lombi |
Re: (N)umerisches Feld akzeptiert keinen Punkt
Hallo Lombi,
wenn ich deine Zeilen richtig interpretiere, dann möchtest du in deinem Control EditEKpreis eine Zahl mit Nachkommastellen im amerikanischen Display-Format (DecimalPoint ist Punkt, ThousandSeparator ist Komma) eingeben dürfen und diese Zahl soll beim Verlassen des Edit-Controls im passenden Datenfeld einer updatefähigen Query gespeichert werden, die du vorher in den korrekten Zustand (Edit oder Insert) versetzt hast. Hier die nötigen Änderungen:
Delphi-Quellcode:
Die Funktion Translate nimmt den Text aus dem Eingabe-Control entgegen und setzt jedes Vorkommen eines Zeichens aus dem zweiten Parameter in das korrespondierende Zeichen aus dem dritten Parameter um. Es wird also '.' in SysUtils.DecimalPoint umgesetzt. Für das Komma im zweiten Parameter gibt es kein entsprechendes Zeichen im dritten Parameter. Solche Zeichen werden dann einfach entfernt. Unix-Kenner sollten dieses Verhalten vom utility tr her kennen.
procedure TDemoForm.EditEKpreisExit(Sender: TObject);
var value: Extended; begin value := StrToFloat(Translate(EditEKpreis.Text, '.,', DecimalPoint)); with QueryArtikel do FieldByName('EKpreis').AsFloat := value; end; Zitat:
Grüße vom marabu |
Re: (N)umerisches Feld akzeptiert keinen Punkt
Hallo marabu,
Delphi-Quellcode:
'DecimalPoint' existiert leider unter D3 nicht, deshalb:
...
value := StrToFloat(Translate(EditEKpreis.Text, '.,', DecimalPoint)); ...
Delphi-Quellcode:
Zusätzlich habe ich in der Systemsteuerung die Ländereinstellung für
...
value := StrToFloat(Translate(EditEKpreis.Text, '.,', DecimalSeparator)); ... Zahlen verändert und den folgenden Code ergänzt:
Delphi-Quellcode:
Problem ist noch, wenn EditEKpreis, EditVknetto oder EditVKbrutto leer
procedure TDemoForm.EditEKpreisKeyPress(Sender: TObject; var Key: Char);
begin if Key = ',' then Key := '.'; end; ohne Eintrag bleiben, dann kommt die Meldung: '' kein gültiger Fließkommawert. Wie kann ich denn bei den Edits noch die Stellen vor und nach dem Komma festlegen, z.B. 6 Stellen vor und 4 nach dem , Herzlichen Dank nochmals für Deine Mühe! Grüße Lombi |
Re: (N)umerisches Feld akzeptiert keinen Punkt
Hallo Lombi,
gut, dass du nicht über meinen Schreibfehler gestolpert bist - nachdem ich die Variable vorher so oft richtig geschrieben hatte. Zitat:
Delphi-Quellcode:
Damit möchtest du wohl das Komma im Ziffernblock für die Eingabe des "Dezimal-Punkt" nutzbar machen. Willst du denn Kommazahlen im amerikanischen Format eingeben?
procedure TDemoForm.EditEKpreisKeyPress(Sender: TObject; var Key: Char);
begin if Key = ',' then Key := '.'; end; Zitat:
Zitat:
Freundliche Grüße marabu |
Re: (N)umerisches Feld akzeptiert keinen Punkt
Guten Tag marabu,
gestern habe ich den ganzen Nachmittag damit verbracht, am Code rumzubasteln. Ich kann in EditEKpreis und EditVKnetto Beträge mit '.' eingeben, aber es wird keine MwSt in EditVKbrutto errechnet (nur mit ',' aus der Systemeinstellung) und weil dieses Feld leer bleibt, kommt es zur Fehlermeldung. Auf der Form Artikel habe ich die relevanten Felder EditEKpreis, EditVKnetto und EditVKbrutto. Während der Laufzeit sollen die Preise eingetragen werden, bis zu 6 Stellen vor und 4 Stellen nach dem Dezimalzeichen generell als '.', nicht ','. 123456.0000 100.0000 Wird in EditVKnetto z.B. 100. eingetragen, dann sollen die 0000 automatisch ergänzt werden und der Bruttobetrag in EditVKbrutto mit 116.000 stehen. Es kann auch vorkommen, dass die Fehler einmal leer gespeichert werden müssen. Kannst Du mir bitte helfen? Viele Grüße Lombi |
Re: (N)umerisches Feld akzeptiert keinen Punkt
Könntest Du mir bitte noch mitteilen, ob sich der Dezimalpunkt im OnCreate der Form unveränderlich in EditEKpreis usw. platzieren ließe?
(xxxxxx.xxxx) Gruß Lombi |
Re: (N)umerisches Feld akzeptiert keinen Punkt
Lombi, ich arbeite gerade die Tax-Demo um.
Bis später marabu |
Re: (N)umerisches Feld akzeptiert keinen Punkt
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Lombi,
ich weiß nicht ob du eine konkrete Anwendung im Sinn hast oder ob das alles nur Übungen sind. Wenn du die Bedienung deines GUI-Programms auf englische Eingaben umstellen möchtest, dann schau dir die Demo im Anhang an. Sie zeigt dir, wie du Benutzereinstellungen auf Programmebene vornehmen kannst und dich dabei vor einer ungewollten Aktualisierung der Einstellungen schützt. Nur wenn du englische und deutsche Formate nebeneinander verarbeiten willst nimmst du Translate() und ähnliche Routinen, weil du dich für ein einziges locale setting entscheiden wirst und nicht für jede Konvertierung vom und ins Displayformat die Ländereinstellungen umschalten willst. Ich hoffe du kannst die Demo übersetzen - unter D7 funktioniert alles wie es soll, D3 habe ich leider nicht installiert. Freundliche Grüße marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz