Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsverletzung bei if in einer for-Schleife (https://www.delphipraxis.net/69526-zugriffsverletzung-bei-if-einer-schleife.html)

TurboMartin 16. Mai 2006 15:30


Zugriffsverletzung bei if in einer for-Schleife
 
Hi Leute,
ich hab folgenden Code:
Delphi-Quellcode:
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;
:arrow:
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??? :?:

BenjaminH 16. Mai 2006 15:33

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.

TurboMartin 16. Mai 2006 15:34

Re: Zugriffsverletzung bei if in einer for-Schleife
 
ich hab alle erstellt

Klaus01 16. Mai 2006 15:35

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]

mkinzler 16. Mai 2006 15:38

Re: Zugriffsverletzung bei if in einer for-Schleife
 
Zitat:

ich hab alle erstellt
Wo? Kann es sein das du Image doppelt deklariert hast? Du verwendest aber die lokal definierte Version und diese hat lauter leere Referenzen. Falls du auf höhrerer Ebene einen anderen Array mit dem Namen Image hast, entferne die lokale Version.

BenjaminH 16. Mai 2006 15:38

Re: Zugriffsverletzung bei if in einer for-Schleife
 
Zitat:

Zitat von TurboMartin
ich hab alle erstellt

Das sieht in deinem Code da oben aber nicht so aus...

TurboMartin 16. Mai 2006 17:48

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:

Klaus01 16. Mai 2006 17:56

Re: Zugriffsverletzung bei if in einer for-Schleife
 
Delphi-Quellcode:
 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;
Dein Image1 aus der Interfacekonfiguration ist nicht gleich image[i+1] wenn i = 0.
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 http://www.delphipraxis.net/internal...=findcomponent

Eine andere Möglichkeit ist, Du erstellst Dir die Images zur Laufzeit.
Dann kannst Du die Arraystruktur verwenden.

Grüße
Klaus

TurboMartin 16. Mai 2006 20:00

Re: Zugriffsverletzung bei if in einer for-Schleife
 
Also so:
Delphi-Quellcode:
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;
oder wie? :?: :wiejetzt:

Phistev 16. Mai 2006 20:08

Re: Zugriffsverletzung bei if in einer for-Schleife
 
Delphi-Quellcode:
for i:= 1 to 13 do begin
  if (FindComponent("Image"+IntToStr(i)).Left = 96) and //...
So ungefähr, der Rest sollte dann einfach sein

Helmi 16. Mai 2006 20:11

Re: Zugriffsverletzung bei if in einer for-Schleife
 
sie meinten es so:

Delphi-Quellcode:
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;
Ich hab mir erlaubt es zu formatieren

TurboMartin 18. Mai 2006 16:56

Re: Zugriffsverletzung bei if in einer for-Schleife
 
danke dafür, aber ich hab jetzt wieder ein problem.
Delphi-Quellcode:
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;
beim end fon der forschleife(die mit J), komm der error:
Statement expected, but expression of 'Boolean' found.
was muss ich ändern?

Flare 18. Mai 2006 17:00

Re: Zugriffsverletzung bei if in einer for-Schleife
 
Delphi-Quellcode:
if (for J := 1 to 13 do
Da ist das "if (" zu viel...wenn das weg ist müsste es gehen!


Flare

TeronG 18. Mai 2006 17:05

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)));

TurboMartin 18. Mai 2006 17:13

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?

Flare 18. Mai 2006 17:15

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

TurboMartin 18. Mai 2006 17:17

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

Flare 18. Mai 2006 17:19

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

TeronG 18. Mai 2006 17:23

Re: Zugriffsverletzung bei if in einer for-Schleife
 
Zitat:

Zitat von TurboMartin
@TeronG: aber wie bringe ich die for schleife unter?

erstmal machste dein array global
Delphi-Quellcode:
var
  Form1: TForm1;
  Image : array [1..5] of TImage;
und dann die for schleife einfach in FormCreate "reinwerfen" ...

:gruebel: das sollts eigentlich gewesen sein ..

TurboMartin 18. Mai 2006 17:25

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".

Flare 18. Mai 2006 17:30

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

TurboMartin 18. Mai 2006 17:32

Re: Zugriffsverletzung bei if in einer for-Schleife
 
was verstehst du darunter? ich versteh es so, wie ich es gemacht habe.

Flare 18. Mai 2006 17:36

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

TurboMartin 18. Mai 2006 17:41

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.

Flare 18. Mai 2006 17:45

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:
if (for J := 1 to 13 do
Ich sehe da nämlich keinen Sinn dahinter...eine For-Schleife übergibt doch keine Bool'schen Werte...


Flare

TurboMartin 18. Mai 2006 17:52

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:

leddl 18. Mai 2006 17:55

Re: Zugriffsverletzung bei if in einer for-Schleife
 
Zitat:

Zitat von TurboMartin
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:

:roll: Du hast die "ordentliche" Lösung doch schon bekommen. Nimm das "if(" raus, dann passts. Dieses Konstrukt macht so einfach nicht den geringsten Sinn.

TurboMartin 18. Mai 2006 18:06

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.

leddl 18. Mai 2006 18:13

Re: Zugriffsverletzung bei if in einer for-Schleife
 
Zitat:

Zitat von TurboMartin
aber dann bringt es doch nichts, dann läuft das doch auch weiter, wenn es so ist, dass eins gerammt wird.

Nochmal: das "if(" ist weder syntaktisch korrekt (kein boolscher Ausdruck + fehlende abschließende Klammer) noch macht es Sinn (was soll ne For-Schleife als Bedingung?) :roll:

Langsam hab ich das Gefühl, du verkackeierst hier alle... :gruebel:

TurboMartin 18. Mai 2006 18:17

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.

leddl 18. Mai 2006 18:21

Re: Zugriffsverletzung bei if in einer for-Schleife
 
Zitat:

Zitat von TurboMartin
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.

:gruebel: Und? Was willst du damit jetzt sagen? Inwiefern bezieht sich das auf meine Posts? :gruebel: Mach doch einfach, was man dir sagt, dann sollte das auch klappen... Es scheitert ja nicht an der Logik, sondern an dern falschen Syntax, die du eingebaut hast.

TurboMartin 18. Mai 2006 18:28

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.

leddl 18. Mai 2006 18:37

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: http://dsdt.info/grundlagen/sprache/prozfunk.php

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 18. Mai 2006 18:41

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.

Sharky 18. Mai 2006 18:43

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.

Helmi 18. Mai 2006 18:55

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