![]() |
Re: Allgemeines Problem in meinem Programm/ Threads!?
Zitat:
Zitat:
Liebe Grüße, Simon =) |
Re: Allgemeines Problem in meinem Programm/ Threads!?
Also hast du das gleiche Image in jeder Klasse einmal drin und auf dem Formular zeigst du das auch noch mit an.
Ja, dann würde ich mir auch Gedanken über den Speicher machen :mrgreen: |
Re: Allgemeines Problem in meinem Programm/ Threads!?
Löscht du eventuell Bombenobjekte aus der Liste mit Hilfe einer Schleife?
Das könnte bei... unsachgemäßer Vorgehensweise nämlich das mit dem Listenindex erklären :mrgreen: .. Ein herrlicher Fehler den glaube ich fast jeder schonmal gemacht hat. |
Re: Allgemeines Problem in meinem Programm/ Threads!?
Zitat:
Der SourceCode ist so geheim, dass wenn er den hier zeigen würde, er uns sofort alle erschießen müsste :mrgreen: |
Re: Allgemeines Problem in meinem Programm/ Threads!?
Da hast du sowas von Recht. Aber ich würde fast drauf wetten, dass es so ist :stupid: ...
Ich wollte sogar die Erklärung samt Lösungsansatz posten aber... weil es eben :glaskugel: ist, erstmal abwarten ist wohl vernünftiger. |
Re: Allgemeines Problem in meinem Programm/ Threads!?
Macht ihr mich grad dumm? :D
Das Problem ist, dass der Quelltext zum Bombezünden so komplex ist, dass ich das nicht alles mitposten will, vor allem auch, weil ich mich bestimmt dafür schämen müsste, weils sicher sehr viel einfacherer geht. Aber ich versuche, euch den ganzen Code verkürzt zu posten.
Delphi-Quellcode:
Also, an sich lösche ich die Bomben erst aus der Liste, wenn sich keine Bombe mehr auf dem Spielfeld befindet. Denn die Variable bombegelegt sagt, wieviele Bomben sich auf dem Spielfeld noch befinden. Das Problem ist nur, dass das mit dem bombegelegt nicht mehr so funktioniert, wie ursprünglich geplant. Naja.
procedure TForm2.Timer1Timer(Sender: TObject);
var i, e: Integer; gesprengt, item : ARRAY[1..4] of Boolean; itemx, itemy : Array[1..4] of Integer; zeit, x_wert, y_wert, Start : Integer; begin Label5.Caption := IntToStr(Bomben.Count); for i := 0 to Bomben.Count - 1 do //Alle Bomben die es gibt durchgehen begin {...} Spieler1.bombegelegt := Spieler1.bombegelegt - 1; If Spieler1.bombegelegt < 0 Then Spieler1.bombegelegt := 0; If Spieler1.bombegelegt < Spieler1.laufzahl_bombe Then Spieler1.zuendet := 0; end; Label1.Caption := IntToStr(Spieler1.bombegelegt); If (Spieler1.bombegelegt = 0) Then begin Bomben.Delete(i); end; end; Zitat:
Liebe Grüße, Simon =) |
Re: Allgemeines Problem in meinem Programm/ Threads!?
Keine Anhung was in {...} steht, aber da unten wird nichts in einer Schleife aus der Liste gelöscht.
Delphi-Quellcode:
Du greifst einfach unten auf i zu. Ich habe mal gelesen, dass Schleifenvariablen nach der Schleife undefiniert sind oder sein können. Von daher wird dort vermutlich irgendetwas gelöscht, was es in der Liste gar nicht gibt, weil i so ziemlich alles sein kann.
procedure TForm2.Timer1Timer(Sender: TObject);
var i, e: Integer; gesprengt, item : ARRAY[1..4] of Boolean; itemx, itemy : Array[1..4] of Integer; zeit, x_wert, y_wert, Start : Integer; begin Label5.Caption := IntToStr(Bomben.Count); for i := 0 to Bomben.Count - 1 do //Alle Bomben die es gibt durchgehen begin {...} Spieler1.bombegelegt := Spieler1.bombegelegt - 1; If Spieler1.bombegelegt < 0 Then Spieler1.bombegelegt := 0; If Spieler1.bombegelegt < Spieler1.laufzahl_bombe Then Spieler1.zuendet := 0; end; Label1.Caption := IntToStr(Spieler1.bombegelegt); If (Spieler1.bombegelegt = 0) Then begin Bomben.Delete(i); end; end; Wenn du in der Schleife Objekte aus der Liste löschen würdest, solltest du die Schleife anders aufbauen. Weil sobald in der Schleife ein Objekt gelöscht wird, hat die Liste ein Element weniger. Die Schleife merkt davon allerdings nichts und geht bis zum alten Count - 1. Aber das Letzte Element in der Liste fehlt ja jetzt danke dem vorherigen Aufruf von Delete(), das führt auch zu einem Fehler. Lösung: Schleife umdrehen:
Delphi-Quellcode:
Gewöhn dich an den Debugger, damit wärst du da nämlich selbst drauf gekommen, dass du oben nicht in einer Schleife löscht. Ausserdem kann der Debugger Variablenwerte anzeigen - im Delete würdest du dann sehen, was i wirklich ist. Man kommt sehr oft in Situationen, wo das Ding mehr als nützlich ist.. :)
for i := Bomben.Count - 1 downto 0 do
begin Bomben.Delete(i); end; HTH |
Re: Allgemeines Problem in meinem Programm/ Threads!?
Das ist auch nicht der Fehler. An sich ist es logisch, was du gesagt hast. Aber der Fehler besteht weiterhin. Vielleicht hat es noch etwas zu tun mit der allgemeinen Schleife. Muss man da vielleicht auch runterzählen?
Liebe Grüße, Simon |
Re: Allgemeines Problem in meinem Programm/ Threads!?
Wenn das da oben Dein Originalcode ist, sollte Delphi eigentlich eine Warnung ausgeben ("Variable ist nach Schleifendurchlauf undefiniert" oder so ähnlich). Was also heißt: die Schleife rückwärts durchlaufen wie gesagt und innerhalb prüfen, ob das Objekt gelöscht werden sol (und dies dann auch tun).
|
Re: Allgemeines Problem in meinem Programm/ Threads!?
Wieso die schleife rückwärts durchgehen?
Ist eine Möglichkeit ... aber ... da war doch noch der Compiler, der aus Rückwärts auch mal Vorwärts macht oder umgekehrt. M.E. ist es so besser (da hat man es in der Hand - hoffe ich doch :mrgreen: ):
Delphi-Quellcode:
var
idx : integer; begin idx := 0; while idx < Bomben.Count do begin if BombeMussGeloeschtWerden then Bomben.Delete( idx ) else Inc( idx ); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 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