Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Zugriffsfverletzung - Aber warum (https://www.delphipraxis.net/171078-zugriffsfverletzung-aber-warum.html)

Premaider 18. Okt 2012 22:48

Zugriffsfverletzung - Aber warum
 
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
l,k,m,n,o,AL1,AL2: Integer;
begin
//Kollision Spieler und Ziel
if IsCollision(Spieler.BoundsRect, Ziel.BoundsRect) then
  begin
  Punktzahl:=Punktzahl+1;
    If Sounds='Enabled' Then
      begin
        SoundPlayer.FileName:=Pfad+'\Datein\Ziel.wav';
        SoundPlayer.Open;
        SoundPlayer.play;
      end;
    ItemCount:=ItemCount+1;
    Ziel.Top:=random(Spielflaeche.Height-Ziel.Height);
    Ziel.Left:=random(Spielflaeche.Width-Ziel.width);
    Memo2.lines.add(IntToStr(Ziel.Left)+';'+IntToStr(Ziel.top));
    // Gegner hinzufügen
      begin
       setLength(gegner,length(Gegner)+1);
       AL1 := length(Gegner)-1;
       Gegner[AL1]:= TGegner.Create(Self);
         With Gegner[AL1] do
          begin
            speed:=3;
            Parent := self;
            Cooldown := 1000;
            If RandomAusgabe(1)=1 Then
               begin
                  Width:=7;
                  Height:=40;
                  top:= 250;
                  Left := random( Spielflaeche.ClientWidth - Width );
                end;
            If RandomAusgabe(1)=0 Then
               begin
                  Width:=40;
                  Height:=7;
                  top:= random( Spielflaeche.clientheight - height );
                  Left := 450;
                end;
          end;
        end;
    //Item hinzufügen
      begin
        setLength(Item,length(Item)+1);
        AL2 := length(Item)-1;
        Item[AL2]:= TItem.Create(Self);
        With Item[AL2] do
          begin
            Parent:=Self;
            Height:=10;
            Width:=10;
            Top:=Random(Form1.ClientHeight-Height);
            Left:=Random(Form1.ClientWidth-Width);
            Brush.Color:=clblack;
            If RandomAusgabe(1)=1 then
              begin
                Pen.Color:=clgreen;
                Typ:=True;
              end;
            If RandomAusgabe(1)=0 then
              begin
                Pen.Color:=clred;
                Typ:=False;
              end;
          end;
  end;
...
//Kollision Spieler und Item
For n := low(item) to high(item) do
  begin
    If IsCollision(Spieler.BoundsRect,Item[n].BoundsRect) Then
      begin
        Spieler.Upgrade(n,Item[n].Typ);
      end;
  end;
end;
...
//Kollision Spieler und Gegner
For k:= low(gegner) to high(gegner) do
  begin
    if ((IsCollision(Gegner[k].BoundsRect, Spieler.BoundsRect))
    and (Gegner[k].Cooldown<=0)) then Verloren;
  end;
...
end;
Bei //Kollision Spieler und Item bekomme ich eine Zugriffsverletzung. Ich verstehe allerdings nicht warum. Genauso werden bei mir die Gegner behandelt und bei denen funktioniert es. Zudem die Gegner ja genauso erstellt werden.
Weiß jemand warum ?

Popov 18. Okt 2012 23:01

AW: Zugriffsfverletzung - Aber warum
 
Was ist Item, ein Array? Evtl. bist du drüber.

Bummi 18. Okt 2012 23:05

AW: Zugriffsfverletzung - Aber warum
 
was passiert hier?
Delphi-Quellcode:
Spieler.Upgrade(n,Item[n].Typ);

Premaider 18. Okt 2012 23:09

AW: Zugriffsfverletzung - Aber warum
 
Zitat:

Zitat von Popov (Beitrag 1187540)
Was ist Item, ein Array? Evtl. bist du drüber.

Ja ist ein Array. Ich dürfte eigendlich nicht drüber sein. Hat immer die selben Werte wie der Gegner Array

Zitat:

Zitat von Bummi (Beitrag 1187541)
was passiert hier?
Delphi-Quellcode:
Spieler.Upgrade(n,Item[n].Typ);

Delphi-Quellcode:
procedure TSpieler.Upgrade(n: Integer; ItemTyp: Boolean);
var
i,Zufall: Integer;
begin
Zufall:=Randomausgabe(5);
If ItemTyp=True Then
  begin
    //Gutes Item
    If Zufall=1 Then
      begin
        Item[n].Free;
        If Spieler.Speed>=1 Then Spieler.Speed:=Spieler.Speed+1;
        AuswirkungAnzeigen('Spieler speed up');;
      end;
    If Zufall=2 Then
      begin
        Item[n].free;
        //For i:= 0 to high(gegner)-1 do
          //begin
           //If Gegner[i].Speed>=2 Then Gegner[i].Speed:=Gegner[i].Speed-1;
          //end;
        AuswirkungAnzeigen('Gegner speed down');
      end;
    If Zufall=3 Then
      begin
        Item[n].Free;
        AuswirkungAnzeigen('Nichts1');
      end;
    If Zufall=4 Then
      begin
        Item[n].Free;
        AuswirkungAnzeigen('Nichts2');
      end;
    If Zufall=5 Then
      begin
        Item[n].Free;
        AuswirkungAnzeigen('Nichts3');
      end;
  end;
If ItemTyp=false Then
  begin
    //schlechtes Item
    If Zufall=1 Then
      begin
        Item[n].Free
      end;
    If Zufall=2 Then
      begin
        Item[n].Free
      end;
    If Zufall=3 Then
      begin
        Item[n].Free
      end;
    If Zufall=4 Then
      begin
        Item[n].Free
      end;
    If Zufall=5 Then
      begin
        Item[n].Free
      end;
  end;
end;

procedure AuswirkungAnzeigen(Auswirkung: String);
begin
Form1.ItemAnzeige.Caption:=Auswirkung;;
Form1.Timer2.Enabled:=true;
end;

function RandomAusgabe(max: Integer): Integer;
begin
Randomize;
Result:=Random(max+1);
end;

Uwe Raabe 18. Okt 2012 23:25

AW: Zugriffsfverletzung - Aber warum
 
Item[n].Free gibt das Item frei. Jeder nachfolgende Zugriff darauf führt zu einer Zugriffsverletzung. Da das Array aber nicht verändert wird, ist das Item noch da (obwohl keine gültige Objekt-Instanz dahinter liegt) und wird beim nächsten Schleifendurchlauf wieder angesprochen.

Premaider 18. Okt 2012 23:31

AW: Zugriffsfverletzung - Aber warum
 
Das heißt visible auf false setzen und noch eine Enabled eigenschaft einbauen ?
Edit: Ich werde jetzt erstmal schlafen gehen. Aber das mit visible auf False und enabled sollte dann ja funktionieren. Danke für eure Hilfe ;D

Bummi 18. Okt 2012 23:43

AW: Zugriffsfverletzung - Aber warum
 
Das zu beurteilen wage ich ob des mangelnden Verständnisses um die gewünschte Funktion nicht.
gegf. ist es erwünscht Item freizugeben dann muss allerdings sichergestellt werden daß bei
Item[n].Free; Item[n] überhaupt noch existiert (gegf. FreeAndNil,TObjectlist(oder verwaltete TList) statt Array) ...


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