Autor Beitrag
Ik4rus
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 13.04.12 15:01 
Nachdem ich es schließlich doch noch geschafft habe das Captcha zu überwinden erstmal: Hallo!

Ich hänge zzt. an einer höchst ominösen AccessViolation fest wie sie in ähnlichem Kontext wohl schon öfter Aufgetreten ist (Suchfunktion inc.), dennoch haben mir die Lösungsvorschläge der anderen Threads nicht geholfen.

Erstmal der Code:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
type TTile = class
  private
  Image: TImage;
  wall: boolean;
  occupiedByParty: boolean;
  occupiedByEnemy: boolean;
  x: integer;
  y: integer;
  Top, Left, Bot, Right: TTile;
  tp: boolean;
  public
  procedure ChangeWallStatus;
  function isWall: boolean;
  procedure SetImage(Picture: TPicture);
  procedure ChangePartyOccupation;
  procedure ChangeEnemyOccupation;
  function isOccupiedbyParty: boolean;
  procedure SetTop(pTile: TTile);
  function getTop: TTile;
  procedure SetBot(pTile: TTile);
  function getBot: TTile;
  procedure setRight(pTile: TTile);
  function getRight: TTile;
  procedure setLeft(pTile: TTile);
  function getLeft: TTile;
  function getX: integer;
  function getY: integer;
  procedure SetTp;
  function isTp: boolean;
  procedure InitTile(Picture: TPicture; px,py: integer);
 end;


Ist meine eigene Klasse TTile in der später Bilder, Koordinaten und Infos zu den Feldern eines Spieles gespeichert werden sollen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type TTileSet = class (TTile)
  private
  TileSet: Array[0..150..9of TTile;
  Setting: string[255];
  Direction: string;
  public
  function check: TTile;
  procedure SaveTileToTileSet (x, y: integer; pTile: TTile);
  function getTileFromTileSet (x, y: integer): TTile;
  constructor Create (ExeDirection: string; pSetting: string; maxlvl: integer; boss: boolean);
end;


TTileSet soll die Felder, im Prinzip also das begehbare Spielfeld als solches im x*y Array TileSet speichern, der Fehler tritt jetzt im constructor auf:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
constructor TTileSet.Create(ExeDirection: string; pSetting: string; maxlvl: integer; boss: boolean);
var i,j,k, check, tempcount, rx, ry: integer;
    temp: TImage;

begin


if (pSetting= 'cave'then
begin

  for i := 0 to 9 do
  begin
      for j := 0 to 15 do
        begin


        ShowMessage(ExeDirection);
        temp.Picture.LoadFromFile(ExeDirection + 'Sprites\Tiles\Cave\cave' + inttostr(round(random(7)+1)) + '.bmp');

        TileSet[j,i]:= TTile.Create;
        TileSet[j,i].InitTile(temp.Picture, j, i);





        if (j=0then
        begin
        TileSet[j,i].setLeft(nil);
        end;

        if (j>0then
        begin
        TileSet[j-1,i].setRight(TileSet[i][j]);
        TileSet[j,i].setLeft(TileSet[i][j-1]);
        end;

        if (j=15then
        begin
        TileSet[j,i].setRight(nil);
        end;

        if (i=0then
        begin
        TileSet[j,i].SetTop(nil);
        end;

        if (i>0then
        begin
        TileSet[j,i].SetTop(TileSet[i-1][j]);
        TileSet[j,i-1].SetBot(TileSet[i][j]);
        end;

        if (i=9then
        begin
        TileSet[j,i].setBot(nil);
        end;
        

      end;

   end;


end;


end;


Beim ersten Zugriff auf das Array TileSet[j,i]:= TTile.Create; gibt es einen dicken Fehler, was ich ein bisschen seltsam finde. Ich hab jetzt schon eine Weile rumgewerkelt, komischerweise funktioniert das ganze manchmal wenn ich den gleichen Code z. B. vor die Schleife stelle, allerdings kommt dann direkt die nächste AccessViolation an der nächsten Stelle an der auf TileSet zugegriffen wird. Irgendwas muss da also nicht richtig initialisiert sein, oder?

Schonmal Danke im Vorraus!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 13.04.12 15:09 
Hallo und :welcome: in der Entwickler-Ecke?

Wie sieht es denn mit dem temp-Image aus? Hast du den Code, der das erzeugt, nur hier weggelassen, oder fehlt der wirklich? Ein Image muss nämlich auch erzeugt werden. Wobei an der Stelle vermutlich ein TBitmap auch ausreichen würde. ;-)

_________________
We are, we were and will not be.
Ik4rus Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 13.04.12 16:41 
Hey, danke für die schnelle Antwort!
Hm, ich hab das tatsächlich nicht extra erzeugt. Ich hab das ganze jetzt ergänzt um

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
constructor TTileSet.Create(ExeDirection: string; pSetting: string; maxlvl: integer; boss: boolean);
var i,j,k, check, tempcount, rx, ry: integer;
    temp: TImage;

begin


temp:= TImage.Create(temp);

if (pSetting= 'cave'then...
begin


und sicherheitshalber

ausblenden Delphi-Quelltext
1:
2:
3:
4:
constructor TTile.Create;
begin
  self.Image:= TImage.Create(Image);
end;


Jetzt kommt die AccessViolation schon bei temp:= TImage.Create(temp);. Wie kann es denn sein, dass mein Konstruktor keine Zugriffrechte auf seine eigenen Variablen hat?

es sollte eigentlich schon ein Image sein, für den Fall, dass ich später noch mit Canvas rumfummeln will :)
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 13.04.12 17:11 
Du erzeugst im ersten Fall mit einer nicht initialisierten Stackvariable als Owner.
Die Idee an sich, wie sie denn ginge, wäre böse.
Die Idee des Create(Aowner:TComponet) ist dass das Bild vom Owner freigegeben würde bei der Freigabe des Owners, wenn die Komponeten ihr eigener Owner wäre und sich bei der Freigabe freigeben würde .freigeben würde .freigeben würde.freigeben würde.freigeben würde.freigeben würde.freigeben würde.
ausblenden Delphi-Quelltext
1:
 temp:= TImage.Create(nil);					


BTW, alles was erzeugt wird muß irgendwo wieder freigegeben werden und wie bereits erwähnt würde TBitmap genügen, hier gibt es auch keinen Owner.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS