![]() |
Zugriffsverletzung bei if in einer for-Schleife
Hi Leute,
ich hab folgenden Code:
Delphi-Quellcode:
:arrow:
var I: Integer;
Image: Array[1..13] of TImage; begin for I := 0 to 12 do if (Image[I+1].Top = 96) and (Image[I+1].Left = 8) then Image[I+1].Top := 48 else if (Image[I+1].Top = 48) and (Image[I+1].Left = 536) then Image[I+1].Top := 96 else if (Image[I+1].Top = 96) and (Image[I+1].Left = 536) then Image[I+1].Top := 144 else if (Image[I+1].Top = 144) and (Image[I+1].Left >= 9)then Image[I+1].Left := Image[I+1].Left - 8 else if (Image[I+1].Top = 144) and (Image[I+1].Left = 8) then Image[I+1].Top := 96 else Image[I+1].Left := Image[I+1].Left + 8; end; allerdings krieg ich in der forschleife schon beim zweiten mal Image[I+1] (Image[I+1].Left = 8) eine zugriffsverletzung, die sich dauernd wiederholt(durch die schleife). was mache ich falsch??? :?: |
Re: Zugriffsverletzung bei if in einer for-Schleife
Kanns sein, dass du die Objekte nicht erstellt hast?
Da sollte für jedes Objekt eine Instanz von TImage zugewiesen werden. |
Re: Zugriffsverletzung bei if in einer for-Schleife
ich hab alle erstellt
|
Re: Zugriffsverletzung bei if in einer for-Schleife
aehm, hast Du schonmal irgendwo
Image[0].create oder ähnliches gemacht ansonsten sind Deine Instanzen von TImage nicht existend. Zeig uns doch mal etwas mehr Code. So ist anzunehmen das sich alles in einer Prozedur/Methode abspielt und Du mit einem lokalem Array of TImage arbeitest. Grüße Klaus [edit] war wieder einer schneller, aber sehe ich auch so [/edit] |
Re: Zugriffsverletzung bei if in einer for-Schleife
Zitat:
|
Re: Zugriffsverletzung bei if in einer for-Schleife
Zitat:
|
Re: Zugriffsverletzung bei if in einer for-Schleife
Liste der Anhänge anzeigen (Anzahl: 1)
also, bisher war nicht dabei, drum hier das ganze. also das ding ist für physik :mrgreen:
|
Re: Zugriffsverletzung bei if in einer for-Schleife
Delphi-Quellcode:
Dein Image1 aus der Interfacekonfiguration ist nicht gleich image[i+1] wenn i = 0.
TForm1 = class(TForm)
Timer1: TTimer; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Panel5: TPanel; Panel6: TPanel; Panel7: TPanel; Panel8: TPanel; Image1: TImage; Image2: TImage; Image3: TImage; Image4: TImage; Image5: TImage; Image6: TImage; Image7: TImage; Image8: TImage; Image9: TImage; Image10: TImage; Image11: TImage; Image12: TImage; Image13: TImage; Image14: TImage; Image15: TImage; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); var I: Integer; Image: Array[1..13] of TImage; begin for I := 0 to 12 do if (Image[I+1].Top = 96) and (Image[I+1].Left = 8) then Image[I+1].Top := 48 else if (Image[I+1].Top = 48) and (Image[I+1].Left = 536) then Image[I+1].Top := 96 else if (Image[I+1].Top = 96) and (Image[I+1].Left = 536) then Image[I+1].Top := 144 else if (Image[I+1].Top = 144) and (Image[I+1].Left >= 9)then Image[I+1].Left := Image[I+1].Left - 8 else if (Image[I+1].Top = 144) and (Image[I+1].Left = 8) then Image[I+1].Top := 96 else Image[I+1].Left := Image[I+1].Left + 8; end; Das mußt Du dann anders lösen, wenn ich mich recht erinnere geht das mit FindComponent, aber da wissen andere besser drüber Bescheid. Kannst Dir mal diesen Thread anschauen, ähnliches Problem wie Deines ![]() Eine andere Möglichkeit ist, Du erstellst Dir die Images zur Laufzeit. Dann kannst Du die Arraystruktur verwenden. Grüße Klaus |
Re: Zugriffsverletzung bei if in einer for-Schleife
Also so:
Delphi-Quellcode:
oder wie? :?: :wiejetzt:
var I: Integer;
Image: Array[1..13] of TImage; begin for I := 0 to 12 do if (FindComponent(Image[I+1]).Top = 96) and (FindComponent(Image[I+1])Left = 8) then FindComponent(Image[I+1]).Top := 48 else if (FindComponent(Image[I+1]).Top = 48) and (FindComponent(Image[I+1]).Left = 536) then FindComponent(Image[I+1]).Top := 96 else if (FindComponent(Image[I+1]).Top = 96) and (FindComponent(Image[I+1]).Left = 536) then FindComponent(Image[I+1]).Top := 144 else if (FindComponent(Image[I+1]).Top = 144) and (FindComponent(Image[I+1]).Left >= 9)then FindComponent(Image[I+1]).Left := FindComponent(Image[I+1]).Left - 8 else if (FindComponent(Image[I+1]).Top = 144) and (FindComponent(Image[I+1]).Left = 8) then FindComponent(Image[I+1]).Top := 96 else FindComponent(Image[I+1]).Left := FindComponent(Image[I+1]).Left + 8; end; |
Re: Zugriffsverletzung bei if in einer for-Schleife
Delphi-Quellcode:
So ungefähr, der Rest sollte dann einfach sein
for i:= 1 to 13 do begin
if (FindComponent("Image"+IntToStr(i)).Left = 96) and //... |
Re: Zugriffsverletzung bei if in einer for-Schleife
sie meinten es so:
Delphi-Quellcode:
Ich hab mir erlaubt es zu formatieren
var I: Integer;
begin for I := 1 to 13 do begin with (FindComponent('Image' + IntToStr(I)) as TImage) do begin if (Top = 96) and (Left = 8) then Top := 48 else if (Top = 48) and (Left = 536) then Top := 96 else if (Top = 96) and (Left = 536) then Top := 144 else if (Top = 144) and (Left >= 9) then Left := Left - 8 else if (Top = 144) and (Left = 8) then Top := 96 else Left := Left + 8; end; end; end; |
Re: Zugriffsverletzung bei if in einer for-Schleife
danke dafür, aber ich hab jetzt wieder ein problem.
Delphi-Quellcode:
beim end fon der forschleife(die mit J), komm der error:
procedure TForm1.Timer1Timer(Sender: TObject);
var I: Integer; J: Integer; begin for I := 1 to 13 do begin if (for J := 1 to 13 do begin (((FindComponent('Image' + IntToStr(J)) as TImage).Left) >= ((FindComponent('Image' + IntToStr(I)) as TImage).Left + 8)) end;) then ((FindComponent('Image' + IntToStr(I)) as TImage).Left) := (FindComponent('Image' + IntToStr(I)) as TImage).Left else if ((FindComponent('Image' + IntToStr(I)) as TImage).Top = 96) and ((FindComponent('Image' + IntToStr(I)) as TImage).Left = 8) then (FindComponent('Image' + IntToStr(I)) as TImage).Top := 48 else if ((FindComponent('Image' + IntToStr(I)) as TImage).Top = 48) and ((FindComponent('Image' + IntToStr(I)) as TImage).Left = 536) then (FindComponent('Image' + IntToStr(I)) as TImage).Top := 96 else if ((FindComponent('Image' + IntToStr(I)) as TImage).Top = 96) and ((FindComponent('Image' + IntToStr(I)) as TImage).Left = 536) then (FindComponent('Image' + IntToStr(I)) as TImage).Top := 144 else if ((FindComponent('Image' + IntToStr(I)) as TImage).Top = 144) and ((FindComponent('Image' + IntToStr(I)) as TImage).Left >= 9) then (FindComponent('Image' + IntToStr(I)) as TImage).Left := (FindComponent('Image' + IntToStr(I)) as TImage).Left - 8 else if ((FindComponent('Image' + IntToStr(I)) as TImage).Top = 144) and ((FindComponent('Image' + IntToStr(I)) as TImage).Left = 8) then (FindComponent('Image' + IntToStr(I)) as TImage).Top := 96 else (FindComponent('Image' + IntToStr(I)) as TImage).Left := (FindComponent('Image' + IntToStr(I)) as TImage).Left + 8; end; end; Statement expected, but expression of 'Boolean' found. was muss ich ändern? |
Re: Zugriffsverletzung bei if in einer for-Schleife
Delphi-Quellcode:
Da ist das "if (" zu viel...wenn das weg ist müsste es gehen!
if (for J := 1 to 13 do
Flare |
Re: Zugriffsverletzung bei if in einer for-Schleife
btw: FindComponent würd ich nicht in nen Timer packen. (FindComponent braucht seine Zeit)
Such dir deine Bildchen beim Start (OnCreate) mit FindComponent zusammen und wirf sie dann in dein/ein Array. Danach kannste gemütlich/einfach mit dem array arbeiten.
Delphi-Quellcode:
For i := 1 To 13 Do bildchen[i] := TImage(FindComponent('Image' + IntToStr(i)));
|
Re: Zugriffsverletzung bei if in einer for-Schleife
@Flare: aber ich muss es prüfen.
wie soll man sonst sehen, ob wenn er sich bewegt nicht ein anderes bild "rammt"? -- @TeronG: aber wie bringe ich die for schleife unter? |
Re: Zugriffsverletzung bei if in einer for-Schleife
Dann solltest du überlegen, ob diese Art von Kollisionsabfrage eine geeignete ist :mrgreen:
Die abfrage sollte also nicht genau an dieser Stelle stehen... Flare |
Re: Zugriffsverletzung bei if in einer for-Schleife
wieso nicht? wenn es sich bewegt hat auf ein anderes ist es zu spät. :wiejetzt: :shock: :?
|
Re: Zugriffsverletzung bei if in einer for-Schleife
Ich kapier gerade nicht, wie du mit diesem Fetzen Quellcode eine Kollisionsabfrage realisieren möchtest. Immerhin werden die Images auf jeden Fall bewegt, egal ob die sich übershcneiden oder nicht. Von der Kollisionsabfrage hast du bisher noch nichts reingebracht.
Flare |
Re: Zugriffsverletzung bei if in einer for-Schleife
Zitat:
Delphi-Quellcode:
und dann die for schleife einfach in FormCreate "reinwerfen" ...
var
Form1: TForm1; Image : array [1..5] of TImage; :gruebel: das sollts eigentlich gewesen sein .. |
Re: Zugriffsverletzung bei if in einer for-Schleife
und wie würdest du die abfrage machen? ich weiß nicht, wie sonnst. :wiejetzt:
@TeronG: die soll ja immer ausgeführt werden die schleife. die bilder sollen ja nicht aufeinander"fahren". |
Re: Zugriffsverletzung bei if in einer for-Schleife
Du müsstest also (am besten in eine Prozedur auslagern, ist übersichtlicher) etwa 3 For-Schleifen (Eine für Jedes Auto, eine für alle Kollisionsautos und eine für die 4 Richtungen) benutzen und eben jedes mal abfragen ob ein Auto sich mit dem Anderen überschneiden würde. Wobei ich glaube, dass du die Richtungs-Schleife weglassen kannst.
Flare |
Re: Zugriffsverletzung bei if in einer for-Schleife
was verstehst du darunter? ich versteh es so, wie ich es gemacht habe.
|
Re: Zugriffsverletzung bei if in einer for-Schleife
Stimmt...dann habe ich bis jetzt immer die Hälfte deines Codes übersehen :wall:
Aber dann hast du doch die Abfrage schon dort drin und musst die nicht am Anfang machen. Und was wolltest du genau mit diesem "if (" erreichen? (Abgesehen davon, dass da sowieso noch die Klammer zu und der Asudruck gefehlt haben :mrgreen: ) Flare |
Re: Zugriffsverletzung bei if in einer for-Schleife
ein image is 49 pixel lang, und wenn ich 8 fahre brauch das vor dem 57 pixel vorsprung. da die reihenfolge aber ständig änder, will prüf ich es mit ner forschgleife prüfen zu allen.
|
Re: Zugriffsverletzung bei if in einer for-Schleife
Das meine ich nicht...ich wollte wissen, was du dir bei dieser Konstruktion gedacht hast!
Delphi-Quellcode:
Ich sehe da nämlich keinen Sinn dahinter...eine For-Schleife übergibt doch keine Bool'schen Werte...
if (for J := 1 to 13 do
Flare |
Re: Zugriffsverletzung bei if in einer for-Schleife
wie würdest du es denn lösen??? :mrgreen: es wäre schön mal ne ordentliche lösung zu bekommen, da ich es morgen für ein referat brauche. :mrgreen: :mrgreen: :mrgreen: :stupid: :thumb:
|
Re: Zugriffsverletzung bei if in einer for-Schleife
Zitat:
|
Re: Zugriffsverletzung bei if in einer for-Schleife
aber dann bringt es doch nichts, dann läuft das doch auch weiter, wenn es so ist, dass eins gerammt wird.
|
Re: Zugriffsverletzung bei if in einer for-Schleife
Zitat:
Langsam hab ich das Gefühl, du verkackeierst hier alle... :gruebel: |
Re: Zugriffsverletzung bei if in einer for-Schleife
also nocmal langsam:
alle bilder(13 stück) laufen hintereinander in die form eines rechteckes ab. dabei ist das bild 13 vorne. so laufen alle immer erst auf das vordere. unds das will ich verhindern. außerdem kommt es noch vor, das die reihen folge sich ändert, so das die reihe später am anfang 13, 10, 4, 3, 7 und so weiter sein kann. |
Re: Zugriffsverletzung bei if in einer for-Schleife
Zitat:
|
Re: Zugriffsverletzung bei if in einer for-Schleife
sach mir mal jetzt ert, wie ich an ne funktion paramter übergeben kann. dann löss ich es so.
|
Re: Zugriffsverletzung bei if in einer for-Schleife
Ich geh mal davon aus, daß das nich so unfreundlich gemeint war, wie es klang.
Zu deiner "Frage": Am besten liest du es zB hier nach: ![]() Was das jetzt allerdings mit dem falschen "if (" zu tun hat, leuchtet mir nich ein. Solange du das nich rausmachst, kannst du das andere Zeugs 100 mal in Funktionen auslagern, dein Programm wird trotzdem nicht compiliert... |
DP-Maintenance
Dieses Thema wurde von "Sharky" von "Multimedia" nach "Object-Pascal / Delphi-Language" verschoben.
Mit Multimedia hat das denke ich nichts zu tun. Hier geht es um Grundlagen von Pascal. |
Re: Zugriffsverletzung bei if in einer for-Schleife
Hai TurboMartin,
prüfe doch bitte mal die [Shift]-Taste auf deiner Tastatur. Mir scheint diese ist defekt. Anders kann ich mir nicht erklären das Du jedes Wort klein schreibst und es dadurch schwer wird deine Postings zu lesen. |
Re: Zugriffsverletzung bei if in einer for-Schleife
Hallo,
wenn man sich die einzelnen Beiträge so durchliest, dann meint man, er wolle die komplette Lösung seines Problemes. Also so in etwa: "Ich hab folgende Hausaufgabe - wer macht sie mir?". Ich bezieh mich auf seinen Beitrag, indem er angibt, dass er es morgen für ein Referat braucht. Sorry, wenn ich jetzt mit diesem Beitrag off-Topic geh, aber so kommts mir nunmal vor. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:49 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