Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - elektronisches tafelwerk für würfel pyramide quader und kuge


Lukifreeman - Mi 19.12.07 09:52
Titel: elektronisches tafelwerk für würfel pyramide quader und kuge
was mach ich falsch das er bei dem editfenster ne variable ausgibt obwohl nix häckchen drin is??



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 volumen(a2:real;var v2:real);
begin
v2:=a2*a2*a2;
end;

procedure oberflaeche(a2:real;var o2:real);
begin
o2:=6*a2*a2;
end;

procedure matelflaeche(a2:real;var m2:real);
begin
m2:=a2*a2;
end;

procedure TForm1.Button6Click(Sender: TObject);
var a2:real;
v2,o2,m2:real;

begin
a2:=strtofloat(edit10.text);

if checkbox4.checked=true then volumen(a2,v2);
edit7.text:=floattostr(v2);

if checkbox5.checked=true then volumen(a2,o2);
edit8.text:=floattostr(o2);

if checkbox6.checked=true then matelflaeche(a2,m2);
edit9.text:=floattostr(m2);



end;
end.

Moderiert von user profile iconAXMD: Delphi-Tags hinzugefügt
Moderiert von user profile iconAXMD: Topic aus Gemeinschaftsprojekte verschoben am Mi 19.12.2007 um 09:10


Kroko - Mi 19.12.07 10:10

(a) verwende bitte Delphi-Tags
(b) rücke deine Quellen ein
(c) ev. wären Funktionen für Volumen und Oberfläche besser geeignet
(d) verwende Double statt real(veraltet)
(e) boolsche Vergleich ohne =True/=False
(f) bei mehr als einer Anweisung in IfThenElse begin und end verwenden

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:
function volumen(a2: Double): Double;
begin
  Result := a2*a2*a2;
end;

function oberflaeche(a2:Double): Double;
begin
  Result := 6*a2*a2;
end;

function mantelflaeche(a2:Double): Double;
begin
  Result := 4*a2*a2;
end;

procedure TForm1.Button6Click(Sender: TObject);
var 
  a2:real;
v2,o2,m2:real;

begin
  a2 := StrTofloat(edit10.text);

  if checkbox4.checked then 
    begin
      V2 := Volumen(a2);
      edit7.text := FloatToStr(v2);
    end;
  if checkbox5.checked then 
    begin
      O2 := Oberflaeche(a2);
      edit8.text := FloatToStr(o2);
    end;
  if checkbox6.checked then Edit9.text := FloattoStr(Mantelflaeche(a2)); //oder so mit function

end;


AXMD - Mi 19.12.07 10:13

Hallo!

Du musst den Teil, der ausgeführt werden soll, wenn die Bedingung zutrifft, mit begin und end einschließen. Also beispielsweise so:


Delphi-Quelltext
1:
2:
3:
4:
5:
if checkbox6.checked=true then
begin
  matelflaeche(a2,m2);
  edit9.text:=floattostr(m2);
end;


Es reicht übrigens, nur checkbox6.checked zu schreiben, das true brauchst du hier gar nicht :)

AXMD


Lukifreeman - Mi 19.12.07 10:13

wie sollte denn die funktion für den würfel beispielsweise aussehen?

und das mit dem begin und end immer machen?


Kroko - Mi 19.12.07 10:16

user profile iconLukifreeman hat folgendes geschrieben:
wie sollte denn die funktion für den würfel beispielsweise aussehen?

und das mit dem begin und end immer machen?

(a) Augen auf
(b) nur bei mehr als einer Anweisung!


oldmax - Mi 19.12.07 10:32

Hi
Warum benutzt du keine Functions ?
Statt


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure volumen(a2:real;var v2:real);  
begin  
v2:=a2*a2*a2;  
end;  

if checkbox4.checked=true then volumen(a2,v2);  
edit7.text:=floattostr(v2);


geht's doch so etwas übersichtlicher zu


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Function volumen(a2:real): Real; // bzw. Double  
begin  
  Result:=a2*a2*a2;  
end;  

if checkbox4.checked=true then edit7.text:=floattostr(volumen(a2));


und noch besser mit Formatfloat..

Delphi-Quelltext
1:
if checkbox4.checked=true then edit7.text:=FormatFloat('#0.000',volumen(a2));                    


Gruß oldmax


Kroko - Mi 19.12.07 10:36

