Interfaces i praksis
Jeg har altid brugt konstruktionen med et dataobjekt og en datalisteTData = class
private
public
{ ... data ... }
end
TDataList = class(TObjectList)
private
public
property Items[aIndex: integer]: TData read GetItems; default;
end;
.. altså et objekt i en objektliste. Nu vil jeg prøve at lave det med interfaces.
Jeg skal skanne et katalog for filer (medcom-filer) og her er opgaven at identificere dem.
Status er:
- filer af ukendt format
- filer af medcom-format der ikke understøttes
- filer af medcom-format der understøttes.
Derfor syntes jeg det var smart at lave interfaces til hver af de standarder jeg skal håndtere:
IStd1 = interface
['{GUID}']
function GetStd1: IXMLStd1;
end;
IStd2 = interface
['{GUID}']
function GetStd2: IXMLStd2;
end;
IStd3 = interface
['{GUID}']
function GetStd3: IXMLStd3;
end;
TFiles = class(TInterfacedObject,IStd1,IStd2,IStd3)
private
public
function GetStd1: IXMLStd1;
function GetStd2: IXMLStd2;
function GetStd3: IXMLStd3;
end;
TFilesList = class(TObjectList)
private
public
constructor Create(aPath: string);
procedure Initialize; // scan katalog
property Items[aIndex: integer]: TFiles read GetItems; default;
end;
Efterfølgende løber jeg listen igennem og propper objekterne ind på hver sin linje i et ListView (hægter det på TListItem.Data).
Her går det galt. Hvis jeg inde i en procedure gør følgende:
var
MyData: TData;
I_Std1: IStd1;
begin
MyData := Item.Data
I_Std1 := MyData as IStd1;
I_Std1.GetStd1 ...
end;
... så går Garbage Collectoren igang med at frigive I_Std1 ved exit af proceduren - hvilket åbenbart er TData-objektet i listen => Access violations næste gang jeg tilgår objektet, og absolut ikke hvad jeg havde forventet!
Kan man forhindre garbage collectoren i at rydde op Hvorfor gør den i det hele taget noget? Reference count må da være større end 0?
Er det fordi jeg gemmer objekter der understøtter interfaces eller er det fordi jeg skal bytte TObjectList ud med TInterfaceList? Et eksempel derpå, kan findes her: http://www.swissdelphicenter.ch/torry/showcode.php