Ich habe die Klasse mir jetzt so umgeschrieben, damit dort ohne Probleme TCollectionItem's gespeichert und geladen werden können. Außerdem benutze ich nicht den
MSXML Parser sondern den aus dem alcinoe Projekt.
Dawn87, wenn ich richtig gelesen habe, benutzt du den XMLSerializer von DragonSoft, diesen habe ich modifiziert.
Dadruch spart man sich auf das Event zu reagieren.
In der Funktion LoadSingleClass:
Delphi-Quellcode:
//[...]
if fSpecialClasses<>[] then
begin
if (scTCollection in fSpecialClasses) and aPropertyInstance.InheritsFrom(TCollection) then
begin
lPropNodes := aNode.ChildNodes.FindNode('customdata');
{ --------------------------- }
for I := 0 to lPropNodes.ChildNodes.Count - 1 do
if (lPropNodes.ChildNodes.Nodes[I].NodeName = 'class') then
TCollection(aPropertyInstance).Add;
{ --------------------------- }
if Assigned(lPropNodes) then
begin
for i := 0 to TCollection(aPropertyInstance).Count -1 do
LoadClass(lPropNodes, TCollection(aPropertyInstance).Items[i], 'Item_' + IntToStr(i));
end;
end
//[...]
Delphi-Quellcode:
procedure TSettingsManager.LoadSettings;
var XMLSerializer:TXMLSerializer;
procedure LoadObjectEx(const aInstance: TObject);
begin
XMLSerializer.LoadObject(aInstance,aInstance.ClassName);
end;
begin
if FileExists(GetSettingsFolder + SettingsFilename) then
begin
XMLSerializer := TXMLSerializer.Create(nil);
try
with XMLSerializer do
begin
XMLSettings.WellFormated := true;
SpecialClasses := [scTCollection];
LoadFromFile(GetSettingsFolder + SettingsFilename);
LoadObjectEx(SettingsManager.Settings); // zu ladende Klasse
end;
finally
XMLSerializer.Free;
end;
end
else LoadDefaultSettings;
end;
Delphi-Quellcode:
procedure TSettingsManager.SaveSettings;
var XMLSerializer:TXMLSerializer;
procedure SaveObjectEx(const aInstance: TObject);
begin
XMLSerializer.SaveObject(aInstance,aInstance.ClassName);
end;
begin
XMLSerializer := TXMLSerializer.Create(nil);
try
with XMLSerializer do
begin
XMLSettings.WellFormated := true;
StorageOptions := [soIncludeObjectLinks, soSortProperties];
SpecialClasses := [scTCollection];
SaveObjectEx(SettingsManager.Settings); // zu speichernde Klasse
SaveToFile(GetSettingsFolder + SettingsFilename);
end;
finally
XMLSerializer.Free;
end;
end;