@oldmax Hast Du meine Beiträge gelesen :?: , :?


JayEff - Mi 19.12.07 10:40

user profile iconoldmax hat folgendes geschrieben:

Delphi-Quelltext
1:
if checkbox4.checked=true then edit7.text:=floattostr(volumen(a2));                    
Vergleich du nicht auch noch einen Booleanwert auf true :lol:
Was glaubst du denn, welcher Datentyp bei einem Vergleich rauskommt? Was kann "a = 1" denn sein? Nur Wahr oder Falsch, also ein Boolean ;)
Sprich: Ob ich nun schreibe  if a = b then oder  if (((a = b) = true) = true) = true then macht nur einen Unterschied: Ersteres ist übersichtlicher ;) Also: Wenn du einen Boolean hast, wie CheckboxX.Checked, dann lass den = true Vergleich weg ;)
Genauso kannst du = false mit  not ersetzen:

Delphi-Quelltext
1:
if not Checkbox1.Checked then //Checkbox hat keinen Haken!                    

Das ist jetzt übrigens auch schon 2 mal in diesem Thread angesprochen worden, genauso wie die Sache mit den Funktionen statt Prozeduren mit Var Parameter :mrgreen:
Viel Erfolg noch, Lukifreeman ;)


oldmax - Mi 19.12.07 15:02

Hi
Das kommt davon, wenn man mal eben in der Pause so darüberfliegt.... :oops:
und da ich's mir einfach mit C/P gemacht habe, auch noch dieser dumme lapsus mit dem true und false....
:shock:
Sorry.. beim nächsten mal les ich wieder, und überflieg es nicht nur.
Gruß oldmax


Lukifreeman - Mi 19.12.07 18:30

wie seid ihr eigentlich auf das result gekommen?
weil @ school hatten wir das noch nicht?

jetz bin ich beim berechnen der kugel der zeigt mir aber für r4 undefinierter bezeicher wiso?


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:
function volumen2(a2: Double): Double;
begin
  Result := a2*a2*a2;
end;

function oberflaeche2(a2:Double): Double;
begin
  Result := 6*a2*a2;
end;

function mantelflaeche2(a2:Double): Double;
begin
  Result := a2*a2;
end;

procedure TForm1.Button6Click(Sender: TObject);
var
  a2:real;
v2,o2,m2:real;

begin
  a2 := StrTofloat(edit10.text);

  if checkbox4.checked then
    begin
      V2 := Volumen2(a2);
      edit7.text := FloatToStr(v2);
    end;
  if checkbox5.checked then 
    begin
      O2 := Oberflaeche2(a2);
      edit8.text := FloatToStr(o2);
    end;
  if checkbox6.checked then
  begin
  m2:=mantelflaeche2(a2);
  Edit9.text := FloattoStr(m2);
  end;
end;


function volumen4(a4: Double): Double;
begin
  Result := (4*pi*r4*r4*r4)/3;
end;



procedure TForm1.Button12Click(Sender: TObject);
var r4:real;
v4,o4,d4:real;
begin
r4:=strtofloat(edit20.text);
if checkbox12.checked then
    begin
      V4 := Volumen4(r4);
      edit20.text := FloatToStr(v4);
    end;


end;

end.


Moderiert von user profile iconAXMD: Delphi-Tags hinzugefügt


Kroko - Mi 19.12.07 19:25

in dem wir uns mit Grundlagen [http://www.dsdt.info/grundlagen/] beschäftig haben :?:


Lukifreeman - Mi 19.12.07 21:03

so das programm läuft einwandfrei:-)
jetz hab ich bloß 3 fragen

1. warum kann man das true weglassen bei der checkbox?
2. warum da result steht? (mit welcher begründung)
3. wenn keine häckchen sind das er keine beliebigen werte ausgibt?

muss ja meinem lehrer irgentwie erklären wie ich drauf gekommen bin


Mitmischer 1703 - Mi 19.12.07 21:42

user profile iconLukifreeman hat folgendes geschrieben:
so das programm läuft einwandfrei:-)
jetz hab ich bloß 3 fragen

1. warum kann man das true weglassen bei der checkbox?
2. warum da result steht? (mit welcher begründung)
3. wenn keine häckchen sind das er keine beliebigen werte ausgibt?

muss ja meinem lehrer irgentwie erklären wie ich drauf gekommen bin


