Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi arbeiten mit tobjectlist (https://www.delphipraxis.net/175957-arbeiten-mit-tobjectlist.html)

blinder007 1. Aug 2013 23:22

arbeiten mit tobjectlist
 
hallo community,
ich habe nun mehrere klassen in einer tobjectlist gespeichert. jetzt will ich die procedure einer bestimmten instanz dieser objektliste aufrufen.
gefunden habe ich bis jetzt
tkiclass(kiobjectlist.last).aufrufaktki; (ist halt schon in mein cod umgeschrieben)
oder mit items[index] arbeiten. letzteres funktioneirt aber wohl nicht bei dem aufruf einer methode - wie stelle ich es also an, dass von instanz nummer 3 eine bestimmte methode aufgerufen wird?
grüße
blinder007

sx2008 2. Aug 2013 02:20

AW: arbeiten mit tobjectlist
 
Wenn du ein Objekt aus einer Objektliste nimmst ist es sinnvoll das Objekt in einer lokalen Zwischenvariablen abzulegen.
Beispiel:
Delphi-Quellcode:
var
  i : Integer;
  tmp_obj : TKiClass;
begin
  for i:= 0 to objlist.Count-1 do
  begin
    tmp_obj := TKiClass(objlist.Items[i]);
    // jetzt kann man mit dem ausgelesenen Objekt arbeiten
    tmp_obj.AddEnergy(100);
    tmp_obj.RepairDamage;
  end;

Uwe Raabe 2. Aug 2013 06:52

AW: arbeiten mit tobjectlist
 
... oder man nimmt gleich die generische TObjectList<T> ...

Der schöne Günther 2. Aug 2013 08:29

AW: arbeiten mit tobjectlist
 
Hätte ich spontan auch gesagt.
  • Man sieht direkt was wirklich drinsteckt
  • Man spart sich das Casten

Zur eigentlichen Frage:
Eigentlich geht es mit einem absoluten Index (z.B. 3) genau so wie du es momentan auch machst:

Deine Methode "aufrufAktki()" rufst du ja folgendermaßen auf dem letzten Objekt in der Liste auf:
Delphi-Quellcode:
TKIClass(kiObjectList.Last()).aufrufAktki()
Wenn du nun das an Position drei haben möchtest, ändert sich ja nur das Last():

Delphi-Quellcode:
TKIClass(kiObjectList.Items[3]).aufrufAktki()
oder, als Alternative:

Delphi-Quellcode:
TKIClass(kiObjectList[3]).aufrufAktki()
Wenn du statt einer einfachen
Delphi-Quellcode:
TObjectList
eine
Delphi-Quellcode:
TObjectList<TKIClass>
nimmst, wird es noch einiges kürzer:

Delphi-Quellcode:
kiObjectList[3].aufrufAktki();

Sir Rufo 2. Aug 2013 08:32

AW: arbeiten mit tobjectlist
 
Das 3. Item hat aber den Index 2 ;)
Index 3 zeigt auf das 4. Item

Der schöne Günther 2. Aug 2013 08:38

AW: arbeiten mit tobjectlist
 
Ist das "dritte Item" nun das an "Position Drei" oder "Position Zwei"? Gibt es kein "nulltes Item" aber eins an "Position Null"? Was wenn man ein Array hat, das im Gegensatz zu einer Liste keine "Position Null" hat? Fragen über Fragen... :gruebel:

DeddyH 2. Aug 2013 08:47

AW: arbeiten mit tobjectlist
 
Listen und dynamische Arrays sind grundsätzlich 0-indiziert, d.h. das erste Item hat den Index 0.

silver-moon-2000 2. Aug 2013 09:17

AW: arbeiten mit tobjectlist
 
Zitat:

Zitat von blinder007 (Beitrag 1223220)
[...]ich habe nun mehrere klassen in einer tobjectlist gespeichert. [...]

Zitat:

Zitat von Uwe Raabe (Beitrag 1223226)
... oder man nimmt gleich die generische TObjectList<T> ...

Eine generische ObjectList fährt aber gegen die Wand, sobald er mehrere Klassen verwalten will.
Dann würde ich, ganz grob, so vorgehen:
Delphi-Quellcode:
if kiObjectList.Items[i] is TKIClass then
  (kiObjectList.Items[i] as TKiClass).DoSomething;
if kiObjectList.Items[i] is TPlayerClass then
  (kiObjectList.Items[i] as TPlayerClass).DoSomethingDifferent;
Wobei ich hier einfach mal den "SoftCast"
Delphi-Quellcode:
as
anstelle des HardCasts verwendet habe

Oder habe ich das Ganze wieder einmal falsch interpretiert und es sind mehrere Instanzen *einer* Klasse gemeint?

uligerhardt 2. Aug 2013 09:23

AW: arbeiten mit tobjectlist
 
Zitat:

Zitat von silver-moon-2000 (Beitrag 1223243)
Dann würde ich, ganz grob, so vorgehen:
Delphi-Quellcode:
if kiObjectList.Items[i] is TKIClass then
  (kiObjectList.Items[i] as TKiClass).DoSomething;
if kiObjectList.Items[i] is TPlayerClass then
  (kiObjectList.Items[i] as TPlayerClass).DoSomethingDifferent;
Wobei ich hier einfach mal den "SoftCast"
Delphi-Quellcode:
as
anstelle des HardCasts verwendet habe

Was aber in genau dem Konstrukt überflüssig ist: Das "is" prüft den Typ ja schon, da musst du nicht mit "as" nochmal prüfen.

silver-moon-2000 2. Aug 2013 09:39

AW: arbeiten mit tobjectlist
 
Zitat:

Zitat von uligerhardt (Beitrag 1223245)
Zitat:

Zitat von silver-moon-2000 (Beitrag 1223243)
Wobei ich hier einfach mal den "SoftCast"
Delphi-Quellcode:
as
anstelle des HardCasts verwendet habe

Was aber in genau dem Konstrukt überflüssig ist: Das "is" prüft den Typ ja schon, da musst du nicht mit "as" nochmal prüfen.

Da hast Du auch wieder Recht, aber ich wollte einfach mal zeigen, dass es außer dem harten Cast noch etwas anderes gibt (ja, ich denke, das wird als Ausrede funktionieren...)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.
Seite 1 von 3  1 23      

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