Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EAccessViolation Fehler (https://www.delphipraxis.net/78596-eaccessviolation-fehler.html)

DelphiNewbieh 7. Okt 2006 16:03


EAccessViolation Fehler
 
Hi,
bin grad dabei für die Delphi Arbeit am kommenden Dienstag zu lernen.
Wir sollten ein Programm erstellen, dass die Fläche und den Umfang von Quadrat, Rechteck und Kreis errechnet. Bisher habe ich aber nur das Rechteck. Allerding komm ich immer wieder zum selben Fehler.
Ich hoffe jemand kann mir helfen. Vielen Dank.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    E_Laenge: TEdit;
    E_Breite: TEdit;
    B_Rechteck: TButton;
    E_Flaeche: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    E_Umfang: TEdit;
    Label6: TLabel;
    Label7: TLabel;
    E_Radius: TEdit;
    B_Kreis: TButton;
    Label8: TLabel;
    Label9: TLabel;
    E_Quadrat: TEdit;
    B_Quadrat: TButton;
    procedure FormCreate(Sender: TObject);
    procedure B_RechteckClick(Sender: TObject);
    procedure B_KreisClick(Sender: TObject);
    procedure B_QuadratClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  geo: TGeo;
  rechteck: TRechteck;


implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  rechteck := rechteck.Create(100,100);
end;

procedure TForm1.B_RechteckClick(Sender: TObject);
var Laenge, Breite: single;
begin
  Laenge:= strtofloat(E_Laenge.Text);
  Breite:= strtofloat(E_Breite.Text);
  rechteck.SetL(Laenge);
  rechteck.SetB(Breite);
  rechteck.BerechneF;
  rechteck.BerechneU;
  E_Flaeche.Text:=floattostr(geo.GetF);
end;

procedure TForm1.B_KreisClick(Sender: TObject);
begin
  //
end;

procedure TForm1.B_QuadratClick(Sender: TObject);
begin
  //
end;

end.
Delphi-Quellcode:
unit Unit_GeoObjekte;

interface

type

TGeo = class (TObject)
  protected
    FFlaeche: single;
    FUmfang: single;
  public
    procedure BerechneF; virtual; abstract;
    procedure BerechneU; virtual; abstract;
    function GetU: single;
    function GetF: single;
  end;

TRechteck= class(TGeo)
  protected
    FLaenge, FBreite: single;
  public
    procedure BerechneF; override;
    procedure BerechneU; override;
    procedure SetL(Neu_Laenge: single);
    procedure SetB(Neu_Breite: single); virtual;
    constructor Create(Laenge, Breite: single);
 end;

implementation

function TGeo.GetF: single;
begin
  result:= FFlaeche;
end;

function TGeo.GetU: single;
begin
  result:= FUmfang;
end;

constructor TRechteck.create(Laenge, Breite: single);
begin
  inherited create;
  FLaenge:= Laenge;<------ hier kommt der Fehler jetzt
  FBreite:= Breite;
end;

procedure TRechteck.SetL(Neu_Laenge: single);
begin
  FLaenge:= Neu_Laenge;<------ hier kam der Fehler vorher
end;

procedure TRechteck.SetB(Neu_Breite: single);
begin
  FBreite:= Neu_Breite;
end;

procedure TRechteck.BerechneF;
begin
  FFlaeche:= FLaenge * FBreite;
end;

procedure TRechteck.BerechneU;
begin
  FUmfang:= 2 * (FLaenge + FBreite);
end;

end.
[edit=SirThornberry]Zitat-Tags durch Delphi-Tags ersetzt. Mfg, SirThornberry[/edit][size=18]

SirThornberry 7. Okt 2006 16:08

Re: EAccessViolation Fehler
 
entweder ich hab es eifnach übersehen oder du hast vergessen Instanzen von TRechteck etc. zu erstellen (rechteck := TRechteck.Create). Das Freigeben der Instanzen würde dann auch fehlen.
Es wäre auch interessant zu wissen an welcher Stelle der Fehler um die Ursache einzugrenzen. Generell kommt eine AccessViolation (Zugriffsverletzung) immer wenn du auf Speicher falsch zugreifst oder auf Speicher der nicht zu deinem Programm gehört (lässt sich auch einiges über die Suchfunktion finden).

Achja, Herzlich Willkommen in der DP :party:

DelphiNewbieh 7. Okt 2006 16:20

Re: EAccessViolation Fehler
 
Danke für die schnelle Antwort.
Allerdings hat sich der Fehler jetzt nur von der einen zur anderen Stelle verschoben (habe es oben editiert). Ich weiss so langsam echt nicht mehr weiter. Es liegt immer an einem bescheuerten Fehler :(

SirThornberry 7. Okt 2006 16:21

Re: EAccessViolation Fehler
 
An welcher Stelle kommt denn genau der Fehler. Und an welcher Adresse kommt die AccessViolation.

DelphiNewbieh 7. Okt 2006 16:29

Re: EAccessViolation Fehler
 
Zitat:

Zitat von SirThornberry
An welcher Stelle kommt denn genau der Fehler.

Hab ich oben reingeschrieben. Leider funktioniert Bold nicht.

Zitat:

Zitat von SirThornberry
Und an welcher Adresse kommt die AccessViolation.

Zitat:

Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Addresse 004413F1 in Modul 'Project1.exe'. Schreiben von Addresse 0000000C'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen

SirThornberry 7. Okt 2006 16:33

Re: EAccessViolation Fehler
 
Die Adresse deutet darauf hin das du irgendwo "TIrgendwas.Create" vergessen hast.

DelphiNewbieh 7. Okt 2006 17:08

Re: EAccessViolation Fehler
 
Zitat:

Zitat von SirThornberry
Die Adresse deutet darauf hin das du irgendwo "TIrgendwas.Create" vergessen hast.

Also ich finde einfach nichts.
So langsam nervt mich das echt.

Keldorn 7. Okt 2006 17:16

Re: EAccessViolation Fehler
 
wie ist dein code jetzt genau?

Du hast auch rechteck := Trechteck.Create(100,100); in deinem code stehen?

Mfg frank

Muetze1 7. Okt 2006 18:20

Re: EAccessViolation Fehler
 
nein, hat er nicht. Und durch debuggen wäre es auch einfach zu finden. Wäre ja mal ein guter Einstieg mit dem Debuggger zu arbeiten. Oder du setzt einfach ein "T" beim Create davor und fragst bei den nächsten simplen Problemen einfach wieder hier...

DelphiNewbieh 7. Okt 2006 18:31

Re: EAccessViolation Fehler
 
Danke für eure Tipps, aber das Problem lag komischerweise daran, dass ich den Constructor benutzt habe. Nun funktioniert es, auch mit Quader und Kreis. Trotzdem beim nächsten Programm kommt der nächste Thread :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 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