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 public 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
Narses: Code- durch Delphi-Tags ersetztModeriert von
Narses: 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
ALF hat folgendes geschrieben : |
| 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
jaenicke hat folgendes geschrieben : |
| 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
Narses: 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
FloXxX hat folgendes geschrieben : |
| 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
FloXxX hat folgendes geschrieben : |
| 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:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!