Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Geldbeträge in Editboxen (https://www.delphipraxis.net/136144-geldbetraege-editboxen.html)

mannewolff 24. Jun 2009 10:54


Geldbeträge in Editboxen
 
Moin.

Ich möchte einen Benutzer beliebige Geldbeträge in einer Eingabezeile eingeben lassen z.B. 20,00, 21987,40. Wenn ich es richtig sehe, kann ich einem Maskedit nur statische Masken anlegen z.B. _____,__ (5 vor 2 hinterm Komma). Wie macht ihr das ?

-manne

BAMatze 24. Jun 2009 11:02

Re: Geldbeträge in Editboxen
 
du könntest ihn erstmal frei alles eingeben lassen und dann beim OnKeyDown des Edits die Überprüfung machen, ob es sich insgesamt um eine Zahl handelt, die eingegeben wurde und wenn dies der Fall ist mit Format den Text des Edits editieren.

Delphi-Quellcode:
Edit.Text := Format('%0.2f', [Geldbetrag]);
Ist nur schnell aus dem Kopf aufgeschrieben.

MfG
BAMatze

Edit1: Hier ein Beitrag, wo sowas ausführlich diskutiert wird. Hoffe hilft dir.

Mithrandir 24. Jun 2009 11:02

Re: Geldbeträge in Editboxen
 
Bei Delphi-Referenz durchsuchenFormat gibt es das Argument "m":

Zitat:

m
Währung. Das Argument muss ein Gleitkommawert sein. Der Wert wird in einen String umgewandelt, der einen Währungsbetrag darstellt. Die Steuerung der Konvertierung erfolgt mithilfe der globalen Variablen CurrencyString, CurrencyFormat, NegCurrFormat, ThousandSeparator, DecimalSeparator und CurrencyDecimals oder deren Entsprechungen in einer TFormatSettings-Datenstruktur. Enthält der Format-String einen Genauigkeitsbezeichner, setzt dieser den Wert in der globalen Variablen CurrencyDecimals bzw. in deren TFormatSettings-Entsprechung außer Kraft.
Dann müsstest du allerdings nach jedem Tastendruck den Wert auslesen, in einen Float-Wert umwandeln, über Format in einen String wandeln und wieder ins Edit schreiben. Ob das sinnvoll ist, sei mal dahingestellt.

Vielleicht geht es aber auch einfacher...

//Edit: @BAMatze: Muss aber nicht, wenn du "f" verwendest, der Wert ein Floatwert sein?

BAMatze 24. Jun 2009 11:09

Re: Geldbeträge in Editboxen
 
naja Geldbetrag steht für mich als ein Platzhalter, der natürlich Typ double/ float haben sollte. Also genauer müsste man dann den eingegebenen Edit.Text -> Floatzahl (Geldbetrag: double) umwandeln (also mit strtofloat) und dann mit Format wieder auf Edit.Text schreiben. So war das gemeint oder meintest du einen anderen Sachverhalt @Daniel G?

Mithrandir 24. Jun 2009 11:10

Re: Geldbeträge in Editboxen
 
Nope, genau das meinte ich. ;)

Satty67 24. Jun 2009 11:23

Re: Geldbeträge in Editboxen
 
Eine neue Zuweisung an Edit.Text setzt aber den Cursor zurück. Wäre also für Prüfung nach der Eingabe OK.

Für die Prüfung bei der Eingabe hatte ich für ein Gewichtsfeld auch mal was gebastelt:
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
const
  EditKeys = #13#8#9;
  Ciphers = '0123456789';
  MaxFrac = 2;
var
  i : Integer;
  aText : String;
begin
  aText := TEdit(Sender).Text;
  i := Pos(DecimalSeparator, aText);
  if i > 0 then
    if (Length(aText) -i) < MaxFrac then
      aText := Ciphers + Editkeys
    else
      aText := EditKeys
  else
    aText := Ciphers + EditKeys + DecimalSeparator;
  if Pos(Key, aText) <= 0 then Key := #0
end;
€: Für Währung müsste man noch das Minus-Zeichen in Ciphers aufnehmen und eigentlich auch auf 1x vorhanden Testen (war bei Gewicht aber nicht nötig)

Also so in etwa:
Delphi-Quellcode:
procedure SetValidFloatKey(var aKey : Char; const CurrText : String; OnlyAbs : Boolean; MaxFrac : Integer = 2);
const
  EditKeys = #13#8#9;
  Ciphers = '-0123456789';
var
  i : Integer;
  aText : String;
begin
  aText := CurrText;
  if (aKey = '-') and ((Length(aText) > 0) or (OnlyAbs)) then
    aKey := #0
  else
    i := Pos(DecimalSeparator, aText);
    if i > 0 then
      if (Length(aText) -i) < MaxFrac then
        aText := Ciphers + Editkeys
      else
        aText := EditKeys
    else
      aText := Ciphers + EditKeys + DecimalSeparator;
    if Pos(aKey, aText) <= 0 then aKey := #0
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  SetValidFloatKey(Key, TEdit(Sender).Text, False, 2);
end;
€: Universeller gestaltet.

Ein Schönheitsfehler hat es noch... Minus wird nur bei leerem Edit erlaubt. Da müsste man nachbessern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 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