Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Kleines Problem mit Platzhalter


FloXxX - Sa 04.12.10 22:55
Titel: Kleines Problem mit Platzhalter
Ich habe ein Problem, ich habe ein Programm geschrieben, welches automatisch den Ertrag bei verschiedenen Sachen ausrechnet.
Standardzahl ist 0, wenn ich jetzt eine Zahl eintrage und diese aber wieder rauslösche, was muss ich machen, dass da automatisch 0 steht und nicht nichts? Sonst kommt ein Fehler mit dem ungültigen Gleitkommawert

Qeulltext:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
unit URechner;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Telemarktlogo: TImage;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Beenden: TButton;
    Button1: TButton;
    PnlErgebnis: TPanel;
    Panel2: TPanel;
    Label8: TLabel;
    Label9: TLabel;
    procedure BeendenClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BeendenClick(Sender: TObject);
begin
close
end;

procedure TForm1.Button1Click(Sender: TObject);
var a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r: real;
begin
a:= 0.65;
b:= 0.20;
c:= 0.15;
d:= StrToFloat(Edit1.Text);
e:= StrToFloat(Edit2.Text);
f:= StrToFloat(Edit3.Text);
g:= StrToFloat(Edit4.Text);
h:= StrToFloat(Edit5.Text);
i:= StrToFloat(Edit6.Text);
j:= StrToFloat(Edit7.Text);
k:= d*(a+b+c);
l:= e*(a+b);
m:= f*(a+c);
n:= g*a;
o:= h*(b+c);
p:= i*b;
q:= j*c;
r:= k+l+m+n+o+p+q;
PnlErgebnis.caption:=FloatToStr(r);
end;

end.


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am So 05.12.2010 um 13:08


bummi - Sa 04.12.10 23:12

meinst Du sowas?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.AllEditsChange(Sender: TObject);
var
  d:Double;
begin
  if not TryStrToFloat(TEdit(Sender).Text,d) then
    begin
    TEdit(Sender).Text := '0';
    TEdit(Sender).Selectall;
    end;
end;


Korrigiert, nach Hinweis von Jaenicke
ergänzt: TEdit(Sender).Selectall;


jaenicke - So 05.12.10 00:08

Deine Variablen- und Komponentennamen machen das sicher sehr übersichtlich. Was meinst du wie lange du da noch weißt wofür welche Variable steht? :roll:

Gute Variablennamen sind eine der wichtigsten Voraussetzungen für übersichtlichen Quelltext.

Was das Setzen auf '0' angeht:
Wenn, dann müsste die Null dann auch markiert werden (SelectAll). Denn wenn man sonst anfängt zu tippen, hat man eine Null zu viel.

Besser ist aber gleich den Fehler abzufangen. Denn was, wenn jemand etwas eingibt, was keine Zahl ist, z.B. aus Versehen den Buchstaben o?

Delphi-Quelltext
 
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
{ ... }
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r: real;
begin
  a := 0.65;
  b := 0.20;
  c := 0.15;
  if TryStrToFloat(Edit1.Text, d) and TryStrToFloat(Edit2.Text, e)
    and TryStrToFloat(Edit3.Text, f) and TryStrToFloat(Edit4.Text, g)
    and TryStrToFloat(Edit5.Text, h) and TryStrToFloat(Edit6.Text, i)
    and TryStrToFloat(Edit7.Text, j) then
  begin
    k := d*(a+b+c);
    l := e*(a+b);
    m := f*(a+c);
    n := g*a;
    o := h*(b+c);
    p := i*b;
    q := j*c;
    r := k+l+m+n+o+p+q;
    PnlErgebnis.Caption := FloatToStr(r);
  end
  else
    PnlErgebnis.Caption := '<error>';
end;

end.


FloXxX - So 05.12.10 13:15

