Dawn87 und ich hatten nun noch ein Problem, was passiert wenn man in einem TCollectionItem eine weitere TCollection einbindet, klar der Serializer wird diese nicht laden, da die Collection niemals erstellt wurde.
Um das Problem zu lösen habe ich ein neues Event erstellt und rufe dies auf, bevor die Klasse geladen wird:
Delphi-Quellcode:
//[...]
if ANSISameText(lPropNode.Attributes['
type'], '
Object')
then
begin
lPropObj := TPersistent(GetObjectProp(aPropertyInstance, lPropName));
if Assigned(lPropObj)
then
LoadClass(lPropNode, lPropObj, lPropName)
{ --------------------------- }
else
if ANSISameText(lPropNode.Attributes['
class'],'
TCollection')
then
begin
fOnSpecialClassLoad(self,lPropName,lPropObj);
if not Assigned(lPropObj)
then
raise Exception.Create('
Object of '+ lPropName +'
is undefined');
SetObjectProp(aPropertyInstance,lPropName,lPropObj);
LoadClass(lPropNode, lPropObj, lPropName);
end;
{ --------------------------- }
//[...]
Der Benutzer muss "nur" noch die TCollection's erstellen:
Delphi-Quellcode:
procedure TSettingsManager.SpecialClassLoad(aSender: TObject; aObjectName: string; var aObject: TPersistent);
begin
if aObjectName = 'Conditions' then
aObject := TCollection.Create(TConditionsCollectionItem)
else
if aObjectName = 'SubConditions' then
aObject := TCollection.Create(TSubConditionsCollectionItem)
end;
Delphi-Quellcode:
type
TMyCollectionItem = class(TCollectionItem)
private
FConditions:TCollection;
published
property Conditions:TCollection read FConditions write FConditions;
end;
TConditionsCollectionItem = class(TCollectionItem)
private
FSubConditions:TCollection;
published
property SubConditions:TCollection read FSubConditions write FSubConditions;
end;
Man könnte das ganze theoretisch auch mit dem Event "OnStartObjectLoad" durchführen dieses benötigt dann aber wieder eine eingebundene
xml Unit.