AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein EAccessViolation beim aufrufen der eigenen Klasse
Thema durchsuchen
Ansicht
Themen-Optionen

EAccessViolation beim aufrufen der eigenen Klasse

Ein Thema von Lee500 · begonnen am 3. Mär 2008 · letzter Beitrag vom 4. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Lee500
Lee500

Registriert seit: 18. Sep 2006
39 Beiträge
 
Delphi 2010 Architect
 
#1

EAccessViolation beim aufrufen der eigenen Klasse

  Alt 3. Mär 2008, 14:38
Folgendes Problem:

In der MainGame.pas

Delphi-Quellcode:
unit MainGame;

interface

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

type
  TMain = class(TForm)
    PaintBox: TPaintBox;
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Main: TMain;
  Painter: TPaint;

implementation

{$R *.dfm}

procedure TMain.FormActivate(Sender: TObject);
begin
  Main.Width := Screen.Width;
  Main.Height := Screen.Height;
  Painter := TPaint.Create(PaintBox);
end;

procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Painter.Destroy;
end;

end.
wird meine PainterKlasse (TPaint) erstmal erzeugt.
Daraufhin bekomme ich beim erzeugen der Klasse eine EAccessViolation.

Hier der Code der Painterklasse:

Delphi-Quellcode:
unit Paint;

interface
uses Graphics, Classes, ExtCtrls;

type
  TPaint = class
  private
    Colors: array [0..7] of array [0..7] of Boolean;
    Size: Integer;
    PenBlack, PenWhite: TPen;
    BrushBlack, BrushWhite: TBrush;
  protected

  public
    constructor Create(PaintBox: TPaintBox);
    destructor Destroy();
    procedure Paint(C: TCanvas);
  end;

implementation

uses MainGame;

 constructor TPaint.Create(PaintBox: TPaintBox);
 var
   X,Y: Integer;
   Bool: Boolean;
 begin
   inherited Create();
   self.Size := PaintBox.Height div 8;
   self.PenBlack.Color := clblack;
   self.PenWhite.Color := clwhite;
   self.PenBlack.Width := 1;
   self.PenWhite.Width := 1;
   self.BrushBlack.Color := clBlack;
   self.BrushWhite.Color := clWhite;
   Bool := true;
   for X := 0 to Length(Colors)-1 do
   begin
     for Y := 0 to Length(Colors[X])-1 do
     begin
       Colors[X,Y] := Bool;
       if Bool then
       begin
         Bool := false;
       end else
       begin
         Bool := true;
       end;
     end;
   end;
 end;

 destructor TPaint.Destroy();
 begin
 inherited Destroy;
   self.Free;
 end;

 procedure TPaint.Paint(C: TCanvas);
 var
   X,Y: Integer;
 begin
   for X := 0 to Length(self.Colors)-1 do
   begin
     for Y := 0 to Length(self.Colors[X])-1 do
     begin
       if self.Colors[X,Y] then
       begin
         C.Pen := self.PenWhite;
         C.Brush := self.BrushWhite;
       end else
       begin
         C.Pen := self.PenBlack;
         C.Brush :=self.BrushBlack;
       end;
       C.Rectangle(Rect(X*Size,Y*Size,(X+1)*Size,(Y+1)*Size));
     end;
   end;
 end;

end.
Ich hab auch schon gegoogelt udn auch die Foren Suche benutzt, habe jedoch nichts passendes gefunden. Ich hoffe ihr könnt mir helfen. Schonma im vorraus Danke
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: EAccessViolation beim aufrufen der eigenen Klasse

  Alt 3. Mär 2008, 14:40
Hi,

2 Sachen die das Problem sind:

Du solltest Painter.Free aufrufen und nicht Painter.Destroy;


Delphi-Quellcode:
destructor TPaint.Destroy();
begin
   inherited Destroy;
   self.Free; // <--- das erzeugt die AV. Das ist TÖDLICH!
end;
Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: EAccessViolation beim aufrufen der eigenen Klasse

  Alt 3. Mär 2008, 14:41
1. Überprüfe ob PaintBox1 schon angelegt worden ist (ungleich NIL)
2. TBrush und TPen sind Klassen und müssen von dir in deiner Klasse auch instanziiert werden
3. Der Destruktor muss mit Override deklariert werden.

/EDIT: Neutral General: Destroy direkt aufzurufen ist nicht unbedingt tötlich, wenn man vorher selbst dafür sorgt, dass die Instanz nicht nil ist (oder werden kann). Ausserdem erscheint der Fehler beim Constructor Aufruf nach Beschreibung, somit kann es nicht deine Vermutung sein...
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: EAccessViolation beim aufrufen der eigenen Klasse

  Alt 3. Mär 2008, 14:42
Delphi-Quellcode:
constructor TPaint.Create(PaintBox: TPaintBox);
var
   X,Y: Integer;
   Bool: Boolean;
begin
   inherited Create();
   self.Size := PaintBox.Height div 8;
   self.PenBlack.Color := clblack; // hier macht es Budsch, weil Objekt PenBlack nicht erzeugt wurde !!
Du kannst mit Delphi auch debuggen!
Mit Breakpoints setzen und Einzelschrittmodus kann man diese Art von Fehlern leicht selber entdecken.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: EAccessViolation beim aufrufen der eigenen Klasse

  Alt 3. Mär 2008, 14:43