1. Weil es ein Boolean ist, und die Delphi-Programmierer schlau waren!
2. Result in einer Funktion ersetzt dir das Schreiben von Funktionsname := blalala => Kannst du so schreiben: Result := blalala. Du kannst es aber auch anders machen :P

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure bla (var x: Integer);
begin
Sleep (500);
x := x+1
end;


Dann kannst du mit x arbeiten:

Delphi-Quelltext
1:
Edit1.Text := IntToStr (x);                    


Oder so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function buhlala : Integer
begin
Sleep (500)
return x+1
end;
Edit1.Text := IntToStr (buhlala)


Prozedur oder Funktion??!!

An 3. arbeite ich noch :lupe:!


Lukifreeman - Mi 19.12.07 21:47

ähm ist eine function


Delphi-Quelltext
1:
2:
3:
4:
5:
if checkbox5.checked then
   begin
   o2:=oberflaeche2(a2);
   edit8.text:=floattostr(o2);
   end;



das wenn nicht checked und ich trotzdem auf berechnen gehe er nich irgenteine zahl anzeigt

Moderiert von user profile iconAXMD: Delphi-Tags hinzugefügt


Kroko - Do 20.12.07 05:33


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
if checkbox5.checked then
  begin
    o2:=oberflaeche2(a2);
    edit8.text:=floattostr(o2);
  end
else Edit8.Text := 'nicht berechnet';


Lukifreeman - Do 20.12.07 08:38

wenn ich das mit dem else mache geht er aber wieder hoch und zeigt bei a2 kein gültigen fließkomatawert oder so


Kroko - Do 20.12.07 09:01

user profile iconLukifreeman hat folgendes geschrieben:
wenn ich das mit dem else mache geht er aber wieder hoch und zeigt bei a2 kein gültigen fließkomatawert oder so
nein


oldmax - Do 20.12.07 14:27

Hi
Hmmmm, auch wenn ich mal wieder was überlesen haben sollte:
a2 Wert ist Wert aus Edit10.text und wenn da Müll drin steht, ist der Fehler nicht bei der Zuweisung von Edit8.Text zu suchen.
Also, es macht Sinn, Edit10.Text auf jeden Fall vorzubesetzen, z. B. in FormCreate

Delphi-Quelltext
1:
Edit10.Text:='0';                    

Des weiteren ist vielleicht das Abfangen von unzulässigen Zeichen also alles was keine Zahl oder 1 !! Komma ist. Das geht in OnKeyPress, oder du nimmst ein TMaskEdit, das sollte auch ein Copy/Paste verhindern, oder du nimmst andere Wandlungen, die bei Fehler nicht gleich das Programm anhalten und dir die Möglichkeit geben, diese falsche Eingabe zu korrigieren.
Außerdem würde dir gewaltig helfen, bei der Vergabe von Variablennamen ein wenig mehr Info reinzupacken. Z.B. Edit9.Text, Edit8.Text usw ist zwar sehr bequem, aber ein Ed_VolumenQuader.Text hilft dir bei umfangreichen Formularen auch eine richtige Zuweisung zu geben. Wobei ED_ ein Präfix für Edit, ein PN_ für Panel, ein CB_ für Checkbox usw. sein könnte.
Es ist auch nicht unbedingt sinnvoll, den Übergabeparameter nach einer globalen Variable zu benennen

Delphi-Quelltext
1:
Function Volumen(a2: Double):Double;                    

und dann

Delphi-Quelltext
1:
a2:=StrtoFloat(Edit10.Text);                    


Da mußt du ja ins Schleudern kommen, denn vermutlich ist a2 einmal global in der Variablentabelle deklariert und einmal lokal als Parameter der Function.
( das wir es auch mit benutzt haben liegt an Copy/Paste deines Quelltextes )
Da sind z.B. Möglichkeiten gegeben wie

Delphi-Quelltext
1:
2:
3:
4:
Hoehe: Double;
Breite: Double;
Durchmesser : Double;
Radius etc....

Die Zeit der eingeschränkten Variablennamen ist vorbei, lediglich muß man sich vor reservierten Bezeichnern in acht nehmen.

Ich denke, grad Anfänger begehen den Fehler, schreibfaul zu sein um dann irgendwann mit viel Arbeit durch den "Spaghetticode" zu stolpern.
Daher auch die mit Doppelslash eingeleiteten Kommentarzeilen nutzen und wichtiges kommentieren
Gruß oldmax