Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zur Laufzeit erzeugte Elmente loschen


delphistart - Fr 22.12.06 17:45
Titel: Zur Laufzeit erzeugte Elmente loschen
Ich mochte gerne ein Element, dass zur Laufzeit erzeugt wird wieder löschen. Wie kann ich das machen?

So wird das Element erzeugt:

Delphi-Quelltext
1:
arrLabel1[count]:=TLabel.Create(self);                    


mkinzler - Fr 22.12.06 18:00


Delphi-Quelltext
1:
arrLabel1[count].Free;                    


delphistart - Fr 22.12.06 18:27

user profile iconmkinzler hat folgendes geschrieben:

Delphi-Quelltext
1:
arrLabel1[count].Free;                    


Noch eine Frage: Wo ist der Unterschied zwischen Free und FreeAndNil?


mkinzler - Fr 22.12.06 18:30

FreeAnNil() setzt die Instanzvariable anschließend auf Nil


delphistart - Fr 22.12.06 18:33

user profile iconmkinzler hat folgendes geschrieben:
FreeAnNil() setzt die Instanzvariable anschließend auf Nil


Und was ist Nil? :?


mkinzler - Fr 22.12.06 18:34

Nil ist das Delphigegenstück zu NULL. Das bedeutet soviel wie nicht definiert.


Marc. - Fr 22.12.06 19:20

Nil = Not In List ;)


Kroko - Fr 22.12.06 19:53

user profile iconmkinzler hat folgendes geschrieben:

Delphi-Quelltext
1:
arrLabel1[count].Free;                    

Wenn Du

Delphi-Quelltext
1:
arrLabel1[count].Parent := Form1;                    

setzt, kümmert sich das Form ums freigeben!


AutopilotON - Fr 22.12.06 20:02

Du musst mit "nil" aber ein wenig aufpassen, denn wenn du eine Variable auf nil setzt, heißt das nicht zwangsmäßig, dass
sie auch gelöscht ist. Du kannst die Variable zwar neu belegen, aber das alte Objekt bleibt im Speicher.
Guck dich dazu am besten mal nach "Pointer" und "lineare Listen" um - da wird das immer ganz gut erklärt.
Also bei solchen Fällen am Besten immer FreeAndNil() benutzen, wenn das Objekt vollständig gelöscht werden soll.


delphistart - Fr 22.12.06 20:04

user profile iconAutopilotON hat folgendes geschrieben:
Du musst mit "nil" aber ein wenig aufpassen, denn wenn du eine Variable auf nil setzt, heißt das nicht zwangsmäßig, dass
sie auch gelöscht ist. Du kannst die Variable zwar neu belegen, aber das alte Objekt bleibt im Speicher.
Guck dich dazu am besten mal nach "Pointer" und "lineare Listen" um - da wird das immer ganz gut erklärt.
Also bei solchen Fällen am Besten immer FreeAndNil() benutzen, wenn das Objekt vollständig gelöscht werden soll.


Danke für die Zahlreichen Tipps! Klappt jetzt alles! :D


delphistart - Fr 22.12.06 20:33

Leider ist noch ein Problem aufgetreten:

Ich erzeuge die Elemente in einer Scrolbox (Ich setze die ScrollBox als Parent).
Wenn ich die Elemente erzeugt haben, setze ich ein Variable (position) auf position+53.
Die Variable position nutze ich dann als angabe für die Topeigenschaft. Somit bekomme ich eine Benutzerdefinierte Liste in die Scrolbox.

Nun passiert folgendes: Wenn die Liste zu lang wird, muss man in der Scrollbox scrollen. Scrollt der Benutzer jetzt nach unten und gibt dann neue Daten ein und Übernimmt diese, so wird die Topeigenschaft von der aktuellen Scrollposition berechnet. Somit werden die Elemente an falscher Stelle angezeigt. Wie kann ich das korrigieren? Ich suche sowas wie Label1.Top:=position-scrollpsition... nur wie komme ich an die Scrollposition???


delphistart - Sa 23.12.06 11:35

Habe das Problem nach ewigem Rumprobieren eben selber gelöst:


Delphi-Quelltext
1:
Button1.Top := 10 - ScrollBox1.VertScrollBar.Position;                    


Trotzdem Danke... :-)