Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 2 Nachkommastellen (https://www.delphipraxis.net/150132-2-nachkommastellen.html)

Ouou 8. Apr 2010 09:50


2 Nachkommastellen
 
Hallo Delphianer,

ich habe hier ein kleines problem und zwar habe benötige ich in meinen Edits 2 Nachkommastellen.

Hier habe ich mal einen Quellcode wie es bei mir aussieht bis jetzt.

Delphi-Quellcode:
for i := 1 to 12 do
  begin
    ergebnis := ergebnis + FloatToStrF(TEdit(FindComponent('Edit' + IntToStr(i))).Text, ffFixed, 8, 2);
  end;
Müsste eigentlich die richtige Funktion sein...

Kann jemand helfen?

MFG

[edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit]

mkinzler 8. Apr 2010 09:51

Re: 2 nach Kommastellen
 
Ich würde erst das Ergebnis formatieren

Teekeks 8. Apr 2010 09:52

Re: 2 nach Kommastellen
 
was ist daran deiner Meinung nach falsch?
Was kommt bei raus/ was bekommst du für eine Fehlermeldung?

Deep-Sea 8. Apr 2010 09:56

Re: 2 nach Kommastellen
 
Zitat:

Zitat von Ouou
Delphi-Quellcode:
for i := 1 to 12 do
  begin
    ergebnis := ergebnis + FloatToStrF(TEdit(FindComponent('Edit' + IntToStr(i))).Text, ffFixed, 8, 2);
  end;

FloatToStr wandelt einen Float-Wert in einen String um - logisch. Aber du gibst ihm mit TEdit.Text einen String rein, anstatt einer Zahl. Wenn ergebnis eine Float-Variable ist, müsstest du wohl eher StrToFloat nutzen.

Ouou 8. Apr 2010 10:16

Re: 2 Nachkommastellen
 
Wenn ich es mit StrToFloat mache sind es zu viele parameter...

Delphi-Quellcode:
for i := 1 to 12 do
  begin
    ergebnis := ergebnis + StrToFloat(TEdit(FindComponent('Edit' + IntToStr(i))).Text, ffFixed, 8, 2);
  end;
Sry mein Fehler ich poste mal den ganzen Quellcode von der procedure.

Delphi-Quellcode:
procedure TfrmKostenaufstellung.Edit1Change(Sender: TObject);

var
  ergebnis: Real;
  i: integer;
begin
  ergebnis := 0;

  for i := 1 to 12 do
  begin
    ergebnis := ergebnis + StrToFloat(TEdit(FindComponent('Edit' + IntToStr(i))).Text, ffFixed, 8, 2);
  end;
  Edit1201.Text := FloatToStrF(ergebnis, ffFixed, 8, 2);
begin
  ergebnis :=0;

  for i := 1201 to 1206 do
  begin
    ergebnis := ergebnis + StrToFloatDef(TEdit(FindComponent('Edit' + IntToStr(i))).Text,0);
  end;
  prodLK.Text := FloatToStrF(ergebnis, ffFixed, 8,2);
end;
end;

DeddyH 8. Apr 2010 10:21

Re: 2 Nachkommastellen
 
Delphi-Quellcode:
ergebnis := ergebnis + StrToFloat(TEdit(FindComponent('Edit' + IntToStr(i))).Text);
BTW:
Zitat:

Delphi-Quellcode:
Edit1201.Text

:shock: Da steigst Du noch durch?

himitsu 8. Apr 2010 10:23

Re: 2 Nachkommastellen
 
Zitat:

Wenn ich es mit StrToFloat mache sind es zu viele parameter...
Dann wäre es gut, wenn du dir mal ansiehst, was Delphi-Referenz durchsuchenStrToFloat für Parameter möchte?

Zitat:

Da steigst Du noch durch?
Es muß ja nicht heißen, daß alle "Nummern" verwendet sind (hoffe ich mal),
sondern daß er sich sozusagen Zifferngruppen erstellt hat.

z.B. 1. Zeile Edit101 bis Edit106 und eben 12. Zeile Edit1201 bis Edit1206 :zwinker:

Mit über 1200 Edits und noch anderen Kompunenten wäre die Form ja etwas "überfüllt" :roll:

Ouou 8. Apr 2010 10:31

Re: 2 Nachkommastellen
 
jap da steig ich noch durch... :)
ich habs genauso gemacht wie himitsu es geschrieben hat...