Zitat von Muetze1:
/EDIT: Neutral General: Destroy direkt aufzurufen ist nicht unbedingt tötlich, wenn man vorher selbst dafür sorgt, dass die Instanz nicht nil ist (oder werden kann). Ausserdem erscheint der Fehler beim Constructor Aufruf nach Beschreibung, somit kann es nicht deine Vermutung sein...
Das habe ich auch nicht gesagt, aber Free; im Destructor aufzurufen ist tödlich
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Lee500
Lee500

Registriert seit: 18. Sep 2006
39 Beiträge
 
Delphi 2010 Architect
 
#6

Re: EAccessViolation beim aufrufen der eigenen Klasse

  Alt 3. Mär 2008, 14:52
Problem gelöst. Es lag wirklich daran, dass die Pen und die Brush Klassen nicht erzeugt wurden.


Zitat von shmia:
Du kannst mit Delphi auch debuggen!
Mit Breakpoints setzen und Einzelschrittmodus kann man diese Art von Fehlern leicht selber entdecken.
Das hab ich auch versucht. Aber irgendwie scheine ich zu blöd dafür zu sein -.- Ich habe sogar den Kompletten Konstruktor einmal auskommentiert und trotzdem gab es noch die EAccessViolation. Naja egal. Nun weiß ich wo der Fehler lag. Danke!!
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: EAccessViolation beim aufrufen der eigenen Klasse

  Alt 3. Mär 2008, 14:53
Will ja nicht nerven aber das Self.Free solltest du aus dem Destructor werfen
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Lee500
Lee500

Registriert seit: 18. Sep 2006
39 Beiträge
 
Delphi 2010 Architect
 
#8

Re: EAccessViolation beim aufrufen der eigenen Klasse

  Alt 3. Mär 2008, 15:20
Hab ich ja. Oh sry. Hab vergessen das zu erwähnen^^

Hier nochmal der ganze Code:

Delphi-Quellcode:
unit MainGame;

interface

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

type
  TMain = class(TForm)
    PaintBox: TPaintBox;
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Main: TMain;
  Painter: TPaint;

implementation

{$R *.dfm}

procedure TMain.FormActivate(Sender: TObject);
begin
  Main.Width := Screen.Width;
  Main.Height := Screen.Height;
  Painter := TPaint.Create(PaintBox);
end;

procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Painter.Destroy;
end;

end.
Delphi-Quellcode:

unit Paint;

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

type
  TPaint = class
  private
    Colors: array [0..7] of array [0..7] of Boolean;
    Size, Space: Integer;
    PenBlack, PenWhite: TPen;
    BrushBlack, BrushWhite: TBrush;
  protected

  public
    constructor Create(PaintBox: TPaintBox);
    destructor Destroy(); override;
    procedure Paint(C: TCanvas);
  end;

implementation

uses MainGame;

 constructor TPaint.Create(PaintBox: TPaintBox);
 var
   X,Y: Integer;
   Bool: Boolean;
 begin
   inherited Create();
   self.Size := (PaintBox.Height-100) div 8;
   self.Space := (PaintBox.Width - PaintBox.Height + 100) div 2;
   self.PenBlack := TPen.Create;
   self.PenWhite := TPen.Create;
   self.BrushBlack := TBrush.Create;
   self.BrushWhite := TBrush.Create;
   self.PenBlack.Color := clblack;
   self.PenWhite.Color := clwhite;
   self.PenBlack.Width := 5;
   self.PenWhite.Width := 5;
   self.BrushBlack.Color := clBlack;
   self.BrushWhite.Color := clWhite;
   Bool := true;
   for X := 0 to Length(Colors)-1 do
   begin
     for Y := 0 to Length(Colors[X])-1 do
     begin
       Colors[X,Y] := Bool;
       if Bool then
       begin
         Bool := false;
       end else
       begin
         Bool := true;
       end;
     end;
     if Bool then
     begin
       Bool := false;
     end else
     begin
       Bool := true;
     end;
   end;
 end;

 destructor TPaint.Destroy;
 begin
   self.PenBlack.Free;
   self.PenWhite.Free;
   self.BrushBlack.Free;
   self.BrushWhite.Free;
 end;

 procedure TPaint.Paint(C: TCanvas);
 var
   X,Y: Integer;
 begin
   for X := 0 to Length(self.Colors)-1 do
   begin
     for Y := 0 to Length(self.Colors[X])-1 do
     begin
       if self.Colors[X,Y] then
       begin
         C.Pen := self.PenWhite;
         C.Brush := self.BrushWhite;
       end else
       begin
         C.Pen := self.PenBlack;
         C.Brush :=self.BrushBlack;
       end;
       C.Rectangle(Rect(Space+X*Size,50+Y*Size,Space+(X+1)*Size,50+(Y+1)*Size));
     end;
   end;
 end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: EAccessViolation beim aufrufen der eigenen Klasse

  Alt 3. Mär 2008, 15:27
Zitat von Lee500:
Delphi-Quellcode:
       if Bool then
       begin
         Bool := false;
       end else
       begin
         Bool := true;
       end;
Wie wäre es mitBool := not Bool; ?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Lee500
Lee500

Registriert seit: 18. Sep 2006
39 Beiträge
 
Delphi 2010 Architect
 
#10

Re: EAccessViolation beim aufrufen der eigenen Klasse

  Alt 3. Mär 2008, 15:47
mh joa sieht auf jedenfall schicker aus Naja ich programmiere auch nicht so viel. Aber danke für den Tipp. Ich werds mir merken
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 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