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?
The angels have the phone box.