bei diesem beispiel habe ich die zifferngruppe 1-12 (edits). und den edits will ich 2 nach kommastellen hinzufügen.

Ouou 8. Apr 2010 10:39

Re: 2 Nachkommastellen
 
wenn ich es mit

Delphi-Quellcode:
ergebnis := ergebnis + StrToFloat(TEdit(FindComponent('Edit' + IntToStr(i))).Text);
mache, kommt eine debuger-exception das im projekt eine exception der klasse EConvertError mit der Meldung ' " ist kein gültiger Gleitkommawert' aufgetreten.

DeddyH 8. Apr 2010 10:41

Re: 2 Nachkommastellen
 
Dann nimm halt TryStrToFloat oder StrToFloatDef.

mkinzler 8. Apr 2010 10:42

Re: 2 Nachkommastellen
 
Verwende besser StrToFloatDef()

himitsu 8. Apr 2010 10:42

Re: 2 Nachkommastellen
 
Bei Ergänzungen editiere bitte zukünftig deinen letzen Beitrag,
wenn in der Zwischenzeit noch keiner geantwortet hat. (darum darf man dseine Beiträge auch einen Tag lang editieren, ohne "puschen" zu müssen)

Zur Fehlermeldung: Es muß eine gültige Zahl im Edit stehen und "Nichts" (ein Leerstring) ist keine Zahl.

Ouou 8. Apr 2010 11:02

Re: 2 Nachkommastellen
 
jetzt habe ich es mit StrToFloatDef gemacht aber es werden mir keine Kommastellen angezeigt.

Delphi-Quellcode:
for i := 1 to 12 do
  begin
    ergebnis := ergebnis + StrToFloatDef(TEdit(FindComponent('Edit' + IntToStr(i))).Text,0);
  end;

Codewalker 8. Apr 2010 11:03

Re: 2 Nachkommastellen
 
Was auch gut geht, ist die Format-Funktion aus den SysUtils:
Delphi-Quellcode:
var
 f: Double;
begin
 f := 3/7;
Edit1.Text := Format('%.2f',[f]);

DeddyH 8. Apr 2010 11:04

Re: 2 Nachkommastellen
 
Zitat:

Zitat von Ouou
jetzt habe ich es mit StrToFloatDef gemacht aber es werden mir keine Kommastellen angezeigt.

Delphi-Quellcode:
for i := 1 to 12 do
  begin
    ergebnis := ergebnis + StrToFloatDef(TEdit(FindComponent('Edit' + IntToStr(i))).Text,0);
  end;

Der Code hat aber mit dem "Fehler" nichts zu tun.

Ouou 8. Apr 2010 12:22

Re: 2 Nachkommastellen
 
Zitat:

Ouou hat folgendes geschrieben:
jetzt habe ich es mit StrToFloatDef gemacht aber es werden mir keine Kommastellen angezeigt.

Delphi-Quellcode: markieren
for i := 1 to 12 do
begin
ergebnis := ergebnis + StrToFloatDef(TEdit(FindComponent('Edit' + IntToStr(i))).Text,0);
end;
das ist richtig deddyh. ich bekomme es einfach nicht in das ich in meinen edits (1-12) zwei nachkommastellen stehen habe...
man muss es doch in dem vorhanden quellcode anpassen können :wall:

DeddyH 8. Apr 2010 12:26

Re: 2 Nachkommastellen
 
Du musst die Ausgabe anpassen.
Delphi-Quellcode:
Edit1201.Text := Format('%.2f',[ergebnis]);

Klaus01 8. Apr 2010 12:30

Re: 2 Nachkommastellen
 
Delphi-Quellcode:
  for i := 1 to 12 do
  begin
    ergebnis := ergebnis + StrToFloat(TEdit(FindComponent('Edit' + IntToStr(i))).Text); // um hier Rundungsfehler zu vermeiden
  end;
  Edit1201.Text := // wie Detlef beschrieben hat
