![]() |
Problem mit Delphi-Taschenrechner...AccessViolation
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:
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:
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. 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 |
Re: Problem mit Delphi-Taschenrechner...AccessViolation
Tu uns bitte einen gefallen, und lade das Project als Anhang hoch. Das würde die Fehlersuche vereinfachen.
Achso: Willkommen in der DP! :zwinker: :dp: |
Re: Problem mit Delphi-Taschenrechner...AccessViolation
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, hier mal die Projektdatei, das müßte reichen, oder?
danke schonmal... :) |
Re: Problem mit Delphi-Taschenrechner...AccessViolation
Das Problem fängt schon hier an:
Delphi-Quellcode:
das Problem ist, dass du nirgendwo definiert hast, wie groß das Array ist. Daher geht der Zugriff ins Leere. Daher auch die AV.
var
zahlen, ops: array of String; Lösung: Wenn die Länge feststeht (z.B. "10", also 10 Felder), dann kannst du es so machen:
Delphi-Quellcode:
Wenn nicht, muss du dem Array mit
var
zahlen, ops: array[0..9] of String; ![]() //Edit: Zitat:
Wir brauchen alle *.pas,*.dpr und *.dfm Dateien, die sich im Projektordner befinden. Am Besten mit einem ZIP - Programm packen. |
Re: Problem mit Delphi-Taschenrechner...AccessViolation
Zitat:
|
Re: Problem mit Delphi-Taschenrechner...AccessViolation
Liste der Anhänge anzeigen (Anzahl: 1)
also SetLength habe ich gemacht, die Größe beider Arrays wird jedesmal erhöht, wenn eine Operatortaste (+, -, * usw.) gedrückt wird, weil dann anschließend die neu eingegebene Zahl in dem Array gespeichert wird. und die Größe des Arrays steht vorher nicht fest, da ich ja nicht weiß, wieviele Zahlen eingetippt werden.
Aber hier noch die Zip-Datei... |
Re: Problem mit Delphi-Taschenrechner...AccessViolation
Ach sch****! Aber der Weg war der richtige!
Delphi-Quellcode:
klicke ich dann auf eine Zahl und dann auf '=', dann:
inc(index); //Zeile 117
Delphi-Quellcode:
wenn du mit
zahlen[index-1] := strBuff; /Zeile 131
Delphi-Quellcode:
die Größe des Array auf 1 (also zahlen[0..0]) setzt, dann bekommst du in Zeile 131 eine AV, da du index inzwischen um 1 erhöht hast.
SetLength(zahlen, index);
Lösung:
Delphi-Quellcode:
Oder nicht? Aber da liegt der Fehler.
SetLength(zahlen, index+1);
|
Re: Problem mit Delphi-Taschenrechner...AccessViolation
Liste der Anhänge anzeigen (Anzahl: 1)
hier der ganze krempel kommentiert, falls es damit leichter fällt den code nachzuvollziehen...
|
Re: Problem mit Delphi-Taschenrechner...AccessViolation
Das ist die Lösung. Dann geht es:
Delphi-Quellcode:
SetLength(zahlen, index+1);
SetLength(ops, index+1); |
Re: Problem mit Delphi-Taschenrechner...AccessViolation
@Daniel G:
PERFEKT, Danke dir....das wars, jetzt läufts! und ich such mich halb tot. :spin2: :spin2: :spin2: Vielen Dank nochmal Daniel! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz