Einzelnen Beitrag anzeigen

Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
880 Beiträge
 
Delphi 11 Alexandria
 
#1

sporadische Exception beim Freigeben von TLabels

  Alt 27. Dez 2022, 15:27
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.
  Mit Zitat antworten Zitat