unit CreateForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, xmldom,
XMLIntf, msxmldom, XMLDoc, DB, DBTables, ComCtrls, StdCtrls, TypInfo,
ExtCtrls, Menus;
type
TForm1 = class(TForm)
btnSimple: TButton;
Memo1: TMemo;
btnTable: TButton;
btnObject: TButton;
Table1: TTable;
TreeView1: TTreeView;
btnTree: TButton;
XMLDoc: TXMLDocument;
Button1: TButton;
btnRTTI: TButton;
Panel1: TPanel;
Panel2: TPanel;
Splitter1: TSplitter;
procedure btnSimpleClick(Sender: TObject);
procedure btnTableClick(Sender: TObject);
procedure btnObjectClick(Sender: TObject);
procedure btnTreeClick(Sender: TObject);
procedure btnRTTIClick(Sender: TObject);
private
procedure DomToTree(XmlNode: IXMLNode; TreeNode: TTreeNode);
public
end;
var
Form1: TForm1;
implementation
procedure TForm1.btnSimpleClick(Sender: TObject);
var
iXml: IDOMDocument;
iRoot, iNode, iNode2, iChild, iAttribute: IDOMNode;
begin
XMLDoc.Active := False;
XMLDoc.XML.Text := '';
XMLDoc.Active := True;
iXml := XmlDoc.DOMDocument;
iRoot := iXml.appendChild (iXml.createElement ('xml'));
iNode := iRoot.appendChild (iXml.createElement ('test'));
iNode.appendChild (iXml.createElement ('test2'));
iChild := iNode.appendChild (iXml.createElement ('test3'));
iChild.appendChild (iXml.createTextNode('simple value'));
iNode.insertBefore (iXml.createElement ('test4'), iChild);
iNode2 := iNode.cloneNode (True);
iRoot.appendChild (iNode2);
iAttribute := iXml.createAttribute ('color');
iAttribute.nodeValue := 'red';
iNode2.attributes.setNamedItem (iAttribute);
Memo1.Lines.Text := FormatXMLData (XMLDoc.XML.Text);
end;
procedure DataSetToDOM (RootName, RecordName: string;
XMLDoc: TXmlDocument; DataSet: TDataSet);
var
iNode, iChild: IXMLNode;
i: Integer;
begin
DataSet.Open;
DataSet.First;
XMLDoc.DocumentElement := XMLDoc.CreateNode (RootName);
while not DataSet.EOF do
begin
iNode := XMLDoc.DocumentElement.AddChild (RecordName);
for I := 0 to DataSet.FieldCount - 1 do
begin
iChild := iNode.AddChild (DataSet.Fields[i].FieldName);
iChild.Text := DataSet.Fields[i].AsString;
end;
DataSet.Next;
end;
end;
procedure TForm1.btnTableClick(Sender: TObject);
begin
XMLDoc.Active := False;
XMLDoc.XML.Text := '';
XMLDoc.Active := True;
DataSetToDOM ('customers', 'customer', XMLDoc, Table1);
Memo1.Lines := XmlDoc.XML;
end;
procedure AddAttr (iNode: IDOMNode; Name, Value: string);
var
iAttr: IDOMNode;
begin
iAttr := iNode.ownerDocument.createAttribute (name);
iAttr.nodeValue := Value;
iNode.attributes.setNamedItem (iAttr);
end;
procedure TForm1.btnObjectClick(Sender: TObject);
var
iXml: IDOMDocument;
iRoot: IDOMNode;
begin
XMLDoc.Active := False;
XMLDoc.XML.Text := '';
XMLDoc.Active := True;
iXml := XmlDoc.DOMDocument;
iRoot := iXml.appendChild (
iXml.createElement ('Button1'));
AddAttr (iRoot, 'Name', Button1.Name);
AddAttr (iRoot, 'Caption', Button1.Caption);
AddAttr (iRoot, 'Font.Name', Button1.Font.Name);
AddAttr (iRoot, 'Left', IntToStr (Button1.Left));
AddAttr (iRoot, 'Hint', Button1.Hint);
Memo1.Lines := XmlDoc.XML;
end;
procedure TForm1.DomToTree (XmlNode: IXMLNode; TreeNode: TTreeNode);
var
I: Integer;
NewTreeNode: TTreeNode;
NodeText: string;
AttrNode: IXMLNode;
begin
if not (XmlNode.NodeType = ntElement) then
Exit;
NodeText := XmlNode.NodeName;
if XmlNode.IsTextElement then
NodeText := NodeText + ' = ' + XmlNode.Text;
NewTreeNode := TreeView1.Items.AddChild(TreeNode, NodeText);
for I := 0 to xmlNode.AttributeNodes.Count - 1 do
begin
AttrNode := xmlNode.AttributeNodes.Nodes[I];
TreeView1.Items.AddChild(NewTreeNode,
'[' + AttrNode.NodeName + ' = "' + AttrNode.Text + '"]');
end;
if XmlNode.HasChildNodes then
for I := 0 to xmlNode.ChildNodes.Count - 1 do
DomToTree (xmlNode.ChildNodes.Nodes [I], NewTreeNode);
end;
procedure TForm1.btnTreeClick(Sender: TObject);
begin
TreeView1.Items.BeginUpdate;
try
TreeView1.Items.Clear;
DomToTree (XmlDoc.DocumentElement, nil);
TreeView1.FullExpand;
finally
TreeView1.Items.EndUpdate;
end;
end;
procedure ComponentToDOM (iNode: IXmlNode; Comp: TPersistent);
var
nProps, i: Integer;
PropList: PPropList;
Value: Variant;
newNode: IXmlNode;
begin
nProps := GetTypeData (Comp.ClassInfo)^.PropCount;
GetMem (PropList, nProps * SizeOf(Pointer));
try
GetPropInfos (Comp.ClassInfo, PropList);
for i := 0 to nProps - 1 do
begin
Value := GetPropValue (Comp, PropList [i].Name);
NewNode := iNode.AddChild(PropList [i].Name);
NewNode.Text := Value;
if (PropList [i].PropType^.Kind = tkClass) and (Value <> 0) then
if TObject (Integer(Value)) is TComponent then
NewNode.Text := TComponent (Integer(Value)).Name
else
ComponentToDOM (newNode, TObject (Integer(Value)) as TPersistent);
end;
finally
FreeMem (PropList);
end;
end;
procedure TForm1.btnRTTIClick(Sender: TObject);
begin
XMLDoc.Active := False;
XMLDoc.XML.Text := '';
XMLDoc.Active := True;
XMLDoc.DocumentElement := XMLDoc.CreateNode(self.ClassName);
ComponentToDOM (XMLDoc.DocumentElement, self);
Memo1.Lines := XmlDoc.XML;
end;
end.
|