Irgendwie funktionieren beide Methoden nicht ohne Fehlermeldungen :(


jaenicke - So 05.12.10 13:16

Was kommt wo für eine Meldung?


FloXxX - So 05.12.10 15:25

[Fehler] UTelemarkt.pas(59): Es gibt keine überladene Version von 'TryStrToFloat', die man mit diesen Argumenten aufrufen kann
[Fehler] UTelemarkt.pas(59): Es gibt keine überladene Version von 'TryStrToFloat', die man mit diesen Argumenten aufrufen kann
[Fehler] UTelemarkt.pas(60): Es gibt keine überladene Version von 'TryStrToFloat', die man mit diesen Argumenten aufrufen kann
[Fehler] UTelemarkt.pas(60): Es gibt keine überladene Version von 'TryStrToFloat', die man mit diesen Argumenten aufrufen kann
[Fehler] UTelemarkt.pas(61): Es gibt keine überladene Version von 'TryStrToFloat', die man mit diesen Argumenten aufrufen kann
[Fehler] UTelemarkt.pas(61): Es gibt keine überladene Version von 'TryStrToFloat', die man mit diesen Argumenten aufrufen kann
[Fehler] UTelemarkt.pas(62): Es gibt keine überladene Version von 'TryStrToFloat', die man mit diesen Argumenten aufrufen kann
[Fataler Fehler] PTelemarkt.dpr(5): Verwendete Unit 'UTelemarkt.pas' kann nicht compiliert werden


jaenicke - So 05.12.10 15:27

Das liegt daran, dass du den generischen Typ Real benutzt. Warum?

Wenn du einen der normalen Typen benutzt und damit selbst schaust, welche Genauigkeit du brauchst (statt zu sagen: nimm mal irgendeinen Typ), klappt das auch. Nimm einfach Double, Single, ... ganz was du willst.

Und wenn du geschaut hättest, was denn die Parameter richtig wären, hättest du das auch selbst gemerkt... :roll:


ALF - So 05.12.10 15:31

Hi, Fehlen nicht auch die Klammern?


Delphi-Quelltext
1:
if (TryStrToFloat(Edit1.Text, d)) and (TryStrToFloat(Edit2.Text, e)).....     then                    

Gruss ALf


jaenicke - So 05.12.10 15:45

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Hi, Fehlen nicht auch die Klammern?
Wozu sollen die gut sein? :gruebel:
Die Parameter gehören auch so zur Funktion, auch ohne die zusätzlichen Klammern. ;-)

Im Gegenteil, teilweise kommt der Delphicompiler (zumindest in älteren Versionen) mit genau solchen überflüssigen Klammern durcheinander.


FloXxX - So 05.12.10 16:43

Ich habe halt bis jetzt keine Ahnung von Delphi, ich habe letzte Informatik Stunde das erste mal Delphi gehabt, alles was wir gemach thaben war mit integer und IntToStr (also wir hatten nicht mal das float) 2 zahlen addiert

ich bin ein völliger anfänger


jaenicke - So 05.12.10 16:43

Aber nachdem du das ersetzt hast, klappt es ja, oder?


ALF - So 05.12.10 18:33

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wozu sollen die gut sein? :gruebel:

Hast recht. :oops:
Wahrscheinlich nur wenn man mit '>,<,=' vergleichen will und dann noch 'and, or, xor' verwendet.

Gruss ALf


FloXxX - Mo 06.12.10 21:40

noch nicht probiert, sorry

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

ist es möglich dass es irgendwie dann so aussieht

if d:=numeric = false then d:=0
und dann wenn es keine nummer ist es automatisch als 0 gesehen wird


platzwart - Mo 06.12.10 22:55

Es wurde doch bereits "TryStrToFloat" genannt?!?


jaenicke - Mo 06.12.10 23:01

user profile iconFloXxX hat folgendes geschrieben Zum zitierten Posting springen:
und dann wenn es keine nummer ist es automatisch als 0 gesehen wird
Was hast du denn dagegen, den Fehler komplett abzufangen statt falsch (mit 0) zu rechnen?

Aber wenn du das unbedingt möchtest: siehe StrToIntDef...


FloXxX - Mo 06.12.10 23:02

Es kommt aber dauernd irgendwas von es gibt keine überladene version von trystrtofloat blaa blaa


platzwart - Mo 06.12.10 23:12

Kannst du das bissl mit Quelltext untermauern?


jaenicke - Mo 06.12.10 23:28

user profile iconFloXxX hat folgendes geschrieben Zum zitierten Posting springen:
Es kommt aber dauernd irgendwas von es gibt keine überladene version von trystrtofloat blaa blaa
Dann hast du vermutlich den Typ der Variablen immer noch bei Real gelassen... :roll: