Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Allgemeines Problem in meinem Programm/ Threads!? (https://www.delphipraxis.net/148436-allgemeines-problem-meinem-programm-threads.html)

Simme 4. Mär 2010 21:56

Re: Allgemeines Problem in meinem Programm/ Threads!?
 
Zitat:

Zitat von Sir Rufo
Ich verstehe gar nicht, warum du mit/zu jeder Bombe ein Image hast.

Wieso verstehst du das nicht? Ich hab ja nicht für jeden Bombenzustand ein Image. Sondern nur für jede Bombe. Dieses Image wird immer erzeugt, wenn man die entsprechende Taste zum Bombenlegen drückt. Und wenn die Bombe explodiert ist, soll dieses Image wieder gelöscht werden aus der Liste. So mein Gedankengang.

Zitat:

Zitat von Sir Rufo
Eine Bombe hat 3 Zustände

0 - warten
1 - explodieren
2 - explodiert

Diese Zustände würde ich mir in einer Klasse TBombe merken.

Wenn du jetzt eine ImageList nimmst mit 3 Bildern jeweils eins für jeden Zustand,
dann nimmst du je nach Zustand aus der ImageList einfach das Bild raus.

Das macht die ganze Verwaltung wesentlich einfacher.

Ich finde, es macht die Verwaltung nicht einfacherer. Das ist ja auch nicht mein Problem. Es geht halt um die Images. Aber du hast wahrscheinlich einen anderen Denkansatz als ich... :roll:

Liebe Grüße,
Simon =)

Sir Rufo 4. Mär 2010 22:05

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:

wicht 4. Mär 2010 22:08

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.

Sir Rufo 4. Mär 2010 22:11

Re: Allgemeines Problem in meinem Programm/ Threads!?
 
Zitat:

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

Ist aber auch nur ein Blick in die :glaskugel:

Der SourceCode ist so geheim, dass wenn er den hier zeigen würde, er uns sofort alle erschießen müsste :mrgreen:

wicht 4. Mär 2010 22:15

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.

Simme 5. Mär 2010 14:24

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:
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;
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.

Zitat:

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

Ja, das mache ich, wie du siehst. Ich hab aber keine Ahnung, ob ich das unsachgemäß mache. Naja, sagt einfach mal bescheid. Wenn ihr noch mehr wollt, sagt bescheid.

Liebe Grüße,
Simon =)

wicht 5. Mär 2010 18:29

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:
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;
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.
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:
for i := Bomben.Count - 1 downto 0 do
begin
  Bomben.Delete(i);
end;
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.. :)

HTH

Simme 6. Mär 2010 23:43

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

DeddyH 6. Mär 2010 23:49

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

Sir Rufo 7. Mär 2010 00:01

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 01:11 Uhr.
Seite 4 von 5   « Erste     234 5      

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