Für die Anzeige einer relativ kurzen Liste von Objekt-Eigenschaften nutze ich dynamisch erzeugte TLabels. Diese verwalte ich in einer TObjectList mit OwnsObjects = True. Die Anzeige erledigt eine Methode "CreateTagLabels", die im Wesentlichen so aussieht:
Delphi-Quellcode:
TagLabelList.Clear; // Alte Labels freigeben
// neue erstellen
for i := 0 to Count-1 do begin
newLabel := TLabel.Create(Nil); // Kein Owner, das ist ja die ObjectList
TagLabelList.Add(newLabel);
newLabel.Parent := Panel1;
// newLabel.Caption := ...; Top, Left, OnClick, usw. usf.
end;
Und das knallt gelegentlich beim "Clear". Bei mir bisher gar nicht, aber ein Nutzer hat mir jetzt diesen Bugreport 2x zugeschickt. Einmal lief das Programm 2 Tage, beim nächsten Mal 8 Tage.
Der Callstack von MadExcept (gekürzt) sieht so aus.
Code:
exception message : Zugriffsverletzung bei Adresse 0066CD01 in Modul 'nemp.exe'. Lesen von Adresse 00000008.
main thread ($57e8):
Vcl.Controls AlignNestedControls
Vcl.Controls TWinControl.AlignControls
Vcl.Controls TWinControl.AlignControl
Vcl.Controls TWinControl.RemoveControl
Vcl.Controls TControl.SetParent
Vcl.Controls TControl.Destroy
madExcept InterceptClassDestroy
Vcl.Controls TControlCanvas.Destroy
System 1191 +0 TObject.Free
System.Contnrs TObjectList.Notify
System.Classes TList.SetCount
System.Classes TList.Clear
NempMainUnit 5703 +2 TNemp_MainForm.CreateTagLabels
Das sieht für mich so aus, als würde das Parent-Panel versuchen, während des Freigebens der Label-Liste nochmal auf Objekte zuzugreifen, die die ObjectList schon freigegeben hat.
So wie ich den
VCL-Code verstehe, sollte das aber eigentlich nicht passieren: Die Objekte in der Liste werden beim Clear der Reihe nach freigegeben, jedes einzelne benachrichtigt sein Parent darüber, welches das Control dann "vergisst". Beim nächsten Label.Free; sollte das vorherige dann im Parent verschwunden sein. Oder kann es in seltenen Fällen dazu kommen, dass sich da irgendwelche internen Messages überschneiden?
Being smart will count for nothing if you don't make the world better. You have to use your smarts to count for something, to serve life, not death.