CreateForm.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:6k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit CreateForm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, xmldom,
  5.   XMLIntf, msxmldom, XMLDoc, DB, DBTables, ComCtrls, StdCtrls, TypInfo,
  6.   ExtCtrls, Menus;
  7. type
  8.   TForm1 = class(TForm)
  9.     btnSimple: TButton;
  10.     Memo1: TMemo;
  11.     btnTable: TButton;
  12.     btnObject: TButton;
  13.     Table1: TTable;
  14.     TreeView1: TTreeView;
  15.     btnTree: TButton;
  16.     XMLDoc: TXMLDocument;
  17.     Button1: TButton;
  18.     btnRTTI: TButton;
  19.     Panel1: TPanel;
  20.     Panel2: TPanel;
  21.     Splitter1: TSplitter;
  22.     procedure btnSimpleClick(Sender: TObject);
  23.     procedure btnTableClick(Sender: TObject);
  24.     procedure btnObjectClick(Sender: TObject);
  25.     procedure btnTreeClick(Sender: TObject);
  26.     procedure btnRTTIClick(Sender: TObject);
  27.   private
  28.     procedure DomToTree(XmlNode: IXMLNode; TreeNode: TTreeNode);
  29.     { Private declarations }
  30.   public
  31.     { Public declarations }
  32.   end;
  33. var
  34.   Form1: TForm1;
  35. implementation
  36. {$R *.DFM}
  37. procedure TForm1.btnSimpleClick(Sender: TObject);
  38. var
  39.   iXml: IDOMDocument;
  40.   iRoot, iNode, iNode2, iChild, iAttribute: IDOMNode;
  41. begin
  42.   // empty the document
  43.   XMLDoc.Active := False;
  44.   XMLDoc.XML.Text := '';
  45.   XMLDoc.Active := True;
  46.   // root
  47.   iXml := XmlDoc.DOMDocument;
  48.   iRoot := iXml.appendChild (iXml.createElement ('xml'));
  49.   // node "test"
  50.   iNode := iRoot.appendChild (iXml.createElement ('test'));
  51.   iNode.appendChild (iXml.createElement ('test2'));
  52.   iChild := iNode.appendChild (iXml.createElement ('test3'));
  53.   iChild.appendChild (iXml.createTextNode('simple value'));
  54.   iNode.insertBefore (iXml.createElement ('test4'), iChild);
  55.   // node replication
  56.   iNode2 := iNode.cloneNode (True);
  57.   iRoot.appendChild (iNode2);
  58.   // add an attribute
  59.   iAttribute := iXml.createAttribute ('color');
  60.   iAttribute.nodeValue := 'red';
  61.   iNode2.attributes.setNamedItem (iAttribute);
  62.   // show XML in memo
  63.   Memo1.Lines.Text := FormatXMLData (XMLDoc.XML.Text);
  64. end;
  65. procedure DataSetToDOM (RootName, RecordName: string;
  66.   XMLDoc: TXmlDocument; DataSet: TDataSet);
  67. var
  68.   iNode, iChild: IXMLNode;
  69.   i: Integer;
  70. begin
  71.   DataSet.Open;
  72.   DataSet.First;
  73.   // root
  74.   XMLDoc.DocumentElement := XMLDoc.CreateNode (RootName);
  75.   // add table data
  76.   while not DataSet.EOF do
  77.   begin
  78.     // add a node for each record
  79.     iNode := XMLDoc.DocumentElement.AddChild (RecordName);
  80.     for I := 0 to DataSet.FieldCount - 1 do
  81.     begin
  82.       // add an element for each field
  83.       iChild := iNode.AddChild (DataSet.Fields[i].FieldName);
  84.       iChild.Text := DataSet.Fields[i].AsString;
  85.     end;
  86.     DataSet.Next;
  87.   end;
  88. end;
  89. procedure TForm1.btnTableClick(Sender: TObject);
  90. begin
  91.   // empty the document
  92.   XMLDoc.Active := False;
  93.   XMLDoc.XML.Text := '';
  94.   XMLDoc.Active := True;
  95.   // add the table to the DOM
  96.   DataSetToDOM ('customers', 'customer', XMLDoc, Table1);
  97.   // show XML in memo
  98.   Memo1.Lines := XmlDoc.XML;
  99. end;
  100. procedure AddAttr (iNode: IDOMNode; Name, Value: string);
  101. var
  102.   iAttr: IDOMNode;
  103. begin
  104.   iAttr := iNode.ownerDocument.createAttribute (name);
  105.   iAttr.nodeValue := Value;
  106.   iNode.attributes.setNamedItem (iAttr);
  107. end;
  108. procedure TForm1.btnObjectClick(Sender: TObject);
  109. var
  110.   iXml: IDOMDocument;
  111.   iRoot: IDOMNode;
  112. begin
  113.   // empty the document
  114.   XMLDoc.Active := False;
  115.   XMLDoc.XML.Text := '';
  116.   XMLDoc.Active := True;
  117.   // root
  118.   iXml := XmlDoc.DOMDocument;
  119.   iRoot := iXml.appendChild (
  120.     iXml.createElement ('Button1'));
  121.   // a few properties as attributes (might also be nodes)
  122.   AddAttr (iRoot, 'Name', Button1.Name);
  123.   AddAttr (iRoot, 'Caption', Button1.Caption);
  124.   AddAttr (iRoot, 'Font.Name', Button1.Font.Name); // sub-elements?
  125.   AddAttr (iRoot, 'Left', IntToStr (Button1.Left));
  126.   AddAttr (iRoot, 'Hint', Button1.Hint);
  127.   // show XML in memo
  128.   Memo1.Lines := XmlDoc.XML;
  129. end;
  130. procedure TForm1.DomToTree (XmlNode: IXMLNode; TreeNode: TTreeNode);
  131. var
  132.   I: Integer;
  133.   NewTreeNode: TTreeNode;
  134.   NodeText: string;
  135.   AttrNode: IXMLNode;
  136. begin
  137.   // skip text nodes and other special cases
  138.   if not (XmlNode.NodeType = ntElement) then
  139.     Exit;
  140.   // add the node itself
  141.   NodeText := XmlNode.NodeName;
  142.   if XmlNode.IsTextElement then
  143.     NodeText := NodeText + ' = ' + XmlNode.Text;
  144.   NewTreeNode := TreeView1.Items.AddChild(TreeNode, NodeText);
  145.   // add attributes
  146.   for I := 0 to xmlNode.AttributeNodes.Count - 1 do
  147.   begin
  148.     AttrNode := xmlNode.AttributeNodes.Nodes[I];
  149.     TreeView1.Items.AddChild(NewTreeNode,
  150.       '[' + AttrNode.NodeName + ' = "' + AttrNode.Text + '"]');
  151.   end;
  152.   // add each child node
  153.   if XmlNode.HasChildNodes then
  154.     for I := 0 to xmlNode.ChildNodes.Count - 1 do
  155.       DomToTree (xmlNode.ChildNodes.Nodes [I], NewTreeNode);
  156. end;
  157. procedure TForm1.btnTreeClick(Sender: TObject);
  158. begin
  159.   TreeView1.Items.BeginUpdate;
  160.   try
  161.     TreeView1.Items.Clear;
  162.     DomToTree (XmlDoc.DocumentElement, nil);
  163.     TreeView1.FullExpand;
  164.   finally
  165.     TreeView1.Items.EndUpdate;
  166.   end;
  167. end;
  168. procedure ComponentToDOM (iNode: IXmlNode; Comp: TPersistent);
  169. var
  170.   nProps, i: Integer;
  171.   PropList: PPropList;
  172.   Value: Variant;
  173.   newNode: IXmlNode;
  174. begin
  175.   // get list of properties
  176.   nProps := GetTypeData (Comp.ClassInfo)^.PropCount;
  177.   GetMem (PropList, nProps * SizeOf(Pointer));
  178.   try
  179.     GetPropInfos (Comp.ClassInfo, PropList);
  180.     // shortcut: use variants...
  181.     for i := 0 to nProps - 1 do
  182.     begin
  183.       Value := GetPropValue (Comp, PropList [i].Name);
  184.       NewNode := iNode.AddChild(PropList [i].Name);
  185.       NewNode.Text := Value;
  186.       if (PropList [i].PropType^.Kind = tkClass) and (Value <> 0) then
  187.         if TObject (Integer(Value)) is TComponent then
  188.           NewNode.Text := TComponent (Integer(Value)).Name
  189.         else
  190.           // TPersistent but not TComponent: recurse
  191.           ComponentToDOM (newNode, TObject (Integer(Value)) as TPersistent);
  192.     end;
  193.   finally
  194.     FreeMem (PropList);
  195.   end;
  196. end;
  197. procedure TForm1.btnRTTIClick(Sender: TObject);
  198. begin
  199.   // empty the document
  200.   XMLDoc.Active := False;
  201.   XMLDoc.XML.Text := '';
  202.   XMLDoc.Active := True;
  203.   // create the root for the object and adds its properties
  204.   XMLDoc.DocumentElement := XMLDoc.CreateNode(self.ClassName);
  205.   ComponentToDOM (XMLDoc.DocumentElement, self);
  206.   // show XML in memo
  207.   Memo1.Lines := XmlDoc.XML;
  208. end;
  209. end.