Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi abs funktioniert nicht (https://www.delphipraxis.net/145915-abs-funktioniert-nicht.html)

omata 10. Jan 2010 21:06

Re: abs funktioniert nicht
 
Ok, jetzt sehe ich was du meinst.

So geht das aber nicht! Dann musst du dein Konzept umstellen. Du kannst nicht in einer Routine eine Schleife haben und in einer anderen auf deren Zählwert zugreifen. So kann man nicht programmieren.

hansdieter11 10. Jan 2010 21:07

Re: abs funktioniert nicht
 
Das ist klar.
Aber wie löse ich das bzw. wo mache ich die ABS-Abfrage rein, sodass alles geht ? :)

omata 10. Jan 2010 21:10

Re: abs funktioniert nicht
 
Dafür muss man erstmal verstehen, was du überhaupt machen willst und das muss ganz anders aufgebaut werden.

Der erste Ansatz wäre erstmal nur einen einzigen Timer für alles zubenutzen.

Dann musst du eben jeweils für jedes Objekt nachschauen, ob es mit einem anderen kollidiert.

hansdieter11 10. Jan 2010 21:23

Re: abs funktioniert nicht
 
Delphi-Quellcode:
procedure TForm1.TiRaumschiffTimer(Sender: TObject);
var r,i: integer;
begin
  FOR r:=1 TO number DO
    begin
     IF Raumschiff[r] <> nil THEN
       begin
         Raumschiff[r].GoRight;
         ShRaumschiff[r].Left := Raumschiff[r].xCoord;

         IF Raumschiff[r].xCoord > 700 THEN
           begin
             Raumschiff[r].xCoord := -50;
             ShRaumschiff[r].Left := Raumschiff[r].xCoord;
           end;
       end;
     end;


  FOR i:=1 TO nummer DO
    begin
      IF Kugel[i] <> nil THEN
        begin
          Kugel[i].GoUp;
          ShKugel[i].Top := Kugel[i].yCoord;
        end;
    end;

   If (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) and
      (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) then
     begin
       Raumschiff[r].Destroy;
       Abgeschossen := Abgeschossen+1;
     end;

  LaRaumschiffe.caption := inttostr(Abgeschossen);
end;
[Warnung] Unit1.pas(153): FOR-Schleifenvariable 'r' kann nach Durchlauf undefiniert sein

[Warnung] Unit1.pas(153): FOR-Schleifenvariable 'i' kann nach Durchlauf undefiniert sein

Funktioniert leider nicht. :(
Oder was ist mein Fehler ?

omata 10. Jan 2010 21:27

Re: abs funktioniert nicht
 
Die Meldung ist doch eindeutig. Du kannst nicht auf eine Laufvariable einer FOR-Schleife außerhalb der Schleife zugreifen.
Also entweder den Wert in einer anderen Variablen abspeichern oder die zweite Schleife innerhalb der ersten notieren? Das kommt darauf an, was man machen will.

Klaus01 10. Jan 2010 21:31

Re: abs funktioniert nicht
 
Guten Abend,

du nutzt die Schleifenvariablen r und i nach der Schleife.
Da können sie einen undefinierten Wert haben.

In Deinem Fall hat r den Wert number
und i den Wert nummer.

Wenn in der Schleife ein Überprüfungskriterium zutrifft
solltest Du den Wert von r bzw. i in einer separaten Variable speichern.

Grüße
Klaus

hansdieter11 10. Jan 2010 21:43

Re: abs funktioniert nicht
 
Es wird nie mehr was glaube ich :D

Delphi-Quellcode:
procedure TForm1.TiRaumschiffTimer(Sender: TObject);
var r,i: integer;
begin
  FOR i:=1 TO nummer DO
  begin
  FOR r:=1 TO number DO
    begin
     IF Raumschiff[r] <> nil THEN
       begin
         Raumschiff[r].GoRight;
         ShRaumschiff[r].Left := Raumschiff[r].xCoord;

         IF Raumschiff[r].xCoord > 700 THEN
           begin
             Raumschiff[r].xCoord := -50;
             ShRaumschiff[r].Left := Raumschiff[r].xCoord;
           end;

         If (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) and
            (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) then
           begin
             Raumschiff[r].Free;
             Raumschiff[r] := nil;
             Abgeschossen := Abgeschossen+1;
           end;
       end;
     end;

     IF Kugel[i] <> nil THEN
       begin
         Kugel[i].GoUp;
         ShKugel[i].Top := Kugel[i].yCoord;
       end;
     end;

  LaRaumschiffe.caption := inttostr(Abgeschossen);
Stürzt wieder sofort ab. Habe jetzt alles so geändert, wie vorgeschlagen.

omata 10. Jan 2010 21:45

Re: abs funktioniert nicht
 
Du prüfst ja auch nicht (überall) ob du überhaupt auf die Kugel zugreifen darfst.

Setzt einen Breakpoint, schau dir an, wo das was du dir überlegt hast nicht mehr mit dem übereinstimmt, was passiert und ändere das, was falsch läuft ab.

So programmiert man.

Klaus01 10. Jan 2010 21:47

Re: abs funktioniert nicht
 
Delphi-Quellcode:
 
FOR i:=1 TO nummer DO
  begin
    FOR r:=1 TO number DO
      begin
        IF Raumschiff[r] <> nil THEN
          begin
            Raumschiff[r].GoRight;
            ShRaumschiff[r].Left := Raumschiff[r].xCoord;

            IF Raumschiff[r].xCoord > 700 THEN
              begin
                Raumschiff[r].xCoord := -50;
                ShRaumschiff[r].Left := Raumschiff[r].xCoord;
              end;

            If (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) and
              (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) then
              begin
                Raumschiff[r].Free; // Raumschiff r wird freigegeben und beim nächsten Durchlauf i+1 kracht es
                Raumschiff[r] := nil;
                Abgeschossen := Abgeschossen+1;
              end;
          end;
    end;
[edit] das ist natürlich Mumpitz, denn Du prüfst ja auf <> nil im Schleifenbegin


Grüße
Klaus

omata 10. Jan 2010 21:53

Re: abs funktioniert nicht
 
Zitat:

Zitat von Klaus01
[edit] das ist natürlich Mumpitz, denn Du prüfst ja auf <> nil im Schleifenbegin

Was soll das jetzt. Hat er denn immer soviele Raumschiffe wie Kugeln?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 Uhr.
Seite 2 von 4     12 34      

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