implemented streaming components to TXMLConfig

git-svn-id: trunk@9090 -
This commit is contained in:
mattias 2006-04-07 16:12:43 +00:00
parent d8e7f5e0af
commit f4ec1d306d
4 changed files with 132 additions and 24 deletions

View File

@ -79,7 +79,7 @@ type
const AValue, DefValue: extended); const AValue, DefValue: extended);
procedure DeletePath(const APath: string); procedure DeletePath(const APath: string);
procedure DeleteValue(const APath: string); procedure DeleteValue(const APath: string);
property Modified: Boolean read FModified; property Modified: Boolean read FModified write FModified;
published published
property Filename: String read FFilename write SetFilename; property Filename: String read FFilename write SetFilename;
property Document: TXMLDocument read doc; property Document: TXMLDocument read doc;

View File

@ -46,7 +46,7 @@ type
procedure StackPop; procedure StackPop;
function GetPropertyElement(const TypeName: String): TDOMElement; function GetPropertyElement(const TypeName: String): TDOMElement;
public public
constructor Create(ADoc: TDOMDocument); constructor Create(ADoc: TDOMDocument; const APath: string; Append: Boolean);
{ Begin/End markers. Those ones who don't have an end indicator, use { Begin/End markers. Those ones who don't have an end indicator, use
"EndList", after the occurrence named in the comment. Note that this "EndList", after the occurrence named in the comment. Note that this
@ -134,7 +134,7 @@ begin
Writer:=nil; Writer:=nil;
try try
XMLDocument:=TXMLDocument.Create; XMLDocument:=TXMLDocument.Create;
Driver:=TXMLObjectWriter.Create(XMLDocument); Driver:=TXMLObjectWriter.Create(XMLDocument,'fcl-persistent',true);
Writer:=TWriter.Create(Driver); Writer:=TWriter.Create(Driver);
Writer.WriteDescendent(AComponent,nil); Writer.WriteDescendent(AComponent,nil);
WriteXMLFile(XMLDocument,AStream); WriteXMLFile(XMLDocument,AStream);
@ -190,12 +190,65 @@ begin
Result := nil; Result := nil;
end; end;
constructor TXMLObjectWriter.Create(ADoc: TDOMDocument); constructor TXMLObjectWriter.Create(ADoc: TDOMDocument;
const APath: string; Append: Boolean);
var
Node: TDOMNode;
PathLen: Integer;
StartPos: Integer;
EndPos: LongInt;
NodeName: string;
Child: TDOMNode;
ParentNode: TDOMNode;
begin begin
inherited Create; inherited Create;
FDoc := ADoc; FDoc := ADoc;
FRootEl := FDoc.CreateElement('fcl-persistent');
FDoc.AppendChild(FRootEl); Node := Doc.DocumentElement;
PathLen:=length(APath);
StartPos:=1;
while True do begin
EndPos:=StartPos;
while (EndPos<=PathLen) and (APath[EndPos]<>'/') do inc(EndPos);
if EndPos>StartPos then begin
SetLength(NodeName,EndPos-StartPos);
Move(APath[StartPos],NodeName[1],EndPos-StartPos);
StartPos:=EndPos+1;
Child := Node.FindNode(NodeName);
if not Assigned(Child) then
begin
Child := Doc.CreateElement(NodeName);
Node.AppendChild(Child);
end;
Node := Child;
end else if EndPos>PathLen then begin
break;
end else begin
StartPos:=EndPos+1;
end;
end;
if Node is TDOMElement then
FRootEl:=TDOMElement(Node)
else
FRootEl:=nil;
NodeName:='fcl-persistent';
ParentNode:=nil;
if (not Append) and (FRootEl<>nil) then begin
NodeName:=FRootEl.NodeName;
ParentNode:=FRootEl.ParentNode;
if ParentNode<>nil then
ParentNode.RemoveChild(FRootEl)
else
FRootEl.Free;
FRootEl:=nil;
end;
if FRootEl=nil then
FRootEl := FDoc.CreateElement(NodeName);
if ParentNode=nil then
FDoc.AppendChild(FRootEl)
else
ParentNode.AppendChild(FRootEl);
end; end;
procedure TXMLObjectWriter.BeginCollection; procedure TXMLObjectWriter.BeginCollection;

View File

@ -1,5 +1,3 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TStreamAsXMLForm','FORMDATA',[ LazarusResources.Add('TStreamAsXMLForm','FORMDATA',[
'TPF0'#16'TStreamAsXMLForm'#15'StreamAsXMLForm'#4'Left'#3'N'#1#6'Height'#3#178 'TPF0'#16'TStreamAsXMLForm'#15'StreamAsXMLForm'#4'Left'#3'N'#1#6'Height'#3#178
+#1#3'Top'#3#182#0#5'Width'#3#237#1#18'HorzScrollBar.Page'#3#236#1#18'VertScr' +#1#3'Top'#3#182#0#5'Width'#3#237#1#18'HorzScrollBar.Page'#3#236#1#18'VertScr'

View File

@ -5,10 +5,32 @@ unit MainUnit;
interface interface
uses uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Classes, SysUtils, LCLProc, LResources, Forms, Controls, Graphics, Dialogs,
Laz_XMLStreaming, DOM, laz_xmlcfg, Buttons; StdCtrls, Laz_XMLStreaming, Laz_DOM, laz_xmlcfg, Buttons;
type type
TMyEnum = (myEnum1, myEnum2, myEnum3);
TMySet = set of TMyEnum;
{ TMyComponent }
TMyComponent = class(TComponent)
private
FMyDouble: Double;
FMyEnum: TMyEnum;
FMyInteger: integer;
FMySet: TMySet;
FMyString: string;
FMyWideString: widestring;
public
property MyDouble: Double read FMyDouble write FMyDouble;
property MyWideString: widestring read FMyWideString write FMyWideString;
property MyInteger: integer read FMyInteger write FMyInteger;
property MyString: string read FMyString write FMyString;
property MyEnum: TMyEnum read FMyEnum write FMyEnum;
property MySet: TMySet read FMySet write FMySet;
end;
{ TStreamAsXMLForm } { TStreamAsXMLForm }
@ -27,26 +49,62 @@ type
var var
StreamAsXMLForm: TStreamAsXMLForm; StreamAsXMLForm: TStreamAsXMLForm;
function CreateXMLWriter(ADoc: TDOMDocument; function CreateXMLWriter(ADoc: TDOMDocument; const Path: string;
var DestroyDriver: boolean): TWriter; Append: Boolean; var DestroyDriver: boolean): TWriter;
procedure WriteComponentToXMLConfig(XMLConfig: TXMLConfig; const Path: string;
AComponent: TComponent);
implementation implementation
function CreateXMLWriter(ADoc: TDOMDocument; function CreateXMLWriter(ADoc: TDOMDocument; const Path: string;
var DestroyDriver: boolean): TWriter; Append: Boolean; var DestroyDriver: boolean): TWriter;
var var
Driver: TAbstractObjectWriter; Driver: TAbstractObjectWriter;
begin begin
Driver:=TXMLObjectWriter.Create(ADoc); Driver:=TXMLObjectWriter.Create(ADoc,Path,Append);
DestroyDriver:=true; DestroyDriver:=true;
Result:=TWriter.Create(Driver); Result:=TWriter.Create(Driver);
end; end;
procedure WriteComponentToXMLConfig(XMLConfig: TXMLConfig; const Path: string;
AComponent: TComponent);
var
Writer: TWriter;
DestroyDriver: boolean;
begin
Writer:=nil;
DestroyDriver:=false;
try
Writer:=CreateXMLWriter(XMLConfig.Document,Path,false,DestroyDriver);
XMLConfig.Modified:=true;
Writer.WriteRootComponent(AComponent);
XMLConfig.Flush;
finally
if DestroyDriver then
Writer.Driver.Free;
Writer.Free;
end;
end;
{ TStreamAsXMLForm } { TStreamAsXMLForm }
procedure TStreamAsXMLForm.FormCreate(Sender: TObject); procedure TStreamAsXMLForm.FormCreate(Sender: TObject);
var
MyComponent: TMyComponent;
begin begin
Filename:='test.xml'; Filename:='test.xml';
MyComponent:=TMyComponent.Create(Self);
with MyComponent do begin
Name:='MyComponent';
MyDouble:=-1.23456789;
MyEnum:=myEnum2;
MySet:=[myEnum1,myEnum3];
MyString:='Some text as string';
MyWideString:='Some text as widestring';
MyInteger:=1234;
end;
StreamComponents; StreamComponents;
end; end;
@ -59,22 +117,21 @@ end;
procedure TStreamAsXMLForm.StreamComponents; procedure TStreamAsXMLForm.StreamComponents;
var var
XMLConfig: TXMLConfig; XMLConfig: TXMLConfig;
Writer: TWriter; sl: TStringList;
DestroyDriver: boolean;
begin begin
DebugLn('TStreamAsXMLForm.StreamComponents ',Filename);
XMLConfig:=TXMLConfig.Create(Filename); XMLConfig:=TXMLConfig.Create(Filename);
Writer:=nil;
DestroyDriver:=false;
try try
Writer:=CreateXMLWriter(XMLConfig.Document,DestroyDriver); WriteComponentToXMLConfig(XMLConfig,'Component',GroupBox1);
Writer.WriteRootComponent(GroupBox1);
XMLConfig.Flush; XMLConfig.Flush;
finally finally
if DestroyDriver then
Writer.Driver.Free;
Writer.Free;
XMLConfig.Free; XMLConfig.Free;
end; end;
sl:=TStringList.Create;
sl.LoadFromFile(Filename);
DebugLn('TStreamAsXMLForm.StreamComponents ',sl.Text);
sl.Free;
end; end;
initialization initialization