![]() |
'Zugriffsverletzung bei Adresse...' => Fehlermeldung
habe diese Fehlermeldung bekommen und weiss nicht was sie von mir will und wie ich den Fehler wieder beheben kann. kann mir bitte jmd helfen??
hier die meldung: "Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung:'Zugriffsverletzung bei Adresse 004253A0 in Modul 'Project1.exe'. Lesen von Adresse 00000038'. Prozeß wurde angehalten. ..." |
Re: Fehlermeldung?? häh??
Meine Glaskugel sagt mir, dass Du auf ungültigen Speicher zugreifst (Objekte nicht instantiiert o.ä.). Ohne Code kann ich aber auch nur sagen: Häh??
|
Re: Fehlermeldung?? häh??
Ohne nähere Hinweise deinerseits (Code) kann man dir wohl nicht helfen.
Hast du mal den Debugger angeworfen, um den Fehler einzugrenzen? |
Re: Fehlermeldung?? häh??
also hier der quelltext, wenn da [...] steht is es eigtl unwichtig weil
ich an den stellen nur nen feld gefüllt habe:
Delphi-Quellcode:
type
Spieler = record Name : String[20]; SImage : byte; Guthaben : real; Stand : byte; gefae : byte; StrWel : array [0..28] of byte; StrHaeuser: array [0..28, 0..4] of byte; StrMiete : array [0..28, 0..5] of integer; end; [...] private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1 : TForm1; Zaehler: array [0..28] of real; Spiela : array [0..4] of Spieler; k :byte; implementation {$R *.DFM} [...] procedure TForm1.FormCreate(Sender: TObject); var y,x:byte; begin randomize; k:=random(4); y:=55; For x:=1 to 28 do Zaehler[x]:=1; For x:=1 to 4 do begin Spiela[x].stand:=2; Spiela[x].Simage:=y; inc(y); end; For x:=43 to 54 do (Findcomponent('Image'+intToStr(x))as TImage).visible:=false; end; [...] procedure TForm1.BitBtn1Click(Sender: TObject); var i,x,y:byte; begin If k = 5 then k:=1; For x:=43 to 54 do (Findcomponent('Image'+intToStr(x))as TImage).visible:=false; randomize; For i:=1 to 10 do begin x:=random(6)+43; y:=random(6)+49; (Findcomponent('Image'+intToStr(x))as TImage).visible:=true; (Findcomponent('Image'+intToStr(y))as TImage).visible:=true; sleep(100); Application.ProcessMessages; If i <> 10 then begin (Findcomponent('Image'+intToStr(x))as TImage).visible:=false; (Findcomponent('Image'+intToStr(y))as TImage).visible:=false; end; end; HIER KOMMT DER FEHLER IRGENDWO (also hier unten) If Spiela[k].stand = 99 then inc(Spiela[k].gefae); If (((Spiela[k].stand = 99) and ((x-42) = (y-48)))) or (Spiela[k].stand <> 99) or (Spiela[k].gefae = 4)then begin If Spiela[k].stand = 99 then begin Spiela[k].gefae:=0; Spiela[k].stand:=12; end; Spiela[k].stand:=(Spiela[k].stand+(x-42)+(y-48)); If Spiela[k].stand = 42 then Spiela[k].stand:=2; If Spiela[k].stand > 41 then Spiela[k].stand:=(Spiela[k].stand-40); (Findcomponent('Image'+intToStr(Spiela[k].Simage))as TImage).top:=(Findcomponent('Image'+intToStr(Spiela[k].stand))as TImage).top; (Findcomponent('Image'+intToStr(Spiela[k].Simage))as TImage).left:=(Findcomponent('Image'+intToStr(Spiela[k].stand))as TImage).left; If Spiela[k].stand = 32 then begin Spiela[k].stand:=99; (Findcomponent('Image'+intToStr(Spiela[k].Simage))as TImage).top:=(Findcomponent('Image'+intToStr(Spiela[k].stand))as TImage).top; (Findcomponent('Image'+intToStr(Spiela[k].Simage))as TImage).left:=(Findcomponent('Image'+intToStr(Spiela[k].stand))as TImage).left; end; end; inc(k); end; end. |
Re: Fehlermeldung?? häh??
Kannst du eingrenzen, wo der Fehler genau auftritt?
|
Re: Fehlermeldung?? häh??
Und wo kommt der Fehler? Geiz doch nicht so mit Infos :?
|
Re: Fehlermeldung?? häh??
hab ne info in den quelltext gehauen wo ich den fehler vermute
|
Re: Fehlermeldung?? häh??
Dann wirf doch mal den Debugger an.
Welchen Wert hat dann k? besser
Delphi-Quellcode:
If k > 4 then
k:=1; |
Re: Fehlermeldung?? häh??
Vermutet oder sagt Dir das auch der Debugger? Hast schon mal durchgesteppt?
|
Re: Fehlermeldung?? häh??
hallo Bx3 :-) könntest du deinem Beitrag bitte einen aussagekräftigen Titel geben?
Der Fehler kommt wohl bei "TIrgendwas(FindComponent(...)).irgendwas". Weise lieber das Ergebnis von FindComponent erst auf eine Variable zu und prüfe ob diese ungleich nil ist, das Object also auch gefunden wurde. Andere Stellen habe ich im Moment nicht gefunden wo auf ein eventuell nicht instanziertes Object zugegriffen wird. |
Re: Fehlermeldung?? häh??
Ein Tipp, wenn du so eine Meldung bekommst, dann entweder auf F1 klicken oder auf den Hilf-Button. Zuerst kriegst du eine allgemeine Erklärung was eine Fehlermeldung ist. Wenn du dir das durchgelesen hast, dann klickst du oben im Hilfe-Fenster auf Hilfethemen und gibst dort "EAccessViolation" ein. Du bekommst eine Seite mit der Erklärung des Fehlers.
|
Re: Fehlermeldung?? häh??
danke Popov werd ich gleichma machen
- k is nen zufallswert zw 1-4 |
Re: Fehlermeldung?? häh??
Also wenn man sich den Code ansieht, dann liegt der Fehler wahrscheinlich an dem Werk k. Wahrscheinlich ist k größer als in Array definiert.
|
Re: Fehlermeldung?? häh??
Ich meinte beim Auftreten des Fehlers!
|
Re: Fehlermeldung?? häh??
was mir so auffällt ist, dass du im FormCreate bereits mit FindComponent deine Images durchläufst. Warum weißt du sie dann nicht direkt einem Array zu. Wie der Name "FINDcomponent" bereits aussagt werden die Componenten anhand des Namens GESUCHT. Wenn du also überall immer wieder suchst anstelle dir das gefundene zu merken ist das nicht wirklich sehr sinnvoll und performant programmiert. Und wenn du das nur an einer Stelle machen würdest könntest du auch gleich an dieser einen Stelle prüfen ob das Ergebnis von FindComponent <> nil ist und somit wüsstest du schon im Create das dort dein Fehler ist. :-)
Im übrigen fordere ich immer noch einen aussagekräftigen Titel ;-) |
Re: Fehlermeldung?? häh??
also,
hab das jetze so geändert:
Delphi-Quellcode:
bis jetze gehts dann auch, allerdings is der fehler nich immer, sondern
If k > 4 then
k:=1; nur bei ca jeden 4. teststart gekommen, hoffe es lag daran => wenn die componenten da sind kann das gefundene (bzw ja nich gefundene) nil sein oda?? |
Re: Fehlermeldung?? häh??
@Bx3
Nur so nebenbei, hat jetzt nichts mit der Frage zu tun, aber random(4) ergibt kein Wert zwischen 0 und 4, sondern zwischen 0 un 3. Du wirst also nie die 4 haben. Dafür mußt du random(4 + 1) eingeben. Damit bekommst du Werte zwischen 0 und 4. Willst du Werte zwischen 1 und 4, dann random(4) + 1 wählen. |
Re: Fehlermeldung?? häh??
Debug doch lieber erst mal (F7). In einem 100-zeiligen Quellcode ist es für uns sonst fast unmöglich, sicher zu sagen, wo der Fehler liegt. Außerdem kannst du dir dann die Werte der Variablen angucken und die Zugriffsverletzung evtl. sofort sehen.
Mfg |
Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
ähm das weiss ich ja eigtl auch^^
nur habe ich an na andern stelle random(5)+1; und dabei wirklich nie ne 6 erhalten und war mir dann nich mehr dessen sicher |
Re: Fehlermeldung?? häh??
Zitat:
Eventuell könnte man auch ein Array of TImage anlegen und dann durch dieses Array iterieren und nicht auf der Form rumsuchen. |
Re: Fehlermeldung?? häh??
Zitat:
|
Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
random(4 + 1) = random(5) :mrgreen:
Du meinst wohl Random(4) + 1 :wink: |
Re: Fehlermeldung?? häh??
Zitat:
Es geht also nur um die flüssigere Lesbarkeit. |
Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
spass beiseite,
jetze gehts es ja erstma mit der änderung bei 'k' (wenn ihr noch wisst wo^^) wenns wiedermal nich funzen sollte dann melde ich mich wieder, trotzdem nen ganz dickes danke an alle beteiligten und auch für die extrem schnellen antworten ein dickes lob lg Bx3 :sharkylinchen: |
Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
Das hat nix mit Lesbarkeit zu tun, sondern mit dem Rückgabewert.
|
Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
Eventuell hier:
Delphi-Quellcode:
Ansonsten gibt es in dem gezeigten Code keine Stelle wo k über die 4 kommen könnte.
inc(k);
end; end. |
Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
ja schon,
aber es gibt doch keinen grund das da nen fehler kommen könnte, is doch egal obs 4 oda 5 is bzw wirds doch dann eh wieder zurückgesetzt bevor es weiterverwendet wird |
Re: Fehlermeldung?? häh??
Zitat:
Falls man nicht weiß, wie Random nun funktioniert, bringt einem auch das 4 + 1 nichts... |
Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
...
|
Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
Zitat:
|
Re: Fehlermeldung?? häh??
Zitat:
Aber wie gesagt, dau kannst es machen wie du es willst. Ist auch nicht falsch. |
Re: 'Zugriffsverletzung bei Adresse...' => Fehlermeldung
Hi,
das sollte jetzt auch keine Unterstellung sein, dass es falsch ist. Aber selbst bei random(1242532) ist es besser zum Lesen, als random(1242531 + 1). Aber ist, wie Du schon sagtest, Ansichtssache ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 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