to chyba najprościej będzie przez dosztukowanie :p
type
TNotifier = class(TComponent)
private
FOnFreeWinControl: TNotifyEvent;
protected
procedure Notification(AComponent: TComponent; Operation: TOperation);
override;
public
property OnFreeWinControl: TNotifyEvent read FOnFreeWinControl write FOnFreeWinControl;
end;
TNewFieldItem = class(TCollectionItem)
private
FField: TField;
FWinControl: TWinControl;
FNotifier: TNotifier;
procedure NotifierFreeControl(Sender: TObject);
procedure SetField(Value: TField);
procedure SetWinControl(Value: TWinControl);
protected
public
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
published
property Field: TField read FField write SetField;
property WinControl: TWinControl read FWinControl write SetWinControl;
end;
implementation
{ TNewFieldItem }
constructor TNewFieldItem.Create(Collection: TCollection);
begin
inherited;
FNotifier := TNotifier.Create(nil);
end;
destructor TNewFieldItem.Destroy;
begin
FNotifier.Free;
inherited;
end;
procedure TNewFieldItem.NotifierFreeControl(Sender: TObject);
begin
if Sender = FWinControl then
FWinControl := nil;
end;
procedure TNewFieldItem.SetField(Value: TField);
begin
//...
end;
procedure TNewFieldItem.SetWinControl(Value: TWinControl);
begin
Value.FreeNotification(FNotifier); //!!WAŻNE
//...
end;
{ TNotifier }
procedure TNotifier.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if Operation = opRemove then
if Assigned(FOnFreeWinControl) then
FOnFreeWinControl(AComponent);
end;
działa to tak, że ta linijka
Value.FreeNotification(FNotifier);
mówi komponentowi przekazanemu jako Value, że jak będziesz niszczony to masz wywołać metodę Notification obiektu przekazanego jako parametr (czyli FNotifier). BTW działa to w dwie strony, tzn jak zniszczysz FNotifier to Value się o tym dowie. I tyle.
A jako, iż, ponieważ, tudzież :p jest to mechanizm komponentów to TCollectionItem tego nie ma i trzeba to jakoś obejść. Najprościej jest stworzyć klasę, która dziedziczy po TComponent i dodać do niej zdarzenie, które będzie mogło być wyłapane przez dowolny obiekt, niezależnie po czym on dziedziczy.