Einzelnen Beitrag anzeigen

Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Serialisierung von TCollection mit TXMLSerializer

  Alt 13. Jul 2009, 14:10
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 = 'Conditionsthen
      aObject := TCollection.Create(TConditionsCollectionItem)
    else
      if aObjectName = 'SubConditionsthen
        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.
Angehängte Dateien
Dateityp: pas uxmlserializer_107.pas (52,2 KB, 24x aufgerufen)
Sebastian
  Mit Zitat antworten Zitat