Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsverletzung bei Constructor.Create (https://www.delphipraxis.net/110721-zugriffsverletzung-bei-constructor-create.html)

Fussball-Robby 23. Mär 2008 12:34


Zugriffsverletzung bei Constructor.Create
 
Hey, ich wollte mich mal ein bisschen mit Klassen usw. beschäftigen, und hier ist gleich das ertste Problem: Ich habe hier zwei Klassen:
Delphi-Quellcode:
type
  TPixels = class
  R, G, B : Byte;
  public
    constructor Create;
  end;

type
  TPixelField = class
  Pixels : Array of Array of TPixels;
  public
    constructor Create(Width, Height : Integer);
  end;
Das zweite ist ein Feld und hat die Eigenschaft Pixels, ein zweidimensionales Array of TPixels, jedes TPixel hat die Werte R, G und B. So weit, so gut.

Jetzt erstelle ich das Pixelfield:
Delphi-Quellcode:
constructor TPixelField.Create(Width, Height : Integer);
Var i : Integer;
begin
  SetLength(Pixels, Width);
  for i := low(Pixels) to high(Pixels) do
    SetLength(Pixels[i], Height);
end;
Auch das klappt ohne Probleme. Jetzt will ich aber auch die TPixels erstellen:
Delphi-Quellcode:
Constructor TPixels.Create;
begin
  R:=0;//<-- Hir kommt die Zugriffsverletzung, auch wenn hier nichts steht
  G:=0;
  B:=0;
end;

////

procedure TForm1.Button2Click(Sender: TObject);
var i, j : Integer;
    Field : TPixelfield;
begin
  Field:=TPixelField.Create(10,10);
  with Field do
  begin
    for i:=low(Pixels) to high(Pixels) do
      for j:=low(Pixels[i]) to high(Pixels[i]) do
      begin
        Pixels[i,j].Create;
      end;
  end;
end;
Aber da gibts ne Zugriffsverletzung (EAccesViolation). Genauer gesagt kommt die im Create von TPixels in der ersten Zeile. Aber auch wenn ich TPixels.Create leer lasse, kommt die Zugriffsverletzung. Was mache ich falsch?

Mfg

Zwoetzen 23. Mär 2008 12:39

Re: Zugriffsverletzung bei Constructor.Create
 
Du rufst den Constructor falsch auf. Das muss folgendermaßen lauten:

Delphi-Quellcode:
Pixel[i, j] := TPixel.Create;
Beim Field hast du es richtig gemacht.

DeddyH 23. Mär 2008 12:42

Re: Zugriffsverletzung bei Constructor.Create
 
Delphi-Quellcode:
    for i:=low(Pixels) to high(Pixels) do
      for j:=low(Pixels[i]) to high(Pixels[i]) do
      begin
        Pixels[i,j] := TPixels.Create; //so muss das sein
      end;
  end;
[edit] Da war jemand schneller :? [/edit]

Fussball-Robby 23. Mär 2008 13:54

Re: Zugriffsverletzung bei Constructor.Create
 
Stimmt :oops: Danke :thumb:

Mfg

Die Muhkuh 23. Mär 2008 13:55

Re: Zugriffsverletzung bei Constructor.Create
 
Das hier:

Delphi-Quellcode:
constructor TPixelField.Create(Width, Height : Integer);
Var i : Integer;
begin
  SetLength(Pixels, Width);
  for i := low(Pixels) to high(Pixels) do
    SetLength(Pixels[i], Height);
end;
könnte man doch noch so abkürzen:

Delphi-Quellcode:
constructor TPixelField.Create(Width, Height : Integer);
begin
  SetLength(Pixels, Width, Height);
end;

Fussball-Robby 23. Mär 2008 14:17

Re: Zugriffsverletzung bei Constructor.Create
 
Danke, wusste garnicht, dass man das so machen kann :?


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