Index: VerpakkingsDefinitie/UI/Util.pas =================================================================== diff -u -r583 -r587 --- VerpakkingsDefinitie/UI/Util.pas (.../Util.pas) (revision 583) +++ VerpakkingsDefinitie/UI/Util.pas (.../Util.pas) (revision 587) @@ -3,13 +3,13 @@ interface uses - Vcl.Controls, // Free control children + Vcl.Controls, System.SysUtils, // Free control children System.Types, Vcl.Graphics; // Color lightener type TUtil = class class procedure VervangControl(OudeControl: TControl; NieuweControl: TControl); - class procedure FreeControlChildrenRec(AControl: TControl); + class procedure FreeControlChildrenDeep(AControl: TControl); class function LightenColor(RGB: Cardinal; Percentage: Integer): Cardinal; static; end; @@ -34,26 +34,34 @@ OudeControl.visible := False; end; +procedure FreeControlChildrenRec(AControl: TControl); +begin + if not Assigned(AControl) then + exit; + if AControl is TWinControl then + begin + // Tijden het free-en kan zijn dat er elementen verdwijnen uit de lijst. + // Het aantal elementen moet dus steeds opnieuw gecontroleerd worden (een for-lus berekent dit eenmalig) + while TWinControl(AControl).ControlCount > 0 do + FreeControlChildrenRec(TWinControl(AControl).Controls[0]); + end; + FreeAndNil(AControl); +end; + // FREE CONTROL CHILDREN // Recursieve methode om de kinderen van een TWinControl te free-en (hanging pointers voorkomen) // Gebaseerd op: https://stackoverflow.com/questions/414928/is-there-any-way-to-get-all-the-controls-on-a-container-control -class procedure TUtil.FreeControlChildrenRec(AControl: TControl); -var - i: Integer; +class procedure TUtil.FreeControlChildrenDeep(AControl: TControl); begin - if AControl = nil then + if not Assigned(AControl) then exit; if AControl is TWinControl then begin - i := 0; - // Tijden het free-en kan zijn dat er elementen verdwijnen uit de lijst. - // Het aantal elementen moet dus steeds opnieuw gecontroleerd worden (een for-lus berekent dit eenmalig) - while TWinControl(AControl).ControlCount < i do - begin - FreeControlChildrenRec(TWinControl(AControl).Controls[i]); - end; + // // Tijden het free-en kan zijn dat er elementen verdwijnen uit de lijst. + // // Het aantal elementen moet dus steeds opnieuw gecontroleerd worden (een for-lus berekent dit eenmalig) + while TWinControl(AControl).ControlCount > 0 do + FreeControlChildrenRec(TWinControl(AControl).Controls[0]); end; - AControl.Free(); end; // COLOR LIGHTENER