Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Objekte aus Array löschen
Dornathal - Di 30.09.08 10:38
Titel: Objekte aus Array löschen
Hallo Leute,
Ich habe ein Array das mehrere Objekte der gleichen Klasse enthält.
Nun möchte ich ein ganz bestimmtes davon löschen, allerdings weis ich nicht welches index die Klasse hat.
Mir steht also nur das Array zur verfügung mit allen objekten drin und das objekt was ich löschen möchte.
Gibt es da eine bestimmte Lösungsmöglichkeit? Also ich hab das bereits über Pointer versucht weil ich dachte man kann die Adressen wo das gespeichert ist miteinander vergleichen...
Hier mal meine Routine:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TAAmeisen.EntferneAmeise (pAmeise: TAmeise); var lx: Integer; begin for lx:= low(kenntAmeisen) to high(kenntAmeisen) do if @pAmeise = @kenntAmeisen[lx] then begin pAmeise.gibFrei; kenntAmeisen[lx]:= kenntAmeisen[high(kenntAmeisen)]; end; setlength(kenntAmeisen, length(kenntAmeisen)-1);
end; |
Allerdings findet der keine Übereinstimmung.
MFG Dornathal
P.S. Ich hoffe das ich die Fachbegriffe (Klasse, Objekte) richtig verwendet habe. Wenn nicht einfach noch mal nachfragen.
delphiprogrammierer - Di 30.09.08 10:54
Titel: Re: Objekte aus Array löschen
Mach doch einfach eine Liste z.B.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| Type TAmeise = Class ( TObject ) End;
AmeisenListe : TList;
Ameisenlsite := TList.Create;
Ameise := TAMeise.Create; AmeisenListe.Add ( Ameise );
if ( AmeisenListe.IndexOf ( Ameise ) <> -1) Then Begin Index = AmeisenListe.IndexOf ( Ameise ) TAmeise ( AmeisenListe[Index] ).Free; AmeisenListe.Delete ( Index ); End; |
Moderiert von
Narses: Komplettzitat des ersten Beitrags entfernt
Moderiert von
Narses: Delphi-Tags hinzugefügt
Narses - Di 30.09.08 11:03
Moin!
Klasseninstanzen sind schon Pointer, du solltest da keine De-/Referenzierungsoperatoren mehr verwenden (@/^). Weiterhin solltest du dir mal die Klasse TObjectList ansehen, damit geht das alles ganz einfach. :idea: ;)
cu
Narses
Delete - Di 30.09.08 11:57
TObjectList scheint mir auch die beste Variante zu sein, zumal sie ihre enthaltenen Objekte selbstständig freigibt (sofern man nicht explizit OwnsObjects auf false setzt).
Dornathal - Di 30.09.08 15:23
Whau danke für die Hilfe...
Funktioniert super. Bis auf dass nicht die eigenen destruktoren benutzt werden.
Sondern nur destroy beim Freigeben,
Aber der Rest ist genial.
MFG Dornathal
Narses - Di 30.09.08 15:25
Moin!
Dornathal hat folgendes geschrieben: |
| Funktioniert super. Bis auf dass nicht die eigenen destruktoren benutzt werden. |
Was meinst du damit? :gruebel:
Wenn die
TObjectListeine Objekt freigibt und Eigentümer ist, dann wird auch ein (korrekt deklarierter) Destruktor aufgerufen. :nixweiss:
cu
Narses
Dornathal - Di 30.09.08 16:46
nun ja wenn ich z.B. den destructor gibFrei habe, dann ruft TObjectList trotzdem nur den destructor destroy auf. Das meine ich damit. Hab das programm einfahc mal beim aufruf der destructoren piepen lassen. bei gibFrei war nichts zu hören im gegensatz zu dem destruktor destroy.
Narses - Di 30.09.08 17:34
Moin!
Narses hat folgendes geschrieben: |
| Wenn die TObjectListeine Objekt freigibt und Eigentümer ist, dann wird auch ein (korrekt deklarierter) Destruktor aufgerufen. |
Dornathal hat folgendes geschrieben: |
| nun ja wenn ich z.B. den destructor gibFrei habe, dann ruft TObjectList trotzdem nur den destructor destroy auf. |
Man beachte die markierten Passagen. ;)
Du musst dich schon an die Vorgaben der VCL halten, also auch den Destruktor
Destroy überschreiben und darin den geerbten Destruktor aufrufen (wie in der Delphi-Hilfe als Beispiel angegeben), sonst kann das natürlich nicht klappen. :nixweiss:
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!