| Autor |
Beitrag |
Greek
      
Beiträge: 45
|
Verfasst: Di 20.01.09 23:17
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 Narses: Topic aus Sonstiges (Delphi) verschoben am Di 20.01.2009 um 22:36
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: 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 
      
Beiträge: 45
|
Verfasst: 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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
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;
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); 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 
      
Beiträge: 45
|
Verfasst: 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:
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
Danke für eure Hilfe
Zuletzt bearbeitet von Greek am Mi 21.01.09 15:29, insgesamt 2-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.  Greek hat folgendes geschrieben : | 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.
Greek hat folgendes geschrieben : | 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, 3, 3); 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.
Einloggen, um Attachments anzusehen!
|
|
Greek 
      
Beiträge: 45
|
Verfasst: Mi 21.01.09 18:33
Danke für die Tipps
vor allem Memo1.Text, muss mal meinem Lehrer sagen das es diesen Befehl gibt^^
|
|
|