网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.用Delphi实现BP机、手机短讯.
.用DLL方式封装MDI子窗体.
.用Delphi模拟组件的两阶段提交.
.使用Delphi创建IIS虚拟目录.
.Delphi中停靠技术的实现.
.使用静态数组应该注意的问题.
.用Delphi创建服务程序.
.开发一个密码查看器.
.Delphi模式编程之策略模式(上).
.黑白图像的缩小灰度级显示算法的.
.Delphi组件与属性编辑器.
.DELPHI加注册表自启动的最简单代.
.Delphi代码风格约定.
.在Delphi里播放Flash.
.COM/DCOM中如何传递数组.
.判断MonthCalander中鼠标点中了日.
.Deiphi编译优化导致的死循环.
.Delphi中的包(三):bpl和dll.
.MapX使用数据库数据添加专题图(系.
.一个多线程后台扫描的程序和源代.

DFM文件与XML文件互转

发表日期:2006-2-4


dfm文件是Delphi中存储窗体控件信息的,有时为了对大批量的dfm文件操作(如:批量替换控件、作检查等),往往不是太方便。
XML对结构化的数据读写则很强,将文本类型的dfm转为xml后进行操作,再转回dfm存储大大方便了操作。

 

//DFM to XML
procedure Dfm2Xml(ADfmStrings: TStrings; AXml: IDsXmlDocument);
Var
  i: integer;
  mStr : string;
  mParentNode, mNode : IDsXMLNode;
  mObjName, mClass, mObjType: string;
  mPropName, mPropValue: string;
  mInItem: Boolean;   //有Item的也会有End相对,所以要和Object end分开
begin
  mInItem := False;
  mParentNode := AXML;
  for i:=0 to ADfmStrings.Count - 1 do
  begin
    mStr := trim(ADfmStrings.Strings[i]);
    //对象开始
    if (copy(mStr, 1, 6) = 'object') or (copy(mStr, 1, 9) = 'inherited') then
    begin
      //先写入属性 - 如果还有属性没有写
      if mPropName <> '' then
      begin
        mNode := AXml.createElement(mPropName);
        mNode.text := mPropValue;
        mParentNode.appendChild(mNode);
        mPropName := '';
      end;
      mObjType := CutToken(mStr, ' ');          //Type: object or inherited
      mObjName := CutToken(mStr, ': ');         //ObjName: Ex. frmCmsI03
      mClass := mStr;                           //ClassName: Ex. TButton
      mNode := AXml.createElement(mObjName);
      (mNode as IDsXmlElement).setAttribute('ObjType', mObjType);
      (mNode as IDsXmlElement).setAttribute('Class', mClass);
      mParentNode.appendChild(mNode);
      mParentNode := mNode;
    end
    //对象结束
    else if (mStr = 'end') and (not mInItem) then
    begin
      //先写入属性
      if mPropName <> '' then
      begin
        mNode := AXml.createElement(mPropName);
        mNode.text := mPropValue;
        mParentNode.appendChild(mNode);
        mPropName := '';
      end;
      mParentNode := mParentNode.parentNode;
    end
    //属性处理
    else
    begin
      //有 = 说明是一个属性的新的开始
      if (Pos(' = ', mStr) > 0) and (not mInItem) then
      begin
        //先写入属性
        if mPropName <> '' then
        begin
          mNode := AXml.createElement(mPropName);
          mNode.text := mPropValue;
          mParentNode.appendChild(mNode);
        end;
        mPropName := CutToken(mStr, ' = ');
        mPropValue := CutToken(mStr, ' = ');
      end
      else   //说明这个属性可能有多行
        mPropValue := mPropValue + '#13#10' + mStr;
        if mStr = 'item' then mInItem := True;
        if mStr = 'end' then mInItem := False;
    end;
  end;
end;
//XML to DFM
procedure Xml2Dfm(AXml: IDsXmlDocument; ADfmStrings: TStrings);
  procedure Node2Dfm(ANode: IDsXMLNode; oString: TStrings; IdentSpace: string);
  Var
    mObjName, mClass, mObjType: string;
    mPropName, mPropValue: string;
    mNode : IDsXMLNode;
    i: integer;
    mVar : Variant;
  begin
    mObjName := (ANode as IDsXmlElement).NodeName;
    mClass   := (ANode as IDsXmlElement).getAttribute('Class');
    mObjType := (ANode as IDsXmlElement).getAttribute('ObjType');
    //写入Object begin
    oString.Add(Format('%s%s %s: %s', [IdentSpace, mObjType, mObjName, mClass]));
    //写入属性
    for i:= 0 to ANode.childNodes.length - 1 do
    begin
      mNode := ANode.childNodes.item[i];
      //Has Child 说明是一个新的对象
      mVar := (mNode as IDsXmlElement).getAttribute('ObjType');
      if not varIsNull(mVar)  then
        Node2Dfm(mNode, oString, IdentSpace + '  ')
      //是属性,写进去就好了.
      else
      begin
        mPropName := mNode.nodeName;
        mPropValue := mNode.text;
        mPropValue := StringReplace(mPropValue, '#13#10', #13#10, [rfReplaceAll]);
        //写入:缩进
        oString.Add(Format('%s%s = %s', [IdentSpace+'  ', mPropName, mPropValue]));
      end;
    end;
    //写入End
    oString.Add(Format('%send', [IdentSpace]));
  end;
  
begin
  Node2Dfm(AXml.Get_documentElement, ADfmStrings, '');
end;

用到的类型:

uses
   MSXML2_TLB;
//类型自己重新定义过
type
  IDsXmlDocument = IXMLDOMDocument2;
  IDsXmlNode     = IXMLDOMNode;
  IDsXmlElement  = IXMLDOMElement;
  IDsXmlNodeList = IXMLDOMNodeList;
上一篇:生成BIG5字符集所有字符 人气:5046
下一篇:自己编写树(Tree)的封装类 人气:3942
浏览全部Delphi的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