Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Problem mit Fehlermeldung (https://www.delphipraxis.net/109838-problem-mit-fehlermeldung.html)

Landfloh 8. Mär 2008 18:25


Problem mit Fehlermeldung
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo

Ich habe ein Problem.

Wenn ich mein Programm starte dann kommt diese Fehlermeldung:
Zugriffsverletzung bei Adresse 00403441 in Modul 'MATHE4.exe'. Lesen von Adresse 00000000.

Hier der komplette Quelltext:

Delphi-Quellcode:
unit ZINS1;

interface

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

type
  TZins = class (TObject)
    Kapital,
    Prozent,
    Zinsen: Single;
    constructor Create;
    procedure SetKapital (Txt: String);
    procedure SetProzent (Txt: String);
    procedure SetZinsen (Txt: String);
    function GetKapital: String;
    function GetProzent: String;
    function GetZinsen:String;
  end;
 
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure SetZero;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Zins : TZins;
  Modus: Integer;
implementation

{$R *.dfm}

constructor TZins.Create;
begin
  inherited Create;
end;

procedure TZins.SetKapital(Txt: String);
begin
  Kapital := StrToFloat (Txt);
end;

procedure TZins.SetProzent(Txt: String);
begin
  Prozent := StrToFloat (Txt);
end;

procedure TZins.SetZinsen(Txt: String);
begin
  Zinsen := StrToFloat (Txt);
end;

function TZins.GetKapital: String;
begin
  Kapital := Zinsen * 100 / Prozent;
  GetKapital := FloatToStrF(Kapital,ffNumber,8,2);
end;

function TZins.GetProzent: String;
begin
  Prozent := Zinsen *100 / Kapital;
  GetProzent := FloatToStrF(Prozent,ffNumber,8,2);
end;

function TZins.GetZinsen: String;
begin
  Zinsen := Kapital * Prozent / 100;
  GetZinsen := FloatToStrF(Zinsen,ffNumber,8,2);
end;

procedure TForm1.SetZero;
begin
  Zins.Kapital := 0;
  Zins.Prozent := 0;
  Zins.Zinsen := 0;
  Edit1.Text := '0';
  Edit2.Text := '0';
  Edit3.Text := '0';
  Modus := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Zins := Zins.Create;
  SetZero;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetZero;
  Label1.Caption :=
    'Setz nur die gesuchte Größe auf Null!';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Label1.Caption := 'Das ist das Ergebnis';
  Zins.SetKapital(Edit1.Text);
  if Edit1.Text = '0' then inc (Modus);
  Zins.SetProzent(Edit2.Text);
  if Edit2.Text = '0' then inc (Modus,10);
  Zins.SetZinsen(Edit3.Text);
  if Edit3.Text ='0' then inc (Modus,100);
  case Modus of
    1  : Edit1.Text := Zins.GetKapital;
    10 : Edit2.Text := Zins.GetProzent;
    100: Edit3.Text := Zins.GetZinsen;
    else
      Label1.Caption := 'Keine oder zu viele Nullen!';
  end;
  Modus := 0;
end;

end.
Kann mir jemand helfen?

Hier auch nochmal die Dateien:

GuenterS 8. Mär 2008 18:27

Re: Problem mit Fehlermeldung
 
Fehler:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Zins := Zins.Create;
  SetZero;
end;

Korrigiert:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Zins := TZins.Create;
  SetZero;
end;

Landfloh 8. Mär 2008 18:30

Re: Problem mit Fehlermeldung
 
Danke
Es leuft :spin2: . War einfach nur ein dummer Schusselfehler :wall: .

Jelly 8. Mär 2008 18:40

Re: Problem mit Fehlermeldung
 
GuenterS hat dir ja den Fehler bereits korrigiert... Dennoch ein paar Anmerkungen zu deiner Struktur, die, wie ich finde, nicht wirklich schön aufgestellt ist:
  • Dein SetZero Methode aus der TForm1 Klasse gehört nicht dorthin, sondern innerhalb deiner TZins Klasse.Damit bist du unabhängig, die Methode auch für andere Instanzen zu nutzen
  • Wenn du schon Set-Methode in der TZins Klasse definierst, dann würde ich auch eine Property drumrumlegen. Auch würde ich nicht innerhalb der TZins Klasse die Konvertierung von String nach Float vornehmen, sondern das nur von aussen. Deine TZins Klasse macht dann mehr, was man von ihr erwartet: Man übergibt Werte, und lässt sich was ausrechnen. Es ist nicht Aufgabe der TZins Klasse, diese String-Float Konvertierungen vorzunehmen.
  • Auch die Get-Funktionen sollten einen String zurückliefern. Im Übrigen sollten sowohl die Get und Set Methoden von aussen nicht zugänglich sein, sondern nur über die Properties angesprochen werden... Hier mal am Beispiel von Kapital:
Delphi-Quellcode:
interface

type
  TZins = class (TObject)
  private
    function GetKapital: single;
    procedure SetKapital(const Value: single);
  public
    property Kapital : single read GetKapital write SetKapital ;
  end;


implementation

{ TZins }

function TZins.GetKapital: single;
begin
    return ...
end;

procedure TZins.SetKapital(const Value: single);
begin
     FKapital := value ;
end;

end.

messie 8. Mär 2008 18:40

Re: Problem mit Fehlermeldung
 
Trotzdem wäre eine genauere Beschreibung im Titel sinnvoll gewesen, z.B.
Zitat:

Access violation bei Form.create
Das könntest Du auch jetzt noch mit dem Edit-Button korrigieren, auch wenn es erledigt ist.
So globale Titel wie "programm geht nich" werden ebenso wie Dein Titel von einigen Leuten nicht gerne gesehen. Und ein Anfängerforum wo das nicht so auffiele, gibt es hier nicht.

Grüße, Messie

Jelly 8. Mär 2008 18:48

Re: Problem mit Fehlermeldung
 
Naja, der Fehler war ja bei der Frage eben noch nicht bekannt... Ausserdem liefert ja ein
Zins := Zins.Create ;

beim Kompilieren keinen Fehler. Und beim Ausführen kommt eben nur diese Schutzverletzung, ohne grössere Angabe, was denn da nun fehlgeschlagen ist... Gerade für Anfänger eben nicht besonders hilfreich, und man tappt erstmal ne Zeit lang im Dunkeln.

GuenterS 8. Mär 2008 20:22

Re: Problem mit Fehlermeldung
 
Zitat:

Zitat von Jelly
Naja, der Fehler war ja bei der Frage eben noch nicht bekannt... Ausserdem liefert ja ein
Zins := Zins.Create ;

beim Kompilieren keinen Fehler. Und beim Ausführen kommt eben nur diese Schutzverletzung, ohne grössere Angabe, was denn da nun fehlgeschlagen ist... Gerade für Anfänger eben nicht besonders hilfreich, und man tappt erstmal ne Zeit lang im Dunkeln.

Andererseits hätte mans mit dem Debugger wohl in ein paar Sekunden gehabt, dass genau hier der Fehler auftritt.

inherited 8. Mär 2008 20:58

Re: Problem mit Fehlermeldung
 
Wenn man weiß, wie man damit umgeht, ja.
Gerade als Anfänger weiß man das, denke ich, nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz