Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - mit components[n] ein objekt auf nil setzen...
terco - Fr 06.09.02 14:52
Titel: mit components[n] ein objekt auf nil setzen...
hallo,
wie kann ich eine componente, von der ich nur den index der Komponentenliste habe auf nil setzen??
beispiel:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| for i := 0 to componentcount - 1 do begin if components[i].name = zettelname then begin components[i].destroy; components[i] := nil; break; end; end; |
Folgende Zeile geht nicht:
Zitat: |
components[i] := nil; |
danke...
Tino - Fr 06.09.02 14:58
Hallo,
willst Du die Komponente "löschen"? Du solltest nicth
Destroy aufrufen sondern
Free. Das setzen auf Nil brauchst Du nicht:
Quelltext
1: 2: 3: 4: 5: 6:
| for i := 0 to componentcount - 1 do if components[i].name = zettelname then begin components[i].Free break; end; |
terco - Fr 06.09.02 15:11
auf die idee bin ich auch schon gekommen, aber sag das mal meinem informatik lehrer, der sagt, das ohne nil der speicherplatz nicht freigegeben wird...
GPF - Fr 06.09.02 16:29
Dann sollte sich Dein Informatiklehrer vorher schlau machen anstatt richtige Stellen als Fehler zu markieren - sage ihm das aber nie zu direkt - ich habe da auch schon schlechte Erfahrungen gemacht.
Die Free Methode, eingeführt von TObjekt, gibt das Objekt und sämtliche benötigten Ressourcen frei. Ausserdem meldet es sich beim Parent und trägt sich dort aus der Komponentenliste aus.
Falls Du mehrere Objekte löschen möchtest solltest Du immer von hinten (mit dem größten Index) entfernen, da sich die Indexnummern in den Listen ändern können.
Wie Tino bereits gesagt hast brauchst Du Destroy eigentlich nie direkt aufrufen. Den Zeiger auf Nil setzen brauchst Du auch nicht, da das Objekt automatisch aus der Liste entfernt wird und der Zeiger somit gelöscht wird. In Deinem Codebeispiel unter Verwendung von Free wären die Auswirkungen fatal - Du würdest ein Objekt löschen und den Zeiger auf das nächste Objekt in der Liste auf Nil setzen.
Burgpflanze - So 08.09.02 11:53
Oder benutze die procedure FreeAndNil aus der unit SysUtils:
Quelltext
1:
| FreeAndNil(Components[i]); |
Gruss, Burgpflanze
Udontknow - Mo 09.09.02 09:32
Nur eine Anmerkung:
Du kannst Components[i] nicht auf NIL setzen, weil die Eigenschaft TComponent.Components eine Nur-Lesen-Eigenschaft ist. Du kannst zwar die Objekte, die sich hinter Components verbergen, manipulieren (in diesem Fall freigeben), den Zeiger auf dieses Objekt (also den eigentlichen Inhalt der Eigenschaft Components[i]) kannst du aber nicht ändern.
Cu,
Udontknow
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!