Tja, objecten aan zo'n control koppelen is sowieso wat dubieus, en de enige oplossing die ik zo even kan bedenken is ook niet super elegant. Je zou een object kunnen maken dat een interface-property heeft.
Delphi Code:
type
TContainer = class
private
FIntf: IInterface;
public
constructor Create(AIntf: IInterface);
property Intf: IInterface read FIntf;
end;
constructor TContainer.Create(AIntf: IInterface);
begin
FIntf := AIntf;
end;
Die zou je dan zo moeten kunnen aanroepen:
Delphi Code:
RzCheckList.AddItem('Item', TContainer.Create(TColorItem.Create()));
En weer uitlezen met (ongeveer, ik ken RzCheckList niet precies).
Delphi Code:
((RzCheckList.Items.Objects[0] as TContainer) as IColorItem).DoeIets;
Die typecasts zijn natuurlijk niet zo fraai. Je kan dat deels voorkomen door een TColorItemContainer te schrijven die specifiek een IColorItem teruggeeft, maar dat is natuurlijk weer een hoop duplicate code als je containers voor meerdere interfaces nodig hebt.
Als je een versie van Delphi hebt die generics ondersteunt, dan kan je het een heel klein tikje handiger zonder dat je voor elke interface een aparte container hoeft te schrijven:
Delphi Code:
type
TContainer<T: IInterface> = class
private
FIntf: T;
public
constructor Create(AIntf: T);
property Intf: T read FIntf;
end;
TColorItemContainer = TContainer<IColorItem>;
constructor TContainer<T>.Create(AIntf: T);
begin
FIntf := AIntf;
end;
Delphi Code:
RzCheckList.AddItem('Item', TColorItemContainer.Create(TColorItem.Create()));
En weer uitlezen met:
Delphi Code:
(RzCheckList.Items.Objects[0] as TColorItemContainer).Intf.DoeIets;
Hier zit dan wel het 'nadeel' aan dat je een object (TContainer) maakt, en dat object controleert weer de life time van de interface. Je zal die TContainer dus weer expliciet vrij moeten geven, om daar geen leaks te krijgen.
Het lijkt alsof je daarmee weer terug bij af bent, maar dat valt denk ik wel mee. Het is een vrij specifieke situatie waarin je objecten aan controls wilt koppelen, en je gebruikt ze ook alleen voor dat doel, dus ze hebben een vrij specifiek te bepalen levensduur en je zal ze niet gaan doorgeven aan (of injecteren in) andere objecten.
Bookmarks