【程序编程相关:利用VFI提高Delphi程序的重用性 】
【推荐阅读:DBGridEh实现单击标题栏排序方法 】【扩展信息:后台调用外部程序的完美实现(Delphi】
outlook express是一款大家比较熟悉的邮件工具,其html编辑器一直是众多程序员竞相模仿的目标.作者最近在一个项目的开发中,开始接触html编辑器的设计,并遇到了很多的难题.目前网络上关于ie编程的文章中,涉及mshtml编辑器的部分,又大多集中在vc领域,用delphi作为解决方案的少之又少.在经过一番艰难的摸索之后,作者积累了一些成功的经验.并撰成此文,希望与大家共同探讨.注:本文将涉及到com编程,由于com的复杂性,不免会有晦涩难懂之嫌.为了让阅读不至于成为一种折磨,作者将尝试另一种写作模式.文章将随着一个叫做w的程序员的编程思路展开,以通俗易懂的叙事方式带领读者一起探讨在mshtml编辑器的开发过程中可能遇到的一些棘手问题.对于某些需要强调的关键术语,文中将适时的给出注解,以便读者更好的领会.
通过本文的阅读,读者将可以学习到以下内容:
l 掌握twebbrowser控件的用法;l 理解ihtmldocument2与idochostuihandle接口;l 探讨在mshtml中如何加载字符流;l 找回在mshtml编辑器中丢失的回车键;l 实现工具栏的自动感应;l 自定义mshtml编辑器强大的粘贴功能;
本文假定读者已经具备初步的com知识与delphi接口的编程经验,如果您需要对com与接口知识作进一步的深入了解,请参考其它相关文章.
twebbrowser.mshtml.自动化对象.ihtmldocument2.idochostuihandler.filterdataobject.idataobject.剪贴板.粘贴
一个笑话的启示 在一次程序员大会上,主持人为了活跃气氛,做了个小游戏.他问台下的程序员:如果有谁在小的时候拆过闹钟的请举手.台下的程序员们全都举起了手.主持人又问:那么又有谁后来把闹钟装回去的请举手.举起手来的程序员们又都把手放下了.
这个笑话从侧面说明了一个问题,追根求源正是大多数程序员的天性.缺少追根求源的精神,软件设计就会缺少创新的动力.也正是由于有了追根求源的精神,越来越多的软件新手跨越了初期的彷徨,走上了软件高手的道路.
未来的一天,程序员w所在的软件公司接到一个信息管理系统的设计项目.由于最近w刚参加完公司组织的为期一周的com培训,于是项目经理y便把项目中最具挑战的编辑器部分交给他来完成.用户要求实现一个类似outlook express(以下简称oe)那样所见即所得式的编辑器,并可以支持多种来源的粘贴操作.尽管w此前对oe编辑器的原理一无所知,但他还是面带微笑并充满自信的接受了挑战.
揭开oe编辑器的面纱在以往的使用过程中,w发现oe编辑器确实是一款强大的编辑工具.无论是编辑还是粘贴,oe编辑器都能完美的实现所见即所得的效果.oe编辑器本质上是一款html编辑器,其中的数据与格式都以html代码的形式来保存.w以前曾研究过网页上的html编辑器,该编辑器是通过dhtml技术来实现的.那么,oe编辑器与ie浏览器之间是否有什么关系呢?
为了搞清楚这个问题,w调出vc的spy++探个究竟.拖动spy++那个神奇的雷达指向oe编辑窗口,spy++迅速的找到了窗口的类型:“internet explorer_server”,这是个ie服务器窗口类型,这究竟是什么意思呢?
微软的ie浏览器的核心部分是shdocvw.dll与mshtml.dll.从下面的internet explorer的架构图可以看到,ie其实只是一个外壳程序,真正的浏览网页.记录历史等工作都是由封装在shdocvw.dll中的webbrowser control来完成的.而html的解析.脚本引擎.java虚拟机.插件宿主等,则由shdocvw.dll通过调用mshtml.dll来完成.通过shdocvw.dll提供的丰富接口,网页中的元素可以访问外壳应用程序提供的属性与方法;而通过mshtml.dll提供的接口,外壳应用程序则反过来可以访问网页中元素的属性.方法.行为.事件等等.
毫无疑问,oe编辑器正是通过对webbrowser控件与mshtml的封装实现了html的编辑功能.由于webbrowser属于activex控件,所以,利用delphi的activex导入向导,可以轻松的实现对webbrowser控件的封装.导入后将在delphi的import文件夹下自动生成两个tlb文件:shdocvw_tlb与 mshtml_tlb.
delphi自带的twebbrowser 从delphi4开始,delphi就在internet组件面板上提供twebbrowser组件,作为对webbrowser控件的封装.由于delphi的封装并不能保证与最新的webbrowser控件版本相一致,建议delphi7以前的读者先卸载该组件并重新导入shdocvw.dll,以便使用最新的接口功能,
进入twebbrowser的神奇世界感谢delphi,使得一切都变得如此轻松.w启动delphi,新建一个项目,在internet组件面板上找到twebbrowser组件,然后拖放到窗体上,并重命名为“wbeditor”.由于对twebbrowser组件缺乏了解,w决定先请教一下公司的delphi高手老d.
w:老d,你知道twebbrowser组件的用法吗?d:这个简单.twebbrowser有一个document属性,你看一下,这是个idispatch接口类型的属性.对了,idispatch接口你知道吗?w:(支支吾吾)刚学过,不过没弄懂……d:简单点说吧.为了给解释型语言——例如javascript脚本语言——提供调用com对象服务的能力,于是出现了com自动化对象.由于解释型语言无法象编译型语言那样实现与com对象的早期绑定,所以,com自动化对象便提供了idispatch接口供自动化客户端调用.通过idispatch接口,自动化机制中的客户端就可以动态的调用com自动化对象中的方法了……总之啊,idispatch接口是实现com自动化对象机制的关键.你明白吗?w:(似懂非懂,不过想想反正以后还可以再学)嗯,知道了.然后呢?d:ok.由于我们并不需要自动化机制,idispatch接口对我们来说用处不大.但我们可以利用它通过delphi中的as运算符查询到其它我们想要的接口.例如,ihtmldocument2接口在编程中用的比较多,用它可以实现大多数的dhtml功能.w:哦~ihtmldocument2接口(自言自语).那如何进入编辑状态呢?d:答案就在这个ihtmldocument2接口中.这个接口中有一个disignmode属性,在运行时置为“on”就可以从浏览模式转变为编辑模式了.当然了,前提是必须保证document不能为空.... 下一页