begin
  ergebnis :=0;
Grüße
Klaus

Ouou 8. Apr 2010 12:32

Re: 2 Nachkommastellen
 
Zitat:

Edit1201.Text := Format('%.2f',[ergebnis]);

die aussage ist ja schon angepasst. das ergebnis wird ja mit zwei nachkommastellen angezeigt nur die beträge die man in den jeweiligen edits schreibt nicht.
ich will die edits bei mir sind es wie hier:

Delphi-Quellcode:
for i := 1 to 12 do
  begin
    ergebnis := ergebnis + StrToFloatDef(TEdit(FindComponent('Edit' + IntToStr(i))).Text,0);
  end;
12 edits. jedes edit soll zwei nachkommastellen besitzen.

Hier mal die ganze procedure vielleicht wirds dann klarer:

Delphi-Quellcode:
var
  ergebnis: Real;
  i: integer;
begin
  ergebnis := 0;

  for i := 1 to 12 do
  begin
    ergebnis := ergebnis + StrToFloatDef(TEdit(FindComponent('Edit' + IntToStr(i))).Text,0);
  end;
  Edit1201.Text := FloatToStrF(ergebnis, ffFixed, 8, 2);
begin
  ergebnis :=0;

  for i := 1201 to 1206 do
  begin
    ergebnis := ergebnis + StrToFloatDef(TEdit(FindComponent('Edit' + IntToStr(i))).Text,0);
  end;
  prodLK.Text := FloatToStrF(ergebnis, ffFixed, 8,2);
end;
end;

DeddyH 8. Apr 2010 12:38

Re: 2 Nachkommastellen
 
Dann musst Du eben jedes Edit anpassen. Du zeigst uns die ganze Zeit das Auslesen der Werte, was aber keinen Bezug zur Formatierung der Edits hat.

Klaus01 8. Apr 2010 12:40

Re: 2 Nachkommastellen
 
.. kannst Du anstelle der TEdit TMaskEdit nehmen ?

Grüße
Klaus

Deep-Sea 8. Apr 2010 12:44

Re: 2 Nachkommastellen
 
Zitat:

Zitat von Klaus01
.. kannst Du anstelle der TEdit TMaskEdit nehmen ?

Oder TJvSpinEdit - auch eine Option :wink:

Ouou 8. Apr 2010 12:48

Re: 2 Nachkommastellen
 
negative. Leider nicht... Wie pass ich dann die ganzen Edits an?

Indem ich jedes edit so anpasse?:

Delphi-Quellcode:
Edit1.text := FloatToStrF (Edit1.text,ffFixed,8,2)

dominikkv 8. Apr 2010 13:00

Re: 2 Nachkommastellen
 
Ouou, bitte stelle das nächste Mal deine Frage präziser! Es hat 15 Beiträge gebraucht, bis die eigentliche Frage klar war. Deine Codeschnipsel hatten nichts mit deinem Problem zu tun und waren eher irreführend. Einfach mal vor dem Fragestellen überlegen, was dein Ziel ist, und wie man das den anderen am besten verklickern kann :zwinker:

So, nun zu deinem Problem: es gibt verschiedene Ansätze, wie man das lösen kann:
1) Du verwendest, wie weiter oben erwähnt, entsprechende Komponenten, die eine Falscheingabe verhindern.
2) Du überprüfst selbst, ob eine Falscheingabe eingegeben wurde. Das kannst du während der Eingabe machen (und dort dann zB die Eingabe verhindern) oder bei einer Aktion (zB wenn der Benutzer den Addieren-Button klickt).

Ich hab mir mal was kurzes überlegt:
Delphi-Quellcode:
procedure TfrmMain.EditChange(Sender: TObject);
var
  Temp: Double;
begin
  with (Sender as TEdit) do
    if TryStrToFloat(Text, Temp) then
      begin
        Text := Format('%f', [Temp]);
        Font.Color := clBlack;
      end else
        Font.Color := clRed;
end;
Ist zwar noch nicht ganz komfortabel (Nachkommastellen machen Probleme), aber immerhin ein Ansatz :mrgreen:


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