Autor Beitrag
Dornathal
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Di 30.09.08 10:38 
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:
ausblenden 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 // vergleichen der Adressen
      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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Di 30.09.08 10:54 
Mach doch einfach eine Liste z.B.
ausblenden 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;


// Ameisenliste erzeugen
  Ameisenlsite := TList.Create;

// Ameise in die Liste einfügen
Ameise := TAMeise.Create;
AmeisenListe.Add ( Ameise );

// Ameise aus der Liste entfernen
if ( AmeisenListe.IndexOf ( Ameise ) <> -1) Then
Begin
  Index = AmeisenListe.IndexOf ( Ameise )
  TAmeise ( AmeisenListe[Index] ).Free;
  AmeisenListe.Delete ( Index );
End;


Moderiert von user profile iconNarses: Komplettzitat des ersten Beitrags entfernt
Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 30.09.08 15:25 
Moin!

user profile iconDornathal 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Dornathal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 30.09.08 17:34 
Moin!

user profile iconNarses hat folgendes geschrieben:
Wenn die TObjectListeine Objekt freigibt und Eigentümer ist, dann wird auch ein (korrekt deklarierter) Destruktor aufgerufen.
user profile iconDornathal 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

_________________
There are 10 types of people - those who understand binary and those who don´t.