Hey,
es gibt verschiedene Lösungsansätze, aber da hat mir bis jetzt noch keiner so richtig gefallen. Das ganze ist ein Resourcen Manager. Er läd und hält die Instancen von angeforderten Resourcen. Wenn man die Resource nicht mehr braucht gibt man die Resource über den Manager wieder frei. Der entscheidet dann ob die Instanz der Resource freigegeben werden kann, oder ob die noch wo anders benötigt wird. Eine Resource kann durch ein Interface oder direkt durch ein Objekt abgebildet werden. Wenn die Resource vom Nutzer freigegeben wird soll beim Aufruf der Funktion auch gleich die Variable in der die Resource gespeichert wurde genilt werden. Also praktisch wie bei FreeAndNil. Jetzt hab ich folgende alternativen:
- ReleaseResource 100 mal überladen, für jede Resource einmal
- den Typ der Resource mit an ReleaseResource übergeben (siehe oben)
- 2 überladene Methoden, die den Typ automatich bestimmen: procedure(var x; const o: TObject); und procedure(var x; const i: IUnknown);
- die Resource einfach by Value übergeben und jedesmal per Hand nilen
Bis jetzt war es immer so, das Resourcen immer Objekte waren. Das mit den Interfaces ist neu dazu gekommen. Deshalb ging das bis jetzt auch immer mit dem typlosen var Paramter. Den hab ich dann immer in ein TObject gecastet und dann entsprechend freigegeben und genilt, aber wenn ich jetzt ein Interface übergebe und das in ein Objekt caste knallt es. So sah das bis jetzt aus:
Code: Alles auswählen
procedure TengResourceManager.ReleaseResource(var aResource);
var
obj: TObject;
res: IengLoadableResource;
begin
obj := TObject(aResource);
TObject(aResource) := nil;
if not Assigned(obj) then
exit;
if (obj is IengLoadableResource) then begin
res := (obj as IengLoadableResource);
ReleaseResourceIntern(res);
end else
obj.Free;
end;
Ich such jetzt eine Lösung um das Ganze typsicher zu bekommen. Der Nutzer fragt eine Resource an und gibts sie über den Resourcen Manager auch wieder frei. Er soll sich nicht darum kümmern müssen was für eine Resource das ist, den da entstehen wieder Fehler: War das jetzt ein Interface? Muss ich das nur nil setzen? Oder war das doch ein Objekt und ich muss vorher Free aufrufen? Das soll alles das ReleaseResource erledigen. Ist sogesehen eigentlich nur ne Schönheits-Sache. Lösungen die funktionieren würden hab ich ja. Ich präferiere zur Zeit Lösung 3, da würde der Aufruf wie folgt aussehen:
Code: Alles auswählen
ReleaseResource(fRes, fRes); //sieht lustig aus oder^^
MfG Bergmann.