Einzelnen Beitrag anzeigen

sepperl

Registriert seit: 18. Aug 2005
5 Beiträge
 
#1

Problem mit Delphi-Taschenrechner...AccessViolation

  Alt 18. Aug 2005, 22:06
Hallo,
ich bin neu hier und auch noch ein Delphi-Anfänger. Ich habe einen kleinen Taschenrechner in Delphi programmiert, leider gibt es bei der Berechnung ein Problem. Ich habe schon mein Buch gewälzt, gegooglet usw. aber keine Lösung gefunden. Vielleicht kann ich euch einfach mal meinen Quelltext hier reinkopieren und ihr könnt mir ein paar Tips geben worans liegen könnte?

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    ZahlButton1: TButton;
    ZahlButton2: TButton;
    ZahlButton3: TButton;
    ZahlButton4: TButton;
    ZahlButton5: TButton;
    ZahlButton6: TButton;
    ZahlButton7: TButton;
    ZahlButton8: TButton;
    ZahlButton9: TButton;
    ZahlButton10: TButton;
    ZahlButton11: TButton;
    OpButton12: TButton;
    OpButton13: TButton;
    OpButton14: TButton;
    OpButton15: TButton;
    Button16: TButton;
    Button17: TButton;
    Button18: TButton;
    procedure ZahlButtonClick(Sender: TObject);
    procedure Button16Click(Sender: TObject);
    procedure OpButtonClick(Sender: TObject);
    procedure Button18Click(Sender: TObject);
    procedure Button17Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  zahl, op: Char;
  index: Integer = 1;
  zahlen, ops: array of String;
  ausgabe, strBuff: String;

implementation

{$R *.dfm}


procedure TForm1.ZahlButtonClick(Sender: TObject);
var i: Integer;
begin
        if Sender = ZahlButton1 then zahl := '1'; if Sender = ZahlButton2 then zahl := '2';
        if Sender = ZahlButton3 then zahl := '3'; if Sender = ZahlButton4 then zahl := '4';
        if Sender = ZahlButton5 then zahl := '5'; if Sender = ZahlButton6 then zahl := '6';
        if Sender = ZahlButton7 then zahl := '7'; if Sender = ZahlButton8 then zahl := '8';
        if Sender = ZahlButton9 then zahl := '9'; if Sender = ZahlButton10 then zahl := '0';
        if Sender = ZahlButton11 then zahl := '.' ;

        strBuff := strBuff + zahl;
        if index = 1 then Edit1.Text := strBuff
        else
        begin
                if index <= 2 then
                ausgabe := zahlen[0] + ops[0]
                else
                begin
                        ausgabe := zahlen[0] + ops[0];
                        for i := 2 to index-1 do
                        begin
                        ausgabe := ausgabe + zahlen[i-1] + ops[i-1];
                        end;
                end;
                Edit1.Text := Concat(ausgabe, strBuff);
        end;

end;
procedure TForm1.Button16Click(Sender: TObject);
begin
        zahlen := nil; ops := nil; index := 1; ausgabe := ''; strBuff := '';
        Edit1.Text := '';
end;

procedure TForm1.OpButtonClick(Sender: TObject);
begin
        if Sender = OpButton12 then op := '+'; if Sender = OpButton13 then op := '-';
        if Sender = OpButton14 then op := '*'; if Sender = OpButton15 then op := '/';


        Edit1.Text := Edit1.Text + op;
        SetLength(zahlen, index);
        SetLength(ops, index);
        zahlen[index-1] := strBuff;
        ops[index-1] := op;
        inc(index);
        strBuff := '';
end;

procedure TForm1.Button18Click(Sender: TObject);
begin
        Form1.Close;
end;

procedure TForm1.Button17Click(Sender: TObject);
var erg, a, b: Double;
    code, i: Integer;
    s: String;
begin
        zahlen[index-1] := strBuff;
        if index > 2 then
        begin
                Val(zahlen[0], a, code);
                erg := a;
                for i := 1 to index-1 do
                begin
                        Val(zahlen[i], b, code);
                        if ops[i-1] = '+then erg := erg + b;
                        if ops[i-1] = '-then erg := erg - b;
                        if ops[i-1] = '*then erg := erg * b;
                        if ops[i-1] = '/then erg := erg / b;

                end;
                Str(erg:10:2, s);
                Edit1.Text := s;
        end
        else
        begin
                Val(zahlen[0], a, code);
                Val(zahlen[1], b, code);
                erg := a;
                if ops[0] = '+then erg := erg + b;
                if ops[0] = '-then erg := erg - b;
                if ops[0] = '*then erg := erg * b;
                if ops[0] = '/then erg := erg / b;
                Str(erg:10:2, s);
                Edit1.Text := s;
        end;
end;

end.
Soweit funktioniert der Taschenrechner, nur wenn ich auf das = Zeichen drücke um die Berechnung durchzuführen gibt er mir eine Fehlermeldung aus und zwar eine AccessViolation, der Compiler verweist auf den untersten Bereich mit:

Edit1.Text := s;

Wobei ich nicht glaube, dass der Fehler daran liegt. Wohl eher bei irgendeinem Zugriff auf ein Array...aber wo???
Würde mich sehr freuen, wenn ihr mir weiterhelfen könntet...

Schöne Grüße
Sepperl
  Mit Zitat antworten Zitat