AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung??

Ein Thema von Michelle · begonnen am 23. Apr 2011 · letzter Beitrag vom 26. Apr 2011
Antwort Antwort
Seite 2 von 3     12 3      
Zibelas

Registriert seit: 23. Apr 2011
5 Beiträge
 
#11

AW: Zugriffsverletzung??

  Alt 23. Apr 2011, 19:41
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;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Zugriffsverletzung??

  Alt 23. Apr 2011, 19:45
Füge mal begin..end ein
Delphi-Quellcode:
for i := 1 to 20 do Star[i].Create;
begin
  Star[1].PosX := ... //wie oben beschrieben

  ImgStar1.Left := Star[1].PosX
  ImgStag1.Top := Star[1].PosY;
end;
So wird aber keine Instanz erzeugt, sondern einfach nur der Constructor (verhält sich hierbei wie ein Methode) einer nicht instantierten Klasse.
foo := TFoo.Create; Somit in diesem Beispiel bitte
Delphi-Quellcode:
for i := 1 to 20 do
  Star[ i ] := TStar.Create;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#13

AW: Zugriffsverletzung??

  Alt 23. Apr 2011, 19:51
Füge mal begin..end ein
Delphi-Quellcode:
for i := 1 to 20 do Star[i].Create;
begin
  Star[1].PosX := ... //wie oben beschrieben

  ImgStar1.Left := Star[1].PosX
  ImgStag1.Top := Star[1].PosY;
end;
Das BEGIN natürlich noch vor das Create (und natürlich mit der richtigen Variante des Create)

Delphi-Quellcode:
for i := 1 to 20 do
begin
  Star[i] := TStar.Create;
  Star[i].PosX := ...
Ansonsten kann es nicht schaden, wenn du in den Projektoptionen mal die Überlauf- und die Bereichsprüfung aktivierst.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Michelle

Registriert seit: 18. Dez 2010
21 Beiträge
 
Delphi 7 Professional
 
#14

AW: Zugriffsverletzung??

  Alt 23. Apr 2011, 20:11
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;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

AW: Zugriffsverletzung??

  Alt 23. Apr 2011, 20:11
Aber ich will doch nur das Star[i].Create 20 mal wiederholen. Das andere tipp ich 20 mal ein, weil ich ja jedes einzelne Bild verschieben will und ich keinen Array of Image habe sondern nur 20 einzelne Bilder ImgStar1, ImgStar2, ...
Darum erübrigt sich das mit dem begin ... end Es lag halt nur ein Fehler in der Instanzerzeugung vor

Hmmm ... der Fehler ist immer noch in dem Quellcode
Star[ i ].Create; Ändern auf
Star[ i ] := TStar.Create;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (23. Apr 2011 um 20:14 Uhr)
  Mit Zitat antworten Zitat
Michelle

Registriert seit: 18. Dez 2010
21 Beiträge
 
Delphi 7 Professional
 
#16

AW: Zugriffsverletzung??

  Alt 23. Apr 2011, 20:18
WAHNSINN - ES KLAPPT!!!!!! Vielen, vielen Dank für eure Hilfe!
Der Fehler lag wirklich bei dem
Code:
Star[i].Create;
. Stattdessen
Code:
Star[i] := TStar.Create
und es funktioniert!!!
Ihr habt mein Ostern gerettet! 1000 Dank!!
  Mit Zitat antworten Zitat
Zibelas

Registriert seit: 23. Apr 2011
5 Beiträge
 
#17

AW: Zugriffsverletzung??

  Alt 23. Apr 2011, 20:23
Noch ein Vorschlag zur Optimierung wo du dir später viel Arbeit sparen wirst:

Zitat:
Das andere tipp ich 20 mal ein, weil ich ja jedes einzelne Bild verschieben will und ich keinen Array of Image habe sondern nur 20 einzelne Bilder ImgStar1, ImgStar2
Nutz findcomponent
Code:
TImage(findcomponent('ImgStar'+inttostr(i))).left := Star[i].PosX;
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)

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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Zugriffsverletzung??

  Alt 23. Apr 2011, 20:29
Oder noch besser packe diese auch in einen Array oder eine Liste oder verwende eine Imageliste
Markus Kinzler
  Mit Zitat antworten Zitat
Michelle

Registriert seit: 18. Dez 2010
21 Beiträge
 
Delphi 7 Professional
 
#19

AW: Zugriffsverletzung??

  Alt 23. Apr 2011, 20:31
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[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]);

  ...
Star[i].PosX müsste von 1 bis 20 gehen, MemoLoadPos.Lines[i] von 2 bis 42. Geht das?
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#20

AW: Zugriffsverletzung??

  Alt 23. Apr 2011, 20:36
Ich habe eine Prozedur "FormCreate", während der ich die Prozedur StarCreate aufrufe. (In StarCreate macht er die Instanzen

Code:
procedure TFormLvl.StarCreate;
var i : integer;
begin
  for i := 1 to 20 do Star[i].Create;
  Star[1].PosX := ... //wie oben beschrieben

  ImgStar1.Left := Star[1].PosX;
  ImgStag1.Top := Star[1].PosY;
end;
Du musst das Ergebnis, das der Constructor liefert in dem Array speichern und nicht nur einfach den Constructor aufrufen:

Delphi-Quellcode:
for i := 1 to 20 do Star[i] := TStar.Create; // <==
Star[1].PosX := ...
Ciao,
Ralf
Ralf Kaiser
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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:29 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