Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Rechtecksberechnung


killerbiene - So 04.02.07 18:53
Titel: Rechtecksberechnung
Hi
Ich benutze in der Schule Delphi und habe schonmal vorgearbeitet...
Angefangen habe ich mit dem wohl standart , dem rechtecksberechnungprogramm!
Code ist dieser hier:

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:
unit Unit1;

interface

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

type
  TRayen = class(TForm)
    Panel1: TPanel;
    SeiteBEdit: TEdit;
    SeiteAEdit: TEdit;
    FlaecheEdit: TEdit;
    UmfangEdit: TEdit;
    DiagonaleEdit: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    RechnenButton: TButton;
    ResetButton: TButton;
    EndeButton: TButton;
    Label11: TLabel;
    procedure EndeButtonClick(Sender: TObject);
    procedure RechnenButtonClick(Sender: TObject);
    procedure ResetButtonClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Rayen: TRayen;
  SeiteA,SeiteB,Flaeche,Umfang,Diagonale : Real;

implementation

{$R *.dfm}

procedure TRayen.EndeButtonClick(Sender: TObject);
begin
close;
end;

procedure TRayen.RechnenButtonClick(Sender: TObject);
begin
SeiteA:=StrToFloat(SeiteAEdit.Text);
SeiteB:=StrToFloat(SeiteBEdit.Text);
Flaeche:=SeiteA*SeiteB;
Umfang:=2*(seiteA+SeiteB);
Diagonale:=Sqrt(SeiteA*2+SeiteB*2);
FlaecheEdit.Text:=FloatToStr(Flaeche);
UmfangEdit.Text:=FloatToStr(Umfang);
DiagonaleEdit.Text:=FloatToStr(Diagonale);
end;

procedure TRayen.ResetButtonClick(Sender: TObject);
begin
SeiteAEdit.Text:='';
SeiteBEdit.Text:='';
FlaecheEdit.Text:='';
UmfangEdit.Text:='';
DiagonaleEdit.Text:='';
end;

end.

Nun habe ich aber wie ihr sicher erahnen könnt einen Fehler , wenn ich nichts in die Felder A und B eingebe , also wenn die leer bleiben!Was muss ich machen , damit Anstelle eines Fehlers einfach alles mit Nullern gefüllt wird?!
mfg Killerbiene

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt


Delete - So 04.02.07 19:20

kommt auf deine delphi version an. normal prüft man zuvor, ob das feld leer ist und falls ja, setzt man 0 ansonsten wandelt man den wert um. alternativ kannst du es auch mit einen try ... except ... end block schützen oder in 'ner neueren version via tryStrToFloat. HTH

PS: kommt halt auch drauf an, ob du 'ne quick und dirty lösung für die schule brauchst, wo die ansprüche nicht so hoch sind, oder ob das professionell gemacht werden soll. beim zweiten wäre der aufwand auch um einiges grösser, was z.b. in einer klausur nicht zu machen wäre.

PPS: deine globalen variablen, solltest du in die klasse verlagern. dort gehören sie auch hin.


Robinator - So 04.02.07 19:23

Hallo,

Dafür gibt es StrToFloatDef und StrToIntDef. Sollte genau das sein, was du suchst.

gruss, Rob


killerbiene - So 04.02.07 19:28

Also ich benutze Delphi 7 und auch 5!
Ich brauche natürlich eine Einsteigerfreundliche Lösung und eine die für die Schule geeignet ist , jedoch auch eine , die beim Dbugger keinen Fehler auslöst!
Geht das mit dem StrToFloatDef odernicht? Falls ja , wo soll ich das einbauen?!
danke für euer Gedult , bin halt absoluter noob!


Robinator - So 04.02.07 19:37

Hallo,


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TRayen.RechnenButtonClick(Sender: TObject);
begin
  SeiteA:=StrToFloatDef(SeiteAEdit.Text, 0);
  SeiteB:=StrToFloatDef(SeiteBEdit.Text, 0);
  Flaeche:=SeiteA*SeiteB;
  Umfang:=2*(seiteA+SeiteB);
  Diagonale:=Sqrt(SeiteA*2+SeiteB*2);
  FlaecheEdit.Text:=FloatToStr(Flaeche);
  UmfangEdit.Text:=FloatToStr(Umfang);
  DiagonaleEdit.Text:=FloatToStr(Diagonale);
end;


Und evtl einfach mal auf StrToFloatDef klicken und dann F1 drücken ;)

Gruss, Rob


killerbiene - So 04.02.07 19:42

Genial , danke , hat funktioniert! Vielen Dank!


Delete - So 04.02.07 19:43

also bei D5 gibts die trystrtofloat noch nicht, ebenso wie die strtofloatdef. dir wird da nix anderes übrigbleiben als den folgenden weg zu gehen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
try
  SeiteA:=StrToFloat(SeiteAEdit.Text);
 except
  seitea := 0;
 end;
 try
  SeiteB:=StrToFloat(SeiteBEdit.Text);
 except
  seiteb := 0;
 end;


sollt man zwar nicht machen, aber für die schule vollkommen ausreichend. HTH.


MSC - So 04.02.07 19:54
Titel: Re: Rechtecksberechnung
Wenn du einfach nur testen willst, ob die Eingaben leer sind, kannst du das verwenden

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TRayen.RechnenButtonClick(Sender: TObject);
begin
if SeiteAEdit.Text = '' then
exit        //Prozedur abbrechen
else        
SeiteA:=StrToFloat(SeiteAEdit.Text);
if SeiteBEdit.Text = '' then
exit        //Prozedur abbrechen
else
SeiteB:=StrToFloat(SeiteBEdit.Text);
Flaeche:=SeiteA*SeiteB;
Umfang:=2*(seiteA+SeiteB);
Diagonale:=Sqrt(SeiteA*2+SeiteB*2);
FlaecheEdit.Text:=FloatToStr(Flaeche);
UmfangEdit.Text:=FloatToStr(Umfang);
DiagonaleEdit.Text:=FloatToStr(Diagonale);
end;

Ansonsten kannst du auch direkt abtesten, ob nur Zahlen und Bauchstaben verwendet wurden:


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:
procedure TRayen.RechnenButtonClick(Sender: TObject);
var ok:boolean;
begin
ok:=True;
if SeiteAEdit.Text <> '' then
 begin
  for i:=1 to length(SeiteAEdit.Text) do
   if SeiteAEdit.Text[i] in ['0'..'9',','then   //abtesten, dass nur 0 1 2...9 und , eingegeben wurden
    else
    ok:=false

 if SeiteAEdit.Text <> '' then
  for i:=1 to length(SeiteBEdit.Text) do
   if SeiteBEdit.Text[i] in ['0'..'9',','then
    else
    ok:=false

 if ok=true then
  begin
   SeiteA:=StrToFloat(SeiteAEdit.Text);
   SeiteB:=StrToFloat(SeiteBEdit.Text);
   Flaeche:=SeiteA*SeiteB;
   Umfang:=2*(seiteA+SeiteB);
   Diagonale:=Sqrt(SeiteA*2+SeiteB*2);
   FlaecheEdit.Text:=FloatToStr(Flaeche);
   UmfangEdit.Text:=FloatToStr(Umfang);
   DiagonaleEdit.Text:=FloatToStr(Diagonale);
  end;
 end;
end;

Ich hoffe es funktioniert alles.

Edit: ok, in der Zeit waren 3 andere Beiträge geschrieben worden :)


killerbiene - So 04.02.07 20:05

Ok , wenn das mit der 5-er nicht geht ist es schlecht....
Nunja....also das mit Try except funktioniert zwar in der exe , jedoch löst es im debugger Fehler aus! Gibt es eine leichte andre Möglichkeit , ohne das der Debugger ausschlägt? oder ist das , dass was man im normalfall als Schüler nimmt?

Edit: Die erste Methode des letzten Beitrags probier ich mal!


Delete - So 04.02.07 20:11

für den debugger, gibts drei möglichkeiten

a) fehler ignorieren und auf weiter drücken
b) debugger abschalten
c) except in debugger abschalten

oder einfach kompilieren und die kompilierte exe ausführen :-)


killerbiene - So 04.02.07 20:12

Überflüssig....wenn ich es einfach so mache wie MSC es sagtest , also mit if '' then.... funktioniert es sogar mit Debugger wunderbar!
Danke Leute für die Hilfe! Tolles Board!


Delete - So 04.02.07 20:20

tja, dann gib mal 'n dezimalpunkt ein, oder 'n leerzeichen oder 'n buchstaben...

dann krachts. also, diesen weg würd ich an deiner stelle nicht gehen, da er zeitaufwendig ist. aber wenns richtung professionell gehen soll, gibts hier normal keinen anderen weg. aber muss halt noch etwas ausprogrammiert werden, so dass er wirklich verhebt. IMHO