Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Variable als Zeiger? (https://www.delphipraxis.net/100110-variable-als-zeiger.html)

neomic 23. Sep 2007 17:26

Re: Variable als Zeiger?
 
Ich habe herausgefunden, dass Add() mir immer "0" zurückgibt bzw. count immer 1 bleibt... Was soll das denn?
Eigentlich sollte es doch den Index zurückgeben an dem es in der Liste steht, oder?

SubData 23. Sep 2007 17:53

Re: Variable als Zeiger?
 
Tut es ja.
Der Index des ersten Objekts (count=1) ist 0.

Hawkeye219 23. Sep 2007 18:01

Re: Variable als Zeiger?
 
Hallo,

wenn dir Add() immer den Wert 0 liefert, dann war die Liste vor dem Hinzufügen des neuen Elements offenbar leer. Vielleicht hast du einen logischen Fehler in deinem Programm und erzeugst immer neue Listen anstatt die bereits existierenden zu verwenden.

Gruß Hawkeye

neomic 23. Sep 2007 18:17

Re: Variable als Zeiger?
 
Zitat:

Zitat von Hawkeye219
wenn dir Add() immer den Wert 0 liefert, dann war die Liste vor dem Hinzufügen des neuen Elements offenbar leer. Vielleicht hast du einen logischen Fehler in deinem Programm und erzeugst immer neue Listen anstatt die bereits existierenden zu verwenden.


OMG JA NOCHMAL!!!!

Guckt mal wie ich nen neues Auto mache -.- (per Button)

Delphi-Quellcode:
procedure TSteuerung.Einchalten();
var i:Integer;
begin
        // Variablen setzen
        Randomize;
        hTimer.Enabled:=True;
       
        // Wir haben 4 verschiedene Autoarten (Also für jede Autoart ein Unterarray)
[b]       for i:=0 to 3 do hAuto[i]:=TObjectList.Create();
        NeuesAuto(3);[/b]
end;
ich danke dir!

Versuch das jetzt noch mit dem Löschen hinzubekommen...
Dazu eine Frage:

Wird Destroy/Free dann automatisch aufgerufen bei Remove?
Und wenn Free aufgerufen wird, muss ich dann auch in TAuto Free überschreiben oder ruft der dann das Destroy von der untersten Klasse auf?

Hawkeye219 23. Sep 2007 18:41

Re: Variable als Zeiger?
 
Ich kann hier nur die Hilfe zitieren:

Zitat:

Zitat von Delphi6-Hilfe
Mit TObjectList können Sie eine Liste von Objekten speichern und verwalten. Die Komponente stellt Eigenschaften und Methoden für das Hinzufügen, Löschen, Umsortieren, Suchen, Zugreifen und Sortieren von Objekten zur Verfügung. Ist die Eigenschaft OwnsObjects auf True gesetzt (Voreinstellung), verwaltet TObjectList den Speicher seiner Objekte, das heißt, ein Objekt wird freigegeben, wenn sein Index neu zugewiesen wird, wenn es mit der Methode Delete, Remove oder Clear aus der Liste entfernt wird oder wenn die Instanz TObjectList selbst aufgelöst wird.

Der Defaultwert von OwnsObjects ist True, die Liste wird also zum Eigentümer der aufgenommenen Objekte.

Gruß Hawkeye

neomic 23. Sep 2007 19:38

Re: Variable als Zeiger?
 
Ich hab mir da jetzt mal sowas gebastelt:

Delphi-Quellcode:
procedure TSteuerung.Aufraeumen();
var i,h:Integer;
begin
        for i:=0 to 3 do
        begin
                h:=0;
                while h<hAuto[i].Count do
                begin
                        if TAuto(hAuto[i].Items[h]).IstAusDemBild then
                        begin
                                // Auto aus der Liste entfernen
                                hAuto[i].Delete(h);

                                // Aus der Variable vom Hintermann löschen wenn vorhanden
                                if h>0 then TAuto(hAuto[i].Items[h-1]).SetzeAuto(nil);
                        end
                        else h:=h+1;
                end;
        end;
end;
Ich bekomm wieder ne AV, wahrscheinlich (wie vorher schon gesagt), weil hAuto[i].Count in der while-Schleife nur einmal am Anfang aufgenommen wird und sich dieser Wert bei den nächsten Schleifendurchläufen nicht ändert...

Kann ich mir anders helfen?

neomic 24. Sep 2007 12:13

Re: Variable als Zeiger?
 
So für alle die es interessiert: Ich hab es endlich geschafft :)

Und zwar frag jetzt jedes Auto selber ab ob es gelöscht werden kann und stellt einen Löschantrag an die Steeuerung.
Diese sieht jetzt so aus:

Delphi-Quellcode:
procedure TSteuerung.Loeschen(Sender:TObject);
var i:Integer;
begin
        i:=-1;
        // Typ abfragen
        if Sender is TAutoVonUnten then i:=0
        else if Sender is TAutoVonRechts then i:=1
        else if Sender is TAutoVonOben then i:=2
        else if Sender is TAutoVonLinks then i:=3;

        if i>=0 then
        begin
                // Auto löschen und aus der Variable des Hintermannes löschen
                TAuto(hAuto[i].Extract(Sender)).Destroy;
                // Items[0] ist zwingend der erste Autofahrer nach der andere gelöscht ist
                if hAuto[i].Count>0 then TAuto(hAuto[i].Items[0]).SetzeAuto(nil);
        end;
end;
Danke nochmal an alle beteiligten!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 Uhr.
Seite 2 von 2     12   

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