Autor Beitrag
terco
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 06.09.02 14:52 
hallo,

wie kann ich eine componente, von der ich nur den index der Komponentenliste habe auf nil setzen??

beispiel:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 4



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



BeitragVerfasst: 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.

_________________
"Wenn Debugging ein Vorgang ist, Fehler aus einem Programm auszubauen, dann ist Programmieren der Vorgang, Fehler einzubauen."
Burgpflanze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Windows2000 Prof. SP4
Delphi7 Enterprise
BeitragVerfasst: So 08.09.02 11:53 
Oder benutze die procedure FreeAndNil aus der unit SysUtils:

ausblenden Quelltext
1:
FreeAndNil(Components[i]);					




Gruss, Burgpflanze

_________________
Gruss, Burgpflanze
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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