Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - procedure geht nicht


Greek - Di 20.01.09 23:17
Titel: procedure geht nicht

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:
implementation

{$R *.DFM}

Procedure Rechnen(rz1,rz2,rerg:integer;operator:char);
begin
  Case operator of
  '+' : rerg:=rz1+rz2;
  '-' : rerg:=rz1-rz2;
  '*' : rerg:=rz1*rz2;
  end;
end;

Function eingabe(var z1,z2:integer):integer;
begin
  z1:=StrToInt(Form1.Edit1.Text);
  z2:=StrToInt(Form1.Edit2.Text);
end;

procedure TForm1.Button1Click(Sender: TObject);
var z1,z2,erg :integer;
begin
  eingabe(z1,z2);
  Rechnen(z1,z2,erg,'+');
  Memo1.Lines.Add(IntToStr(erg));
end;

end.


erg ist immer ne random zahl, wieso?


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 20.01.2009 um 22:36


nagel - Di 20.01.09 23:22

Weil ihr nie was zugewiesen wird, besser gesagt weil bei einem normalen Prozedurenparamater nichts zurückgegeben wird. Entweder du machst aus rerg einen var-Parameter oder (die imho sinnvollere Variante) du schreibst die procedure Rechnen in eine function um.


Greek - Di 20.01.09 23:26

Gut danke, jetzt funktioniert es, aber in der Schule hatte wir das Var nur für die funktion verwendet gehabt und es ging trotzdem, muss mal nen Klassenkamerad fragen.


jaenicke - Mi 21.01.09 00:14

Eigentlich ist es genau verkehrt herum. Die Funktion gibt nix zurück (bzw. verändert die beiden übergebenen Werte), müsste also eigentlich eine Prozedur sein, und deine Prozedur will einen Wert zurückgeben, ist aber eine Prozedur. :gruebel:

Vorschlag: ;-)

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:
function Rechnen(rz1, rz2: integer; operator: char): integer;
begin
  case operator of
    '+' : Result := rz1 + rz2;
    '-' : Result := rz1 - rz2;
    '*' : Result := rz1 * rz2;
  else
    Result := 0;
  end;
end;

// out sagt, dass die Werte hier gefüllt werden
// var hieße, dass auch Werte übergeben werden. Das ist hier aber nicht der Fall.
procedure eingabe(out z1, z2: integer);
begin
  z1 := StrToInt(Form1.Edit1.Text);
  z2 := StrToInt(Form1.Edit2.Text);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  z1, z2, erg: integer;
begin
  eingabe(z1, z2);
  erg := Rechnen(z1, z2, '+');
  Memo1.Lines.Add(IntToStr(erg));
end;
Noch besser wäre es, wenn du auch fehlerhafte Eingaben abfängst, aber das ist vielleicht für den Anfang zu viel:

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:
function Rechnen(rz1, rz2: integer; operator: char): integer;
begin
  case operator of
    '+' : Result := rz1 + rz2;
    '-' : Result := rz1 - rz2;
    '*' : Result := rz1 * rz2;
  else
    Result := 0;
  end;
end;

function Eingabe(out z1, z2: integer): Boolean;
begin
  Result := TryStrToInt(Form1.Edit1.Text, z1)
    and TryStrToInt(Form1.Edit2.Text, z2);
  // TryStrToInt versucht den Inhalt in eine Zahl umzuwandeln und
  // sagt dir, ob das erfolgreich war.
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  z1, z2: integer;
begin
  if eingabe(z1, z2) then
    Memo1.Lines.Add(IntToStr(Rechnen(z1, z2, '+')))
  else
    Memo1.Lines.Add('Fehlerhafte Eingaben in einem der Edits');
end;


Greek - Mi 21.01.09 15:26

jaaa, das war der fehler, ich hab das mit mit procedure und function vertauscht^^ thx

habs jetzt so gemacht:


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:
implementation

{$R *.DFM}

Function Rechnen(rz1,rz2:Real;operator:char):Real;
begin
  Case operator of
  '+' : Rechnen:=rz1+rz2;
  '-' : Rechnen:=rz1-rz2;
  '*' : Rechnen:=rz1*rz2;
  '/' : Rechnen:=rz1/rz2;
  end;
end;

Procedure eingabe(var z1,z2:Real);
begin
  z1:=StrToFloat(Form1.Edit1.Text);                                 
  z2:=StrToFloat(Form1.Edit2.Text);
end;

Procedure ausgabe(az1,az2,aerg:Real;operator:char);
begin
Form1.Memo1.Lines.Add(FloatToStr(az1)+operator+FloatToStr(az2)+'='+FloatToStrF(aerg,FFGeneral,3,3));
end;

procedure TForm1.Button1Click(Sender: TObject);
var z1,z2,erg :Real;
begin
  Memo1.Clear;
  eingabe(z1,z2);
  erg:=Rechnen(z1,z2,'+');
  ausgabe(z1,z2,erg,'+');
end;

procedure TForm1.Button3Click(Sender: TObject);
var z1,z2,erg:Real;
begin
  Memo1.Clear;                                
  eingabe(z1,z2);
  erg:=Rechnen(z1,z2,'*');
  ausgabe(z1,z2,erg,'*');
end;

procedure TForm1.Button2Click(Sender: TObject);
var z1,z2,erg:Real;
begin
  Memo1.Clear;
  eingabe(z1,z2);
  erg:=Rechnen(z1,z2,'-');
  ausgabe(z1,z2,erg,'-');
end;

procedure TForm1.Button4Click(Sender: TObject);
var z1,z2,erg:Real;
begin                                     
  Memo1.Clear;
  eingabe(z1,z2);
  erg:=Rechnen(z1,z2,'/');
  ausgabe(z1,z2,erg,'/');
end;

end.



Funktioniert super :D

Danke für eure Hilfe


jaenicke - Mi 21.01.09 17:15

Die zweite Version kannst du dir ja auch noch anschauen, für die Eingabe hat das durchaus Vorteile, wenn falsche EIngaben abgefangen werden. ;-)
user profile iconGreek hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
Function Rechnen(rz1,rz2:Real;operator:char):Real;
begin
  Case operator of
  '+' : Rechnen:=rz1+rz2;
Statt Rechnen solltest du lieber Result zuweisen, das ist übersichtlicher. Wenn du den Namen deiner Funktion veränderst, müsstest du außerdem so jede Zuweisung des Rückgabewertes auch ändern. ;-)

user profile iconGreek hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Procedure ausgabe(az1,az2,aerg:Real;operator:char);
begin
Form1.Memo1.Lines.Add(FloatToStr(az1)+operator+FloatToStr(az2)+'='+FloatToStrF(aerg,FFGeneral,3,3));
end;

procedure TForm1.Button1Click(Sender: TObject);
var z1,z2,erg :Real;
begin
  Memo1.Clear;
  eingabe(z1,z2);
  erg:=Rechnen(z1,z2,'+');
...
Wenn die Buttons als Caption den Operator haben, also z.B. nur das +, dann geht das auch so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.ButtonXClick(Sender: TObject);
var
  z1, z2: Real;
  Operator: Char;
begin
  Operator := (Sender as TButton).Caption[1];
  eingabe(z1, z2);
  Memo1.Text := FloatToStr(z1) + Operator + FloatToStr(z2)
    + '=' + FloatToStrF(Rechnen(z1, z2, Operator), FFGeneral, 33);
end;
So könntest du ButtonXClick bei allen Buttons eintragen bei OnClick, Sender ist dabei der Button, der geklickt wurde. Im Anhang liegt ein Beispiel. ;-)

Ach ja: Und das Löschen des Memos mit Clear kannst du dir sparen, wenn du nicht eine Zeile mit Memo1.Lines.Add hinzufügst sondern Memo1.Text zuweist. Damit überschreibst du den alten Inhalt nämlich gleich mit.


Greek - Mi 21.01.09 18:33

Danke für die Tipps :D

vor allem Memo1.Text, muss mal meinem Lehrer sagen das es diesen Befehl gibt^^