Maik81SE hat geschrieben:
Darfst mich gerne Korrigieren, aber dies ist meines Wissens nach eher unter Delphi üblich.
Unter Larazus habe ich dies auch schon anfänglich versucht, bin ich aber bei der suche uA hier im Forum über den Hinweiß gestolpert, das da eher NIL verwendet werden sollte.
Das hat nichts mit Delphi oder Lazarus zu tun, sondern damit, dass du offenbar nicht verstanden hast, was dieser Parameter macht. Alle Objekte, die von TComponent abgeleitet sind, haben einen "Owner", das ist das Objekt, das dafür verantwortlich ist, die Komponente zu löschen. Üblicherweise gibt man dafür das Formular an, auf dem die Komponente sitzt, denn wenn das Formular zerstört wird, dann soll es auch die Komponente mit löschen. Mit Hilfe dieses Mechanismus muss sich der Programmierer nicht mehr darum kümmern, die von ihm erzeugten Komponenten zu entfernen. Nur in Spezialfällen ist es sinnvoll, nil eintragen, also "kein anderes Objekte soll die Komponente zerstören" - wenn das niemand macht, dann muss man sich selbst darum kümmern (wie im richtigen Leben). Dieses Vorgehen ist nur dann sinnvoll, wenn es sich um eine kurze Prozedur handelt, so dass man die Lebensdauer des Komponente überblicken kann. Es gab bei Delphi einmal eine Zeit, in der es mit der Situation nicht klarkam, dass jemand anders als der eingetragene Owner eine Komponente gelöscht hat, daher wahrscheinlich dein aufgeschnapptes "eher unter Delphi üblich".
Hier ein Beispiel für diesen Spezialfall. Dabei den try-finally-Block nicht vergessen, damit bei einer Exception während der herrenlosen Komponente kein Speicherleck entsteht. Etwa so
Code: Alles auswählen
procedure TForm1.ShowDataDialog;
var
F: TDataForm;
begin
F := TDataForm.Create(nil);
try
F.ShowModal;
finally
F.Free;
end;
end;
Maik81SE hat geschrieben:
Diese Zeile hat diesen Fehler ausgelöst
Hier sind gleich zwei Fehler.
Zum einen dein allseits geliebtes "nil", das hier fatale Auswirkungen hat. Denn TColumn ist nicht von TComponent abgeleitet, sondern von TCollectionItem (das in der Komponentenhierachie von TPersistent abzweigt, dem Vorfahren von TComponent). All diese Elemente haben keinen "Owner" so wie die Komponenten. Das, was hier im Create eingetragen wird, ist die Collection, zu der das CollectionItem gehört. CollectionItem und Collection kommunizieren immer wieder miteinander, und wenn dann das Item die Liste nicht kennt, in der es hängt, kann das nur schief gehen.
Um den Benutzer von diesen internen Details zu schützen, werden CollectionItems nicht mit Create erzeugt - das ist der zweite Fehler -, sondern mit der Collection-Methode Add, die das Item erzeugt und auch auch gleich die Collection im Item einträgt.
Aus diesem Grund funktioniert dein Code am Ende richtig.