Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit variablen arrays und Objekten


Bjoern128 - Fr 11.10.02 13:42
Titel: Problem mit variablen arrays und Objekten
Hallo!

Ich habe ein sehr seltsames Problem

ich habe ein variables array " array test: of TBeispiel" und TBeispiel ist so deklariert

Quelltext
1:
2:
3:
4:
5:
TBeispiel=class(TObject)
   zahl1:integer;
  feld:array of Tkeineahnung;
  zahl2:integer;
end;

so wenn ich nun mein array mit setlength um eins vergrößere muss ich das neue Element ja instanzieren und zwar an der Stelle

Quelltext
1:
test[length(test)-1]:=TBeispiel.create;                    

das funktioniert auch alles super. wenn ich jetzt dsa array um eins verkleinere, ist es ja elegant, das letzte Element wieder freizugeben also mit

Quelltext
1:
test[length(test)-1].free;                    

und dann mit setlength um eins verkleinern wenn ich es aber mache, dann wird von dem vorletzten Atom die letzte Deklaration mit vernichtet also die letzte Deklaration von TBeispiel am vorletzten Feld. in diesem Fall wräe dsa zahl2. Die ist dann für das vorletzte Element nicht mehr verfügbar.

wenn ich in der Deklaration von TBeispiel die Reihenfolge vertausche, wird immer am vohrigen Element des arrays dieser Wert mit freigegeben.
Woran liegt das ?


Vielen Dank
Björn

(11.10.02 17:13 Tino) Code-Tags hinzugefügt.


mk2 - Fr 11.10.02 14:02

hast du n destruktor für tbeispiel geschrieben in dem du feld wieder freigibst also auf NIL setzt? vielleicht liegts daran :?:

mfg mk2


Udontknow - Fr 11.10.02 14:21

Hmmm, du wirfst ein wenig die Begriffe durcheinander, das macht Hilfe schwer...

Eine Deklaration kann nicht vernichtet werden. Du gibst Objekte frei. Soweit so gut. Variablen (in Objekten auch Felder genannt )wie Zahl1, Zahl2 oder das Array können aber auch nicht freigegeben werden, das ist nicht möglich. Was also meinst du damit, wenn du schreibst, Zahl2 des vorletzten Objekts im Array wurde mit dem letzen Objekt freigegeben?

Wo du sowieso schon Objekte einsetzt, verwendest du am besten anstelle von Arrays (Igitt! :wink: ) TList-Objekte, in denen du dann eben die Pointer der erstellten Objekte auflistest.

Cu, :)
Udontknow