![]() |
AW: Zugriffsverletzung??
Hmm, also was mich wundert ist folgendes:
Du hast 22 Zeilen in der Memo und willst 20 Sterne erzeugen. Star[1].PosX := StrToInt(MemoLoadPos.Lines[2]); Star[1].PosY := StrToInt(MemoLoadPos.Lines[3]); Müssten dir da nicht die Zeilen ausgehen? Versuch den Pos fixe Werte erstmal zuzuweisen, es könnte ja auch sein, dass die Einträge in der Memo sich nicht in einen Integer konvertieren lassen. (Da ich die Einträge nicht sehen kann nur ne Vermutung)
Code:
Star[1].PosX := 10;
Star[1].PosY := 10; |
AW: Zugriffsverletzung??
Zitat:
Delphi-Quellcode:
Somit in diesem Beispiel bitte
foo := TFoo.Create;
Delphi-Quellcode:
for i := 1 to 20 do
Star[ i ] := TStar.Create; |
AW: Zugriffsverletzung??
Zitat:
Delphi-Quellcode:
Ansonsten kann es nicht schaden, wenn du in den Projektoptionen mal die Überlauf- und die Bereichsprüfung aktivierst.
for i := 1 to 20 do
begin Star[i] := TStar.Create; Star[i].PosX := ... |
AW: Zugriffsverletzung??
Code:
type TFormLvl = class(TForm) {} end; TSpielfigur = class {} end; TStar = class Found : Boolean; PosX, PosY : integer; procedure Shine; procedure Find; procedure Fly; private { Private-Deklarationen } public { Public-Deklarationen } end; var FormLvl : TFormLvl; Spielfigur : TSpielfigur; Star : Array[1..20] of TStar; MoveRight, MoveLeft, Fall : Boolean; JumpCount, SpLeft, SpTop, SpStartX, SpStartY : integer; implementation {$R *.dfm} procedure TFormLvl.StarCreate3; var i : integer; begin MemoLoadPos.Lines.LoadFromFile('..\Level\1\Pos.txt'); for i := 1 to 20 do Star[i].Create; Star[1].PosX := StrToInt(MemoLoadPos.Lines[2]); Star[1].PosY := StrToInt(MemoLoadPos.Lines[3]); Star[2].PosX := StrToInt(FormLvl.MemoLoadPos.Lines[4]); Star[2].PosY := StrToInt(FormLvl.MemoLoadPos.Lines[5]); Star[3].PosX := StrToInt(FormLvl.MemoLoadPos.Lines[6]); Star[3].PosY := StrToInt(FormLvl.MemoLoadPos.Lines[7]); Star[4].PosX := StrToInt(FormLvl.MemoLoadPos.Lines[8]); Star[4].PosY := StrToInt(FormLvl.MemoLoadPos.Lines[9]); Star[5].PosX := StrToInt(FormLvl.MemoLoadPos.Lines[10]); Star[5].PosY := StrToInt(FormLvl.MemoLoadPos.Lines[11]); Star[6].PosX := StrToInt(FormLvl.MemoLoadPos.Lines[12]); Star[6].PosY := StrToInt(FormLvl.MemoLoadPos.Lines[13]); ImgStar1_1.Left := Star[1].PosX; ImgStar1_1.Top := Star[1].PosY; end; procedure TFormLvl.FormCreate(Sender: TObject); begin DoubleBuffered := true; MediaPlayer1.Play; Spielfigur.BorderLoad; StarCreate3; Spielfigur.Move; //hier wird der Fehler angezeigt SpLeft := SpStartX; // MLeft und MTop sind die aktuellen Koordinaten der Spielfigur, SpTop := SpStartY; // MStartX und MStartY sind die Startkoordinaten am Anfang des Spiels end; procedure TSpielfigur.Move; begin if MoveRight then SpLeft := SpLeft + 10; //MoveRight und MoveLeft werden auf den Cursortasten if MoveLeft then SpLeft := SpLeft - 10; // true oder false gesetzt. Hat noch nie Probleme end; |
AW: Zugriffsverletzung??
Zitat:
Delphi-Quellcode:
Es lag halt nur ein Fehler in der Instanzerzeugung vor :)
begin ... end
Hmmm ... der Fehler ist immer noch in dem Quellcode
Delphi-Quellcode:
Ändern auf
Star[ i ].Create;
Delphi-Quellcode:
Star[ i ] := TStar.Create;
|
AW: Zugriffsverletzung??
WAHNSINN - ES KLAPPT!!!!!! Vielen, vielen Dank für eure Hilfe!
Der Fehler lag wirklich bei dem
Code:
. Stattdessen
Star[i].Create;
Code:
und es funktioniert!!!
Star[i] := TStar.Create
Ihr habt mein Ostern gerettet! 1000 Dank!! |
AW: Zugriffsverletzung??
Noch ein Vorschlag zur Optimierung wo du dir später viel Arbeit sparen wirst:
Zitat:
Delphi-Quellcode:
findcomponent
Code:
Du kannst in einer Schleife alle Zuweisungen machen, bist nicht von der Anzahl der Sterne in einem Level abhängig (also kann ein Level auch mal mehr oder weniger Sterne haben)
TImage(findcomponent('ImgStar'+inttostr(i))).left := Star[i].PosX;
Die ImgStar Bilder kannst du natürlich auch zur Laufzeit erzeugen. So bleibt dein Spiel dynamisch und ein neues Level kann über die Ladefile erstellt werden, auch wenns mehr als 20 Sterne sind. |
AW: Zugriffsverletzung??
Oder noch besser packe diese auch in einen Array oder eine Liste oder verwende eine Imageliste
|
AW: Zugriffsverletzung??
Wow, super Tipp, vielen Dank! Davon habe ich noch nie gehört, aber das ist wirklich eine viel bessere Lösung!!
Denkst du, man kann aus dem Rest auch eine Schleife machen?
Code:
Star[i].PosX müsste von 1 bis 20 gehen, MemoLoadPos.Lines[i] von 2 bis 42. Geht das?Star[1].PosX := StrToInt(MemoLoadPos.Lines[2]); Star[1].PosY := StrToInt(MemoLoadPos.Lines[3]); Star[2].PosX := StrToInt(MemoLoadPos.Lines[4]); Star[2].PosY := StrToInt(MemoLoadPos.Lines[5]); Star[3].PosX := StrToInt(MemoLoadPos.Lines[6]); Star[3].PosY := StrToInt(MemoLoadPos.Lines[7]); ... |
AW: Zugriffsverletzung??
Zitat:
Delphi-Quellcode:
Ciao,
for i := 1 to 20 do Star[i] := TStar.Create; // <==
Star[1].PosX := ... Ralf |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 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