Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

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 2. Mär 2010 16:53

Re: Allgemeines Problem in meinem Programm/ Threads!?
 
Tut mir Leid, aber das ist irgendwie zu hoch für mich. :D Kannst du mir nochmal grob erklären, wie das ganze arbeitet? ...

Sir Rufo 2. Mär 2010 17:11

Re: Allgemeines Problem in meinem Programm/ Threads!?
 
Es wäre jetzt sehr hilfreich, wenn du sagen würdest, was du davon verstehst und was nicht.

Eigentlich wurde alles in dem Projekt hier im Thread schon angesprochen.

wicht 2. Mär 2010 18:01

Re: Allgemeines Problem in meinem Programm/ Threads!?
 
Zu der Sache oben von dir:
Wenn Bomben.Count = 0 ist, dann wirst du irgendwo das

Delphi-Quellcode:
Bomben.Add(Bombe);
(nach Bombe := TBombe.Create, wie in meinem Beispiel) vergessen haben. Weil dies fügt die Bombe eben der Liste hinzu, die du in der Schleife im Timer abarbeiten willst. Wenn man sie nicht hinzufügt, bleibt Count (Anzahl der Elemente in der Liste) natürlich auf 0.

Simme 2. Mär 2010 18:18

Re: Allgemeines Problem in meinem Programm/ Threads!?
 
Danke. Das explodieren klappt erstmal, aber das Problem ist, dass ja dann Count auf 1 bleibt und er somit immer wieder durchgeht durch die Schleife. Wie kann ich denn nur die eine Zeile der Liste wieder löschen, um nicht andere Bomben dabei zu beeinflussen?

Lg,
Simon =)

Sir Rufo 2. Mär 2010 18:27

Re: Allgemeines Problem in meinem Programm/ Threads!?
 
Delphi-Quellcode:
idx := 0;
// Alle Bomben in der Liste bearbeiten
while idx < FBombList.Count do
  begin
    KillBomb := ... // Hier muss noch eine sinnvolle Abfrage rein, wenn die Bombe gelöscht werden soll!

    // Soll die Bombe gelöscht werden?
    if KillBomb then
      // Bombe aus der Liste entfernen
      FBombList.Delete( idx )
    else
      begin
        // Auf zur nächsten Bombe in der Liste
        Inc( idx );
      end;
  end;

Simme 2. Mär 2010 19:18

Re: Allgemeines Problem in meinem Programm/ Threads!?
 
Naja, eigentlich soll er's ja immer nach einem Durchlauf löschen. Deshalb brauch ich ja keine Bedingung. Aber das mit Delete funktioniert auch nicht...

wicht 2. Mär 2010 20:53

Re: Allgemeines Problem in meinem Programm/ Threads!?
 
Du brauchst die Abfrage. Du willst erst löschen, wenn die Zeit abgelaufen (Bombe.ExplodeTime oder wie es hieß) ist, oder an der Bombe eine Eigenschaft gesetzt wurde oder so. Bombe wird gelegt, Bombe explodiert, frühstens danach darf sie gelöscht werden.
Was heißt denn "mit Delete funktioniert auch nicht"? Etwas genauer bitte :) .. Hast du die TList benutzt, um die Bomben zu verwalten, oder die TObjectList mit OwnsObjects = True?

Simme 2. Mär 2010 21:10

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

Zitat von wicht
Du brauchst die Abfrage. Du willst erst löschen, wenn die Zeit abgelaufen (Bombe.ExplodeTime oder wie es hieß) ist, oder an der Bombe eine Eigenschaft gesetzt wurde oder so. Bombe wird gelegt, Bombe explodiert, frühstens danach darf sie gelöscht werden.

Ich setze Delete erst hinter die Funktion. Er löscht erst/nur, wenn er in die Funktion reinkommt und damit dann fertig ist.


Zitat:

Zitat von wicht
Was heißt denn "mit Delete funktioniert auch nicht"? Etwas genauer bitte :) ..

Dadurch, dass sich der Timer immer wiederholt, ist das, wenn einmal die Bombe gezündet wurde, eine Enlosschleife. Wenn ich Delete hinter die Funktion (also nach dem Durchlauf) setze, ist keine Veränderung zu sehen. Ich lasse mir ja während des Spielverlaufes immer den Wert von Count anzeigen. Und der wird nicht niedriger. Er bleibt dann immer auf 1.

Zitat:

Zitat von wicht
Hast du die TList benutzt, um die Bomben zu verwalten, oder die TObjectList mit OwnsObjects = True?

Ich verwende eine ganz normale TList, wie es bei dir am Anfang drin stand.

Liebe Grüße,
Simon =)

wicht 2. Mär 2010 21:39

Re: Allgemeines Problem in meinem Programm/ Threads!?
 
Benutze die TObjectList mit OwnsObjects = True, wie in dem Beispiel im Anhang von Sir Rufo. Wenn du dort Delete aufrufst und OwnsObjects = True ist, löscht sie automatisch das Objekt mit. Das heißt der Speicher wird freigegeben und das Teil verschwindet von der Form (Ich habe das noch nie gemacht, aber ich vermute, dass es sich so verhält). Die normale TList kennt die Objekte nur und löscht sie nur aus der Liste beim .Delete, das Objekt an sich bleibt weiterhin bestehen und bleibt deshalb auch auf deiner Form.
Ich lese gerade, dass Count immer auf 1 bleibt - schau mal mit dem Debugger, wie oft dein Programm in BombenListe.Add() und BombenListe.Delete() reinläuft. Da wird was schiefgehen, der Count sollte nicht auf 1 bleiben. Oder die Stelle, die den Count anzeigt, wird zur falschen Zeit aufgerufen.. :stupid:

Simme 2. Mär 2010 22:11

Re: Allgemeines Problem in meinem Programm/ Threads!?
 
Also, ich hab jetzt nochmal ein bisschen getüfftlet. Es funktioniert jetzt soweit. Nur kann ich keine TObjectList verwenden. Da kommt eine Fehlermeldung. Undefinierter Bezeichner. Also, entweder ist meine Delphi-Version zu alt oder es hat einen anderen Grund. Das wäre eigentlich der letzte zu behebende Fehler. Weil sonst überall die Images noch angezeigt werden.

Zitat:

Zitat von "wicht"
Da wird was schiefgehen, der Count sollte nicht auf 1 bleiben.

Das mit dem Count funktioniert jetzt auch.

Danke schon mal für alle Hilfe! Ich sehe dem ganzen hoffnungsvoll entgegen. Das wäre das letzte, was zu beheben wäre. ;)

Eine gute Nacht und ich hoffe, dass ihr da noch Hilfe bieten könnt!

Simon =)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:26 Uhr.
Seite 2 von 5     12 34     Letzte »    

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