delphi(7 2007) 下 用 intraweb 开发 web...

376
Delphi(72007) IntraWeb 开发 WEB 程序应用实战 (实验版 2.0作者:高勇 (此书通过 www.2ccc.com 免费发布,请勿转载) 2007 10 22 日星期一

Upload: others

Post on 07-Jul-2020

8 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

Delphi(7、2007) 下 用 IntraWeb开发WEB程序应用实战

(实验版 2.0)

作者:高勇 (此书通过 www.2ccc.com免费发布,请勿转载)

2007年 10月 22日星期一

Page 2: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

目 录 目 录...................................................................................................................................................................2 第一章 IntraWeb 入门 ......................................................................................................................................6

1.1 为什么选择 IntraWeb.......................................................................................................................6 1.2 IntraWeb9.x和 TMS IntraWeb Component的安装指导.................................................................7 1.3 我的第一个 IntraWeb程序 ............................................................................................................11 1.4 IntraWeb开发成果预览 .................................................................................................................15 1.5 Windows下 IntraWeb开发后的发布 ...........................................................................................18 1.6 IntraWeb低版本的源码如何在高版本中运行 .............................................................................19 1.7 建立一个 Apache作为发布器的程序...........................................................................................20 1.8 Intraweb与 Ajax技术....................................................................................................................21

第二章 AppMode 下的实用开发指南...........................................................................................................23 2.1 IntraWeb的两种开发模式的比较 .................................................................................................23 2.2 建立一个以独立的应用程序的形式发布的程序 .........................................................................23 2.3 建立一个以 iis作为发布器发布的程序 .......................................................................................30 2.4 IntraWeb程序.exe与.dll两种发布形式的相互转换....................................................................35 2.5 用 html模板美化我们的程序........................................................................................................37 2.6 IntraWeb程序开发经验小结 .........................................................................................................40

第三章 Intraweb编程专题讲座......................................................................................................................42 3.1 用虚拟键盘输入密码.....................................................................................................................42 3.2 IntraWeb数据库报表解决方案之一 .............................................................................................45 3.3 IntraWeb数据库报表解决方案之二 .............................................................................................61 3.4 在 IntraWeb中轻松实现通用的 HTML文本编辑器 ...................................................................67 3.5 让超级链接变成可向服务器传递参数的按钮 .............................................................................70 3.6 实现网页复杂提示信息框.............................................................................................................74 3.7 实现网页中的目录树.....................................................................................................................78 3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息)...................................................82 3.9 用 html模板格式化输出数据库中的数据....................................................................................92 3.10 用自己的代码实现表格翻页控件...............................................................................................96 3.11 窗口切换详解.............................................................................................................................104 3.12 窗口之间数据参数传递详解.....................................................................................................107 3.13 使用 Cookies在客户端保存数据..............................................................................................111 3.14 让 IE的后退按钮重新发挥作用 ...............................................................................................113 3.15 用 Frame来实现各页面的公共菜单.........................................................................................115 3.16 用 realone插件来播放声音(视频) .......................................................................................117

第四章 完整应用实例讲解...........................................................................................................................119 4.1 一个电影网站的出生之旅...........................................................................................................128

4.1.1 网站模板与运行界面.............................................................................................................128 4.1.2 程序代码全面解析.................................................................................................................138 4.1.2.1 ServerController单元 ........................................................................................................138 4.1.2.2 UserSessionUnit单元 ........................................................................................................157 4.1.2.3 FBaseform单元 .................................................................................................................159 4.1.2.4 FMainForm单元................................................................................................................166 4.1.2.5 FlistForm单元 ...................................................................................................................169

Page 3: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

4.1.2.6 FRegForm单元..................................................................................................................174 4.1.2.7 FplayForm单元 .................................................................................................................178 4.1.2.8 FSystem单元 .....................................................................................................................180 4.1.2.9 FUserForm单元 ................................................................................................................186 4.1.2.10 Fadminform单元 .............................................................................................................190 4.1.2.11 FControl单元...................................................................................................................194

4.2 一个英语教学网站的综合编程.................................................................................................208 4.2.1 网站整体设计简要说明.........................................................................................................208 4.2.2 unit ServerController导读....................................................................................................208 4.2.3 unit UserSessionUnit导读 ....................................................................................................209 4.2.4 unit MainMenu1导读 ...........................................................................................................211 4.2.5 unit Uindex导读 ...................................................................................................................214 4.2.6 unit Upart2导读....................................................................................................................232 4.2.7 unit Upart3导读....................................................................................................................236 4.2.8 unit Upart4导读....................................................................................................................238 4.2.9 unit Unitcsyd(测试园地)导读 .........................................................................................241 4.2.10 unit UShenQingZhuCe(申请注册)导读 ........................................................................257 4.2.11 unit UYongHuXinXiChaXun(用户信息查询,对应当前用户信息查询修改菜单)导读...........................................................................................................................................................261 4.2.12 unit UYongHuGuanLi(用户管理)导读 .........................................................................264 4.2.13 unit UxiazaiYuYin(下载语音,对应音像剪接菜单)导读 ...........................................270

第五章 Intraweb编程通用框架....................................................................................................................315 5.1 使用通用框架的目的...................................................................................................................315 5.2 通用框架的基本结构...................................................................................................................315 5.3 通用函数导读与讲解...................................................................................................................317 5.4 使用框架的注意事项...................................................................................................................322

第六章 项目立项评介系统...........................................................................................................................324 6.1 系统简介.......................................................................................................................................324

第七章 附录...................................................................................................................................................325 7.1 IntraWeb 控件使用简要说明 ....................................................................................................325

7.1.1、TIWServerController ............................................................................................................325 7.1.2、TIWApplication.....................................................................................................................327 7.1.3、TIWForm...............................................................................................................................330 7.1.4、TIWControl ...........................................................................................................................332 7.1.5、TIWButton ............................................................................................................................334 7.1.6、TIWCheckBox ......................................................................................................................335 7.1.7、TIWEdit.................................................................................................................................336 7.1.8、TIWComboBox.....................................................................................................................336 7.1.9、TIWListbox ...........................................................................................................................337 7.1.10、TIWLabel ............................................................................................................................337 7.1.11、TIWImage ...........................................................................................................................337 7.1.12、TIWImageFile .....................................................................................................................338 7.1.13、TIWMemo...........................................................................................................................339 7.1.14、TIWText ..............................................................................................................................339 7.1.15、TIWFile ...............................................................................................................................339 7.1.16、TIWURL .............................................................................................................................339 7.1.17、TIWURLTarget....................................................................................................................340

Page 4: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

7.1.18、TIWLink..............................................................................................................................340 7.1.19、TIWRegion..........................................................................................................................341 7.1.20、TIWRectangle .....................................................................................................................341 7.1.21、TIWGrid..............................................................................................................................341 7.1.22、TIWGridCell .......................................................................................................................342 7.1.23、TIWTreeView......................................................................................................................343 7.1.24、TIWTreeViewItems.............................................................................................................343 7.1.25、TIWTreeViewItem ..............................................................................................................343 7.1.26、TIWMenu............................................................................................................................344 7.1.27、TIWMenuStyle....................................................................................................................344 7.1.28、TIWApplet...........................................................................................................................345 7.1.29、TIWFlash.............................................................................................................................345 7.1.30、TIWHRule...........................................................................................................................345 7.1.31、TIWList ...............................................................................................................................345 7.1.32、TIWRadioGroup..................................................................................................................345 7.1.33、TIWTimer............................................................................................................................345 7.1.34、TIWDBCheckBox...............................................................................................................345 7.1.35、TIWDBComboBox .............................................................................................................346 7.1.36、TIWDBEdit .........................................................................................................................346 7.1.37、TIWDBGrid ........................................................................................................................346 7.1.38、TIWDBGridColumns ..........................................................................................................347 7.1.39、TIWDBGridColumn............................................................................................................348 7.1.40、TIWDBImage......................................................................................................................349 7.1.41、TIWDBNavigator................................................................................................................349 7.1.42、TIWDBListbox....................................................................................................................350 7.1.43、TIWDBLookupListBox和 TIWDBLookupComboBox.....................................................350 7.1.44、TIWDBMemo .....................................................................................................................350 7.1.45、TIWDBFile..........................................................................................................................350 7.1.46、TIWDBText.........................................................................................................................350 7.1.47、TIWClientSideDatasetDBLink ...........................................................................................350 7.1.48、TIWClientSideDataset ........................................................................................................350 7.1.49、TIWCSNavigator ................................................................................................................350 7.1.50、TIWCSLabel .......................................................................................................................351 7.1.51、TIWDynGrid .......................................................................................................................351 7.1.52、TIWDynamicChart..............................................................................................................351 7.1.53、TIWDynamicChartLegend..................................................................................................352 7.1.54、TIWTemplateProcessorHTML............................................................................................352 7.1.55、TIWLayoutMgrHTML........................................................................................................353 7.1.56、TIWLayoutMgrForm ..........................................................................................................354

7.2 TMS For IntraWeb控件简介 ..........................................................................................................354 7.2.1 TMS内嵌 HTML编辑器 ....................................................................................................354 7.2.3 TMS的编辑类控件..............................................................................................................356 7.2.4 TMS的列表类控件..............................................................................................................358 7.2.6 TMS的菜单类控件..............................................................................................................362 7.2.7 TMS的图形类控件..............................................................................................................363 7.2.8 TMS的面板类控件..............................................................................................................364 7.2.1 TMS表格的结构样式..........................................................................................................366

Page 5: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

7.2.3 表头控制(Header).................................................................................................................369 7.2.4 列的控制(Columns)..............................................................................................................369 7.2.5 脚注控制(Footer) ............................................................................................................372 7.2.6 TMS表格的高级应用..........................................................................................................373

Page 6: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.1 为什么选择 IntraWeb 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 6页/共 376页

第一章 IntraWeb 入门

1.1 为什么选择 IntraWeb IntraWeb 是 Delphi 自 带 的 一 套 Web 开 发 框 架 , 它 由 Atozed Software 公 司

(http://www.atozedsoftware.com)在 2002 年制作,并完美的植入 Delphi7 中。Intraweb 同以往所有的Web开发框架相比,是一个革命性的产品,特点就是:

1.完全支持所见即所得的开发方式,同标准的Windows程序开发几乎一模一样,你只要在窗体上放置编辑框,按钮,组合框,标签等等可视化控件,运行程序后所获得网页和你所设计时所看到的效

果是完全一致的。 2.另外 IntraWeb 同 ASP.net 的 WebForm 的开发方式非常类似,也支持各类 Server 端事件,象

Button的 OnClick事件等等。只要学过标准Windows开发的程序员学习 IntraWeb开发可以毫不夸张地说,没有任何学习曲线,你甚至可以不需要有任何的 HTML、XML、JavaScript等等网站编程知识,你只需要懂得 Delphi就足够了。

3.因为 Intraweb 的作者 Kuduz 是著名的网络开发组件 Indy的创始人,有着极强的网络服务器开发经验,在 Intraweb中集成了一个小巧的 http server,可以方便的进行 web程序跟踪调试排错,它比 Borland的Web App Debugger运行速度要快,要更稳定。

4.支持非常简单直观的 Session。 5.由于 IntraWeb是基于 Delphi的,它可以使用 VCL来简单的开发控件,使得 IntraWeb的控件达

到一个不可思议的数量,类似于一般的简单网站,IntraWeb只需要拖入控件,不需要编写代码即可完成。

IntraWeb很像是普通的应用程序,唯一不同的是它的用户界面是用浏览器代替了通常的Windows界面,当把应用程序安装到 Web 服务器上之后,用户马上就可以通过它的网络地址来开启它,应用程序会马上建立使用者的用户信息,这样就可以避免丢失用户信息或者与其它的使用者发生使用混乱。

每一个用户的使用信息都会由程序自动创建和跟踪,并且对于开发者来说,是透明的。其它的开发语

言,像 ISAPI,CGI,ASP处理这些问题的能力都不是很好。IntraWeb设计成一套能创建基于Web的各种类型应用程序的开发工具,不论是一个简单的数据输入界面,投票或是一个更复杂的让已访问过的

客户能顺利登录的应用程序,IntraWeb都能胜任。 在更高的一个层次上,IntraWeb是一组封装了 HTTP和 HTML层的组件体系结构。并且它从来不

会将我们限制在某一个特定的范围内,就像 VCL一样,我们可以随时在需要的地方使用 IntraWeb组件与 HTML层交互。 目前 IntraWeb是 Delphi 里开发 BS程序最好的工具。从 Delphi7开始,它就正式成为 Delphi的

一个组件,当时的版本为 5.0.43。在 Delphi2007中已经改名为 VCL for the Web,可见其在 Delphi中开发 B/S程序的地位和其推进的决心。产品更新很快,是一个快速开发 BS程序的好工具,从某种意义上讲,它可以与.NET 相抗衡。目前发布的版本是 9.0.32 版,但最新版本是 9.0.41 版。用IntraWeb9.0.41 版开发的 Web 应用,甚至可以上传到服务器就立即生效,不需要进行部署。只要是支持 ASP或是 JSP的主机,都支持 IntraWeb程序。 用 IntraWeb 开发 Web 应用,与使用 Delphi 开发普通程序几乎一样,这样,一个优秀的 Delphi

程序员经过简单的实践就可以成为优秀的Web应用开发员,所有的 Delphi所给你的习惯和经验都可以得以保留,这真是一件很美妙的事情。

Page 7: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.2 IntraWeb9.x和 TMS IntraWeb Component的安装指导 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 7页/共 376页

用 IntraWeb做Web开发时,程序员可以不懂 HTML、JavaScript语言,就可以开发出比 ASP,JSP和.NET等工具开发的Web 应用还要好,如果懂,那就是如虎添翼,开发出来的Web 应用就更好了。 本书不以 Delphi7自带的版本来讲解,而是以它的 9.0.41(注:2007年 5月最高版本)版本来讲解。 IntraWeb除了自带丰富的控件,而且还有大量的第三方控件的支持,最常用的当属 TMS IntraWeb

Component(http://www.tmssoftware.com/site/tmsiwprose.asp),它提供的 70多个控件和详细的示例代码,是用 delphi编写 intraweb程序不可缺少的优秀控件。在下一节中我们将介绍这两套控件的安装注意事项。

1.2 IntraWeb9.x和 TMS IntraWeb Component的安装指导 万事开头难,磨刀不误砍柴工。先准备好我们的刀——安装好我们所需要的控件: 1、打开 Delphi 7 ,选择 component 菜单,点击 install packages,在弹出的对话框中找到有

IntraWeb的那个选项,选中它,点击 remove按钮,一路确定,直至完成 Intraweb5.0的卸载。一定要先卸载,这是经验(有其它版本的也是一样操作)。如果已经安装相应的 9.x版本,请从控制面版的添加删除程序中卸载,如图 1-2-1所示:

图 1-2-1 IntraWeb 9.x卸载界面

卸载后请把本书所用控件\intraweb9.0.41\delin.bat放到 delphi7或 delphi2007的 lib下运行一次。 2、先关闭 Delphi 7,再双击本书所用控件\intraweb9.0.41\iw9.0.41.exe(IntraWeb 9.0.41 的下

载链接:http://downloads.atozedsoftware.com/intraweb/iw9.0.41.exe 下载)进行 IntraWeb 9.0.41的安装,选择相应的 Delphi版本,全部一路默认即可,如图 1-2-2所示:

Page 8: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.2 IntraWeb9.x和 TMS IntraWeb Component的安装指导 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 8页/共 376页

图 1-2-2 IntraWeb 9.x安装过程

安装完毕后,请将 C:\Program Files\IntraWeb 9.0\LibD7 和 C:\Program Files\IntraWeb

9.0\LibD7\DUnit用右边的向上按钮移动到最前面,否则编译时会出现版本不一至的问题,如图 1-2-3所示:

图 1-2-3 调整搜索路径的次序

这样安装的是体验版本,但用来学习不会有什么问题的。Delphi 2007 安装的是 9.0.14 版本了。

IntraWeb在 Delphi 7和 Delphi 2007下是类似的。 在 Delphi2007中安装时有很多人遇到以下错误,如图 1-2-4所示:

图 1-2-4 Delphi 2007下安装 IntraWeb 9.x后打开时的出错界面

“无法定位程序输入点@Inglobal @BytesToString$qqrx25System@ %DynamicArray$tuc%

x20Inglobal@TIdEncoding 于动态链接库 Intraweb_90_100.bpl 上”。这是因为先前版本的 intraweb的相关文件卸载不完整,要解决此问题请执行以下步骤:先关闭所有版本的 delphi 程序,再卸载

Page 9: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.2 IntraWeb9.x和 TMS IntraWeb Component的安装指导 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 9页/共 376页

intraweb,然后搜索系统目录下的所有*intraweb*.bpl 和 *intraweb*.dcp 文件,并将其全部删除,最后重新安装 intrweb即可。 安装 TMS IntraWeb Component,安装前请将文件夹本书所用控件\intraweb9.0.41拷贝到一个相

对固定的目录,此处为 C:\Program Files\BDS2007liteV8\intraweb9.0.41。这里提供的版本为 release Feb 22, 2007: v3.3.1.1(网上搜集,仅供学习之用,严禁用于商业用途,购买正版请访问http://www.tmssoftware.com ), 其 安 装 非 常 简 单 : 先 加 入 相 应 的 library path: intraweb9.0.41\iwptms_v3.1.1.1 和 intraweb9.0.41\iwptms_v3.1.1.1\xlsadapter,Delphi7 如图 1-2-5所示:

图 1-2-5 Delphi 7下安装 IntraWeb 9.x加入相应的 library path

Delphi2007如图 1-2-6所示:

图 1-2-6 Delphi 2007下安装 IntraWeb 9.x加入相应的 library path

接下来 Delphi7 下请打开并依次安装如下安装包: IW9TMSD7.dpk, IW9TMSDED7.dpk,IW9TMSGRIDD7.dpk,IW9TMSGRIDDED7.dpk,IW9TMSXLSD7.dpk,如图 1-2-7所示:

Page 10: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.2 IntraWeb9.x和 TMS IntraWeb Component的安装指导 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 10页/共 376页

图 1-2-7 Delphi 7下安装 IntraWeb 9.x所打开的安装包

Delphi2007 下请打开并依次安装如下安装包: iw9tmsd2007.dpk, iw9tmsded2007.dpk,iw9tmsgridd2007.dpk,iw9tmsgridded2007.dpk,iw9tmsxlsd2007.dpk,如图 1-2-8所示:

图 1-2-8 Delphi 7下安装 IntraWeb 9.x所打开的安装包

本书提供的所有源代码可以在Delphi 2007编译通过,随书光盘也提供有Delphi 2007下的源代码。

图 1-2-9 IntraWeb 9.0.41安装图标

Page 11: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.3 我的第一个 IntraWeb程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 11页/共 376页

1.3 我的第一个 IntraWeb程序 1、打开 Delphi 7,点击 file->new->other,在弹出对话框中选择 VCLfor the Web选项卡,选择

IntraWeb Application Wizard,点击 Ok。

图 1-3-1 VCLfor the Web选项卡

2、在弹出对话框中点击 Ok。

图 1-3-2 IntraWeb 程序向导

3、点击 file->save,将文件分别保存为 Umain.pas,UserSessionUnit.pas,ServerController.pas,Project1.dpr。

4、切换到 Umain的主窗口,从 IW Standard选项卡上布置相应的控件如 IEForm1窗口所示。光

Page 12: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.3 我的第一个 IntraWeb程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 12页/共 376页

盘中有源代码,可以打开,将鼠标放在窗口控件上即可知道是什么控件。这是 Delphi基本知识,在此不作过多讲述。控件的Caption属性都作了修改,IWRegion1的 visible属性改为 false,这样 IWRegion1内的所有控件在网页显示时是不可见的。IWURL1的 UseTarget属性改为 true,这是为了在新窗口中打开这个链接,IWURL1的 URL属性中输入 http://www.2ccc.com。其它的属性都没有改变。

5、双击登录按钮,为登录按钮的 onClick事件填写代码,如下所示: procedure TIWForm1.IWButton1Click(Sender: TObject); begin self.WebApplication.ShowMessage(IWEdit1.Text + '你好,欢迎你登录'); //用对话框的形式显示 IWEdit1中输入的内容和“你好,欢迎你登录”。 IWRegion1.Visible := true;//显示 IWRegion1和它内部的控件。 end; 6、双击提交按钮,为提交按钮的 onClick事件填写代码,如下所示: procedure TIWForm1.IWButton2Click(Sender: TObject); begin self.WebApplication.ShowMessage('你好,你提交的内容是:'+IWMemo1.Text); //用对话框的形式显示 “你好,你提交的内容是:”和在 IWMemo1中输入的内容。 IWRegion1.Visible := false; //隐藏 IWRegion1和它内部的控件。 end;

图 1-3-3 Umain的主窗口

7、程序已经完成,单击 Delphi的运行按钮:程序运行后如图 1-3-4所示。

Page 13: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.3 我的第一个 IntraWeb程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 13页/共 376页

图 1-3-4 IntraWeb调试信息窗口

8、单击 按钮,即可看到浏览器页面,如图 1-3-5所示:

图 1-3-5 浏览器页面 1

输入姓名,点击登录,如图 1-3-6所示:

Page 14: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.3 我的第一个 IntraWeb程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 14页/共 376页

图 1-3-6 浏览器页面 2

点击确定后,点击“这里可以下载 IntraWeb”链接,即可在新窗口中打开 IWURL1的 URL属性中输入的网址。在输入框中输入“我要所有的程序”,点击提交后如图 1-3-7所示:

图 1-3-7 浏览器页面 3

这个程序很简单,但是很能说明问题,用 IntraWeb开发Web应用和用 Delphi开发普通程序没有什么太大的区别。以前用 Delphi开发普通应用能够实现的功能,现在都可以在Web应用里实现。

Page 15: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.4 IntraWeb开发成果预览 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 15页/共 376页

我是一个 Delphi 迷。我很喜欢她的简洁与友好。对于我来说,用她编程简直就是一种艺术,一种享受。我也很喜欢她的语言,可读性极好,看一个好的 Delphi程序就像阅读一篇迷人的小说;此外,我最迷恋她的开发速度,我用过很多的编程工具,但当我碰上 Delphi之后,我就对她一见钟情了。 不知从何时起,我喜欢上了编写 Web 程序。虽然我那时已编写过单页上万行代码的 ASP 程序,

但我还是不喜欢 ASP,我一直在 Delphi的王国里苦苦寻找我的Web程序公主,直到有一天,我发现了她 IntraWeb之后,我就全身心的投入了她的怀抱。

IntraWeb是用来开发 Internet/Intranet应用的工具,已经发展到 9.0.45了。的确,IntraWeb是一个非常优秀的 Web 开发工具。她的开发跟普通的应用程序开发几乎一模一样,我原来的经验和习惯都可以继续,我不用离开 Delphi。 让我们一起来开始我们的 IntraWeb之旅吧。

1.4 IntraWeb开发成果预览 为了进一步了解 IntraWeb功能的强大,进一步加强我们学习 IntraWeb的决心,我们在光盘的 1.4

文件夹中有一些做好的程序,可以打开看看。现给出几个截图如下。 注意:请将 1.4 文件夹拷贝到硬盘,并将所有文件的只读属性去掉后再运行程序。因为刻录光盘

后所有文件都变成只读了。 1、英语资源站点 登录电影网站的用户名和密码都是 admin。程序有哪些功能,请慢慢体会。 程序占用了 90端口.在运行时请确保此端口没被其它程序占用。 让 IE支持COOKIE 操作步骤右击 Internet Explorer--浏览器--选择隐私--设置COOKIE权限为中。 图 1-4-1只是其主界面,详情请打开程序自己看。

Page 16: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.4 IntraWeb开发成果预览 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 16页/共 376页

图 1-4-1英语资源站点

Page 17: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.4 IntraWeb开发成果预览 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 17页/共 376页

2、英语听力学习站点 管理员的卡号与密码都是 admin。程序有哪些功能,请慢慢体会。 一个用 DELPHI开发的高效.安全 B/S类型的研究生英语听说教学系统 要有卡号与用户名请点击申请卡号按钮。30秒即可申请完毕。 系统运行的最低要求: 1、请确保你的系统已经安装了 RealOne播放器 10,如果没有请先下载。 2、请升级浏览器为 IE6.0以上。 3、请先安装好网卡。 程序占用了 8080端口.在运行时请确保此端口没被其它程序占用。 此系统可以发布为单机版本,也可发布为网络版本。 双击 server.exe就可以运行。图 1-4-2和图 1-4-3只是其两个界面的一部分,详情请打开程序自己

看。

图 1-4-2英语听力学习站点主界面 1

图 1-4-3英语听力学习站点主界面 2

怎么样?心动了吧。那就和我一起学习,共同提高吧!

Page 18: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.5 Windows下 IntraWeb开发后的发布 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 18页/共 376页

1.5 Windows下 IntraWeb开发后的发布 Windows下 IntraWeb的发布有两种形式:(要求机器已正确安装网卡驱动) 1、前面所有的例子都是同一种发布形式。即程序编译后是.exe 结尾的,在机器上双击启动这个

exe 服务器就可以了。客户端只要输入相应的网址就可以访问我们的程序。在默认情况下,IntraWeb就是这样的:自带服务器。通过上面的练习,我们应该已经掌握了第一种发布形式。

2、(这里看不懂没有关系,后面会有实例讲解)另一种发布形式是工程编译后是.dll结尾的,这要用windows的 IIS作为服务器,这就要求安装 IIS服务器,通过 IIS发布后就可以被客户端访问了。我们假设网站根目录文件夹为 e, 192.168.8.2为本机的 IP,dll文件名为 index.dll。发布方法介绍: 将整个 e 文件夹发布成为一个虚拟目录,例如:http://192.168.8.2/e/,访问权限设为读取,应用

程序权限设为执行(包括脚本),总之就是和发布 ASP程序一样的:在 e文件夹上点击右键,选择共享和安全,在弹出的新窗口中选择 web共享选项卡,点击共享文件夹,在弹出的窗口中选择访问权限设为读取,应用程序权限设为执行(包括脚本),点击确定回到前一个窗口,再点击确定即可。(以上

虚拟目录中的 192.168.8.2为本机的 IP。)如在WIN2003中,还要进行以下操作:在我的电脑上点击右键,选择管理,在弹出的新窗口中展服务和应用程序,再展开 Internet信息服务(IIS)管理器,点击Web服务扩展,将所有未知 ISAPI扩展,Active Server Pages和在服务器端的包含文件都设为允许。(如没有打 sp1 补丁还要:在网站上点击右键,选择属性,选择服务选项卡,将以 IIS5.0 隔离模式运行 WWW 服务选上,点击确定即可。)再展开默认网站,选择 e,点击右键,选择属性,选择目录安全性选项卡,在身份验证和访问控制框中点击编辑,在弹出的新窗口中选上启用匿名访问,再点

确定,在文档选项卡中选择启用默认文档,右边点击添加,加入 index.asp,index.dll,default.asp(如果没有的话就添加)。在虚拟目录选项卡中点击配置按钮,点击选项,把启用父路径选上,确定返回,执行权限选择脚本和可执行文件,应用程序选中(共用)。再确定退出。 如果要删除、修改 index.dll文件,则要求重新启动 IIS服务:在 internet信息服务点击右键,点击

所有任务,点击重新启动 IIS,执行完毕即可。 如果程序发布时该硬盘分区为 NTFS文件系统的话(如果是 Fat32格式,则不用进行如下操作),

还要设置权限,否则程序可能运行不正常,如不能更新数据库,写入硬盘临时文件等等。进行如下两

步操作即可: (1)第一步:打开工具菜单下的文件夹选项,如图 1-5-1所示:不要选择“使用简单文件共享(推

荐)”这一项。

图 1-5-1 文件夹选项对话框

Page 19: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.6 IntraWeb低版本的源码如何在高版本中运行 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 19页/共 376页

(2)第二步:右击要发布的文件夹,选择属性,如图 1-5-2 所示。在安全选项卡中添加 Internet来宾帐户,给其权限为图中所示。

图 1-5-2 属性对话框

如果没有进行以上设置,如果程序访问修改数据库的话,则可能会出现如图 1-5-3所示出错提示:

图 1-5-3 出错提示对话框 1

如果程序要更改某个文件的话,则可能出现如图 1-5-4所示出错提示:

图 1-5-4 出错提示对话框 2

1.6 IntraWeb低版本的源码如何在高版本中运行 在一般情况下,高版本是向下兼容的。但在实际转换时,要注意以下技巧(我们以 4.1文件夹中程

序为例,从版本从 7.2.41转换到 9.0.45):

Page 20: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.7 建立一个 Apache作为发布器的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 20页/共 376页

1、用安装好的高版本打开低版本的源码工程文件:exe.dpr; 2、选择打开所有的 PAS文件,如图 1-6-1所示。

图 1-6-1打开所有的 PAS文件

3、打开有可能出现以下类似提示框,如图 1-6-2所示,请选择 Igore All按钮。不管出现多少个都

这样选择。打开完毕后请随便移动一下任何一个窗口,再编译运行,如果没有出错,则转换成功,保

存所有文件即可。

图 1-6-2打开时的出错提示

1.7 建立一个 Apache作为发布器的程序 (本节没有经过验证,仅供参考)

1、新建一个 intraweb project ,我选 apache1:

Page 21: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.8 Intraweb与 Ajax技术 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 21页/共 376页

library Project1; uses ApacheApp, IWInitApache, ServerController in 'C:\Program Files\Borland\Delphi7\Projects\Project1\ServerController.pas'

{IWServerController: TIWServerController}, Unit1 in 'Unit1.pas' {IWForm1: TIWFormModuleBase}, UserSessionUnit in 'UserSessionUnit.pas' {IWUserSession: TIWUserSessionBase}; {$E so} {$R *.res} exports apache_module name 'IWDSOProject_module'; begin IWRun; end. 2、编译出 Project1.so , 拷到 /apache/modules 里 3、在 apache/conf/httpd.conf 最后加上 LoadModule IWDSOProject_module modules/Project1.so <Location /test> SetHandler iwdsoproject-handler </Location> 4、重启 apache服务。 5、可以浏览了: http://localhost/test/ 说明一下:LoadModule IWDSOProject_module modules/Project1.so IWDSOProject_module 就是你的 delphi 里的 apache_module name 'IWDSOProject_module';

中的 IWDSOProject_module。 SetHandler project1-handler,这个 iwdsoproject 就是你编译出来的文件(.so)前面的文件名的小

写,再后面加上 “-handler” linux的也这样配置就行了,apache2的也一样。 说明一下在 linux下编译 apache时一定要./configure --enable-module=so ,这样才能用 DSO。

1.8 Intraweb与 Ajax技术 IntraWeb9.x 已经开始支持 Ajax 技术了。它封装了 Ajax,以事件方式来驱动程序。Intraweb9.0

的 Ajax 技术支持断点跟踪调试,简单到跟你调试其他 delphi 程序一样。Intraweb9.0 不愧是封装javascript 的上乘之作。其实,话又说回来了,这一两年流行的 Ajax 技术,其实无非就是 javascript封装而已。而 Intraweb 在六七年已将 javascript 技术做得炉火纯青。更令人汗颜的是,许多所谓的web2.0新技术调试 Ajax时候,仿佛又回到 20多年前的 C编程时代,不停地用 Printf打印调试。Ajax技术也并非是什么高级技术,只是 web编程的一种无奈的选择(只刷新页面的局部,提高交互速度)。

Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。 在一般的 Web 应用程序中,用户填写表单字段并单击 Submit 按钮。然后整个表单发送到服务

器,服务器将它转发给处理表单的脚本(通常是 PHP 或 Java,也可能是 CGI 进程或者类似的东西),脚本执行完成后再发送回全新的页面。该页面可能是带有已经填充某些数据的新表单的 HTML,也可

Page 22: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 1.8 Intraweb与 Ajax技术 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 22页/共 376页

能是确认页面,或者是具有根据原来表单中输入数据选择的某些选项的页面。当然,在服务器上的脚

本或程序处理和返回新表单时用户必须等待。屏幕变成一片空白,等到服务器返回数据后再重新绘制。

这就是交互性差的原因,用户得不到立即反馈,因此感觉不同于桌面应用程序。 Ajax 基本上就是把 JavaScript 技术和 XMLHttpRequest 对象放在 Web 表单和服务器之间。当

用户填写表单时,数据发送给一些 JavaScript 代码而不是直接发送给服务器。相反,JavaScript 代码捕获表单数据并向服务器发送请求。同时用户屏幕上的表单也不会闪烁、消失或延迟。换句话说,

JavaScript 代码在幕后发送请求,用户甚至不知道请求的发出。更好的是,请求是异步发送的,就是说 JavaScript代码(和用户)不用等待服务器的响应。因此用户可以继续输入数据、滚动屏幕和使用应用程序。 然后,服务器将数据返回 JavaScript 代码(仍然在 Web 表单中),后者决定如何处理这些数据。

它可以迅速更新表单数据,让人感觉应用程序是立即完成的,表单没有提交或刷新而用户得到了新数

据。 JavaScript 代码甚至可以对收到的数据执行某种计算,再发送另一个请求,完全不需要用户干预!这就是 XMLHttpRequest 的强大之处。它可以根据需要自行与服务器进行交互,用户甚至可以完全不知道幕后发生的一切。结果就是类似于桌面应用程序的动态、快速响应、高交互性的体验,但

是背后又拥有互联网的全部强大力量。 Ajax 不仅仅是一种时尚,它是一种构建网站的强大方法。“Use Ajax support just by writing

standard Delphi/C++ code”(在 IntraWeb9.x应用 Ajax技术只需要编写标准的 Delphi/C++代码)。 但请切记,在一个页面中过多的应用 Ajax技术也会适得其反。任何事情都要掌握一个度!

Page 23: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.1 IntraWeb的两种开发模式的比较 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 23页/共 376页

第二章 AppMode 下的实用开发指南

2.1 IntraWeb的两种开发模式的比较 intraweb有两种开发方式 Application Mode和 Application Mode。这两种技术实现方式几乎完全

不一样,两种一起使用也有一定的困难。可以这样简单的来理解:Application Mode所产生的就像普通网页一样,是“散”的,可以开多窗口浏览,几乎所有的网站都是这样用的。Application Mode所生产的是一个 B/S 结构的“程序”,跟桌面程序有点类似,不能开多窗口浏览,只可单界面打开,各页面这间可以有严格的逻辑关系。

IntraWeb的 Application Mode似乎不适合用来开发网页程序,既不能使用 Back 按纽,也不能开多窗口浏览,那为何会设计出这种模式呢?难道 IntraWeb 没有考虑到这些简单的问题吗?事实上 IntraWeb 提供两种模式,一是 Application Mode、一是 Page Mode,使用 Page Mode 就没有这些限制了。那么 Application Mode 没用了吗?当然不是! 设想一种情况,假设目前正在开发一个购物网站中的交易机制,使用者将所需要的商品放入购物车中,接着到结帐的网页中,首先系统要求使用者

输入个人的密码,验证完成后进入选择信用卡的画面,然后进入输入送货地址的画面,最后完成交易。

看起来这个流程很合理,但是里面却存在许多的陷阱,假设使用者在进入选择信用卡的画面后,将 URL 复制下来,开启另一个浏览器窗口,输入这个 URL,这下问题大了,现在有两个选择信用卡的画面了,那这算一笔交易还是两笔呢? 亦或是使用者在交易完成的画面按下 Back 按纽,接着重新输入送货地址后按下进行交易的按纽,开始头痛了吗? 当然!一个设计良好的网站应该要有能力处理这种情况,但是不可否认的,为了避免错误情况发生,设计者必须为此付出代价,不停的控制 Cookie 与标志,稍有闪失就会造成伤害。今天是简单的一个购物网站交易机制,影响的可能只是零头的金额,改天可能

是一个 B2B 的下单动作,其金额可不是零头啊,岂能忽视!反观 Application Mode,上面的问题由于Application Mode 的限制使然,所有的考虑都变成是多余的了,轻而易举就可完成这些事,不但用不着设想不同的情况,还拥有了 Transparent StateManager 特色,岂能说 Application Mode 无用?当然,除此之外,Application Mode 属于 Stateful 设计,许多原本必须要程序设计师特别编写程序代码管理的功能,如维持 DataSet 的记录地址、保留不能够转化为 Hidden Field 的数据等,都可以在Application Mode 不写一行程序代码就完成了,这是 Application Mode 最大的优势。 本书只谈 Application Mode。我们的优势在于开发 B/S结构的数据库应用程序。

2.2 建立一个以独立的应用程序的形式发布的程序 这里的完整不是指功能,而是指用 IntraWeb 开发一个应用级的Web程序的过程(这里暂不讨论

如何进行数据库的编程,后面有专题讲解,这里先讲一些过程技巧)。 这个例子我提供了完整的源代码,存放在文件 2.1 中。在开发程序的过程中我会解答很多遇到的

实际问题,我不讲理论,注重实际应用,请大家对应查找相关注释。以下从 0开始我们的旅程: 1、打开 Delphi 7,点击 file->new->other,在弹出对话框(图 2-1)中选择 VCLfor the Web选项

卡,选择 IntraWeb Application Wizard,点击 Ok。注:每一个 IntraWeb应用都是从这里开始的。

Page 24: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.2 建立一个以独立的应用程序的形式发布的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 24页/共 376页

图 2-1 VCLfor the Web选项卡

2、在弹出对话框(图 2-2)中点击 Ok。注:选项的默认值是很实用的,一般不用更改。左边的程序类型我们选择的是独立的程序(StandAlone Application),也就是说程序编译完了之后是自带服务器的 exe 结尾的形式。右边选择的是创建用户对话,并包括数据模块(Create User Session(Include DataModule)),这是什么意思呢?可以这们理解,因为 IntraWeb创建的Web应用是可以多人同时使用的,每个人总要保存一些只属于自己的信息,而且要能在不同的网页上面传递参数,所以选择这个

以后程序就会自动创建一个单元 UserSessionUnit,这个单元就相当于是服务器分配给每个登录这个Web 应用的人一个独立的、保密的存贮空间,它里面的数据(编程者自己定义的数据、“数据模块”即可以包括数据库一些控件,与 Delphi的普通应用时的数据模块是一样的)只有这个人才能使用,而且能够在各个页面之间传递。相当于服务器给每个登录者一个存放自己共用信息的地方,这块地方是服

务器在你登录时自动创建的,你离开后会被自动销毁。这也就是 ASP里常常提到的 Session(会话)。

图 2-2 IntraWeb 程序向导

Page 25: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.2 建立一个以独立的应用程序的形式发布的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 25页/共 376页

3、点击 file->save,将文件分别保存为 Unit1.pas,UserSessionUnit.pas,ServerController.pas,

Project1.dpr。我全部默认名称保存的。如果页面不多,这样做也很好。当然,自己改名是完全可以的。 4、1、打开 Delphi 7,点击 file->new->other,在弹出对话框中选择 VCLfor the Web选项卡,选

择 New Form,点击 Ok。 5、在弹出的对话框(图 2-3)中点击 Ok按钮。

图 2-3 窗口类型选择对话框

6、保存为 Unit2.pas,相同的方法,再新建一个保存为 Unit3.pas。 7、从 IW Standard选项卡上布置相应的控件并修改每个 Caption属性如图 2-4所示。

Page 26: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.2 建立一个以独立的应用程序的形式发布的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 26页/共 376页

图 2-4三个窗口的界面

8、如何在各个页面之间跳转:以下是 UserSessionUnit单元的代码,说明如下。 unit UserSessionUnit; interface uses IWUserSessionBase, SysUtils, Classes,IWAppForm;//加黑部分是新加的 type TIWUserSession = class(TIWUserSessionBase) private { Private declarations } Public

//这就是我们定义参数和函数的地方,每个用户登录后都会独立创建一个 { Public declarations } procedure Move(AFormClass: TIWAppFormClass);//我们定义的一个打开新页面的函数 end; implementation uses IWInit, ServerController;//这一行请一定要加入,每个Web应用的这个单元都加上就是了 {$R *.dfm} procedure TIWUserSession.Move(AFormClass: TIWAppFormClass); begin TIWAppForm(WebApplication.ActiveForm).Free;//关闭当前页面 AFormClass.Create(WebApplication).Show;//显示要打开的页面,AFormClass参数为要打开的

Page 27: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.2 建立一个以独立的应用程序的形式发布的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 27页/共 376页

窗口的 name 前面加个 T就行了。下面有说明 end; end. 9、Unit1.pas 所对应的窗口三个按钮的代码。注:请在每个单元中 uses ServerController,

UserSessionUnit;当然,要调用的单元更要加入了。 {$R *.dfm} procedure TIWForm1.IWButton1Click(Sender: TObject); begin UserSession.Move(TIWForm2);//打开窗口 2,即 Unit2.pas所对应的窗口 //IWForm2是这个窗口的 name,前面加上 T就行了 end; procedure TIWForm1.IWButton2Click(Sender: TObject); begin UserSession.Move(TIWForm3);//打开窗口 3,即 Unit3.pas所对应的窗口 //IWForm3是这个窗口的 name,前面加上 T就行了 end; procedure TIWForm1.IWButton3Click(Sender: TObject); begin self.WebApplication.Terminate('你退出程序了。'); {这句可以主动关闭 session,释放所占用服务器的内存,如果没有这一句,或者用户不按这个按

钮而是直接关闭 IE,那 session就只能等其时间到了自动关闭。ServerController单元里可以设置这个参数:IWServerController.SessionTimeout,填入的数字以分钟为单位。在其它的窗口内也可以主动赋值,例如:“IWServerController.SessionTimeout:=5;”。}

end; 其它窗口类似,请打开源代码自己看。 10、运行查看结果如图 2-5所示:

图 2-5 运行后主界面(页面 1)

点击打开页面 2按钮,如图 2-6所示:

图 2-6页面 2

Page 28: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.2 建立一个以独立的应用程序的形式发布的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 28页/共 376页

打开页面 3也是类似的。点击退出程序后如图 2-7所示:

图 2-7退出程序页面

11、改变程序运行的主窗口(网站主页面),如果我想把页面 2在程序运行时就显示那要怎么办呢?

现在页面 1为主窗口,请看其单元的 initialization部分: initialization TIWForm1.SetAsMainForm;//将当前窗口设为主窗口,TIWForm1为页面 1窗口 name前加 T 如果要改为页面 2,则要先删除以上两句,再在页面 2的单元代码最后一个 end.前加上以下两句: initialization TIWForm2.SetAsMainForm; //将当前窗口设为主窗口,TIWForm2为页面 2窗口 name前加 T 12、对 ServerController单元进行综合设置:(注:192.200.9.81是我调试时我的计算机的 IP,你

使用时请将以下 192.200.9.81改为你自己的 IP,如果是单机没有联网,可以使用 127.0.0.1) AppName:这个属性为Web应用程序指定一个名称(请填写英文字符),请尽量保证此名称的唯

一性,如果两个应用的名称相同则它们不能同时运行在一个系统中。 AllowSubFolders:请选择 true。这将允许程序使用下级文件夹(例如 files文件夹下还可以新建无

数级文件夹)。有利于我们的编程。 BoundIP:(发布成 exe 形式时有效)填写将要发布的服务器的 IP,如果空着,则自动被设为

127.0.0.1,这样就只能本机访问了,其它用户通过 internet 不能访问。如果 IntraWeb 是体验版本的话,这个值会被固定为 127.0.0.1,不管你改为多少,如果服务器没有网络,则用指定的 IP打开会出错。它出现在 IE地址里(加黑部分)http://127.0.0.1:8888/EXEC/0/1qjam290b8qz3l17gsfk51vhfkxp。

ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal,当你用到数据库时,如果默认为 ciNone会出错。否则会出错,这是经验。

ExeCmd:可以任意指定(请用英文字符),默认为“exec”。它出现在 IE地址里 EXEC(加黑部分):http://127.0.0.1:8888/EXEC/0/1qjam290b8qz3l17gsfk51vhfkxp。

Port:指定端口,只要是当前计算机没有使用的端口都可以。如果 IntraWeb是体验版本的话,则修改无效,且每次运行端口都会自动改变。它出现在 IE地址的 IP加冒号的后面,如下所示 8888(加黑部分)http://127.0.0.1:8888/EXEC/0/1qjam290b8qz3l17gsfk51vhfkxp。

SessionTimeout:设置一个等待时间,单位为分钟。因为要为每个用户创建一个 Session,如果永远保留,那服务器的内存开支就太大了。因此设置一个时间,如果在这时间之内用户没有与服务器

进行交互,则认为用户已经离开了,程序就会关闭他的 Session。这个时间如果太少,则可能导致用户不能正常使用,太长了又浪费资源,120 分钟较为合适(还是具体情况具体分析吧,主要看当前页面你认为用户最长应该保留多少时间)。

SessionTrackingMethod:如果不想 IE地址太长的话,请选择 tmHidden,这样 Session的 ID就不会出现在 IE地址里了,它被隐藏在网页里(网址最后的那一串经常变动的字符就没有了)。 其它的属性取默认值就行了。 13、如何访问我们的程序:先运行 Project1.exe,在客户端的 IE地址里写入:http:// BoundIP: Port

即可。例如我们把以上属性改为:BoundIP为 192.200.9.81有(这里假设你的机器的本身设定的 IP为

Page 29: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.2 建立一个以独立的应用程序的形式发布的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 29页/共 376页

192.200.9.81,请根据自己的实际情况更改),Port 为 886(一般情况下是随便设定,只要该端口没有被你的机器的某个程序已使用 ), ExeCmd 为 IloveYou(只能是英文,随便你设定 ),SessionTrackingMethod为 tmHidden,AppName为 ILoveYou(只能是英文,随便你设定)。则客户端的访问地址为:http://192.200.9.81:866,如图 2-8所示:

图 2-8 用服务器的 IP和指定端口访问程序

Page 30: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.3 建立一个以 iis作为发布器发布的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 30页/共 376页

2.3 建立一个以 iis作为发布器发布的程序

在一般情况下,我们都是先建立 StandAlone Application程序,即可以直接运行的 exe模式,如2.1节所述。在 windows下,我们一般在 2000或者 2003下用 IIS发布。这样我们就需要建立 ISAPE Extension程序。即以 dll形式发布的程序。以下我们将 2.1的程序转换成 dll的形式。 这个例子我提供了完整的源代码,存放在文件 2.1 中。在开发程序的过程中我会解答很多遇到的

实际问题,我不讲理论,注重实际应用,请大家对应查找相关注释。以下从 0开始我们的旅程: 1、打开 Delphi 7,点击 file->new->other,在弹出对话框(图 2-9)中选择 VCLfor the Web选项

卡,选择 IntraWeb Application Wizard,点击 Ok。注:每一个 IntraWeb应用都是从这里开始的。

图 2-9 VCLfor the Web选项卡

2、在弹出对话框(图 2-10)中点击 Ok。注:选项的默认值是很实用的,一般不用更改。左边的程序类型我们选择的是 ISAPE Extension,也就是说程序编译完了之后是自带服务器的 dll 结尾的形式。

图 2-10 IntraWeb 程序向导

Page 31: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.3 建立一个以 iis作为发布器发布的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 31页/共 376页

3、点击上图的 ok 按钮后,先不要保存工程文件,请先点击图 2-11 中的 按钮,出现图 2-12

所示对话框。选择其中的一个点击 ok按钮, 在出现的提示框中再点击 yes,如果提示保存请选择不要保存。再执行相同的操作两次,把对话框中的 3个都删除。之后请保存工程文件为 Project1_dll.dpr,

保存目录选择 2.1 文件夹。再点击 按钮,出现图 2-13 所示对话框,选择所有 exe 程序所用到的

pas文件,再点击打开按钮,再保存所有即可。

图 2-11 delphi工具条

图 2-12 remove from project对话框

图 2-13 add to project对话框

编译,Delphi会提示,如图 2-14:

Page 32: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.3 建立一个以 iis作为发布器发布的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 32页/共 376页

图 2-14 编译.dll时的出错提示 恭喜,Delphi 已经编译生成了一个 Project1_dll.dll 文件,至此我们的一个文件夹中就同时有两个

发布方式的工程了,平时调试程序时用 exe的 Project1.dpr工程,要发成 dll时用 Project1_dll.dpr工程,只需要象上面那样加入在 exe中新建立的 pas文件即可(即执行 add to project对话框)。

Page 33: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.3 建立一个以 iis作为发布器发布的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 33页/共 376页

2.3 IntraWeb程序在 IIS下的发布 如何发布.dll 版本呢?此处只讲 XP 下的操作,2000 下是类似的。注:发布到不同的系统,以下

参数是要特别注意的,ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal。否则会出错,这是经验。 只能用 IIS发布。步骤如下:在文件夹 2.1上点击右键,选择共享和安全,选择Web共享选项卡,

进行如图 2-15相同的设置。然后一路按确定即可。

图 2-15 文件共享和安全对话框

在我的电脑上点击右键,选择管理,出现图 2-16,在我们的新网站 iloveyou上点击右键,选择属性,在目录安全性中点击编辑,进行如图相同的设置。

图 2-16 计算机管理对话框

Page 34: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.3 建立一个以 iis作为发布器发布的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 34页/共 376页

这就完成的网站的设置。在 IE 中输入 http://192.200.9.81/iloveyou/index.dll,按下回车,就会出

现图 2-17所示的运行主页面。IP地址 192.200.9.81可以用指向它的域名来代替。Iloveyou是网站的别名,相当于文件夹 2.1。

图 2-17 .dll版本的运行主页面

发布运行过之后,要删除或修改 index.dll要先重新启动 IIS服务。图 2-18演示了如何重新启动 IIS

服务器。(此时不要在 IE中再次运行 http://192.200.9.81/iloveyou/index.dll,否则又要重新启动 IIS)

图 2-18 重新启动 IIS

要达到修改 index.dll文件的目的,也可以如图 2-19 结束 dllhost.exe进程。这只是在编程过程中

的一些调试小技巧。要注意的是 dllhost.exe的用户名要是以 IWAM_开头的。

图 2-19 结束 dllhost.exe进程

Page 35: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.4 IntraWeb程序.exe与.dll两种发布形式的相互转换 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 35页/共 376页

2.4 IntraWeb程序.exe与.dll两种发布形式的相互转换

我们可以将程序转换成.dll 形式发布(它们可以互相转换)。仍以 2.1 文件夹下的程序为例,将Project1.dpr拷贝一份改名为Project1_dll.dpr,打开它进行修改。有如下几步要做:将program Project1变成 library Project1_dll,将 Forms变成 ISAPIApp,将 IWMain变成 IWInitISAPI,在 begin之前加入以下 4句:

exports GetExtensionVersion, HttpExtensionProc, TerminateExtension; 将 begin与 end之间的

Application.Initialize; Application.CreateForm(TformIWMain, formIWMain); Application.Run; 3行内容换成 IWRun; 如下是两者的区别: 这是.exe版本: program Project1; uses Forms, IWMain, ServerController in 'ServerController.pas' {IWServerController: TIWServerController}, Unit1 in 'Unit1.pas' {IWForm1: TIWFormModuleBase}, UserSessionUnit in 'UserSessionUnit.pas' {IWUserSession: TIWUserSessionBase}, Unit2 in 'Unit2.pas' {IWForm2: TIWAppForm}, Unit3 in 'Unit3.pas' {IWForm3: TIWAppForm}; {$R *.res} begin Application.Initialize; Application.CreateForm(TformIWMain, formIWMain); Application.Run; end. 这是.dll版本: library Project1_dll; uses ISAPIApp, IWInitISAPI, UserSessionUnit in 'UserSessionUnit.pas' {IWUserSession: TIWUserSessionBase},

ServerController in 'ServerController.pas' {IWServerController: TIWServerControllerBase}, Unit1 in 'Unit1.pas' {IWForm1: TIWAppForm}, Unit2 in 'Unit2.pas' {IWForm2: TIWAppForm},

Page 36: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.4 IntraWeb程序.exe与.dll两种发布形式的相互转换 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 36页/共 376页

Unit3 in 'Unit3.pas' {IWForm3: TIWAppForm}; {$R *.RES} exports GetExtensionVersion, HttpExtensionProc, TerminateExtension; begin IWRun; end. 改完之后进行编译,Delphi会提示,如图 2-20:

图 2-20 编译.dll时的出错提示 不要理会,Delphi 已经编译生成了一个 Project1_dll.dll 文件,将其改为我们所喜欢的名字,例如

index.dll。目的是为了发布时客户端的访问地址好记。 以上方法也许随着 intraweb的升级,可能变得不可用,另一种更加长久和简洁的转换方法如下: 以下示例从.exe 发布形式(Application Type 为 StandAlone Application)转换到.dll 发布形式

(Application Type 为 ISAPE Extension)。在现有的工程里新建立一个工程,选择界面如下:

点击 remove from project按钮(减号按钮)从工程中去除 ServerController,UserSessionUnit和 unit1,在原工程的相同目录下保存新工程(另给一个好的名字),再点击 add file to project按钮(加号按钮),将原工程的所有单元文件全部加入当前工程。这样,原工程就转换成的现工程。从而实现了这几种发

布形式的转换。

Page 37: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.5 用 html模板美化我们的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 37页/共 376页

2.5 用 html模板美化我们的程序

1)在 IWForm1窗口上加入 IWTemplateProcessorHTML1控件(从 IW Control选项卡中选取,第一个就是)。

2)再将 IWForm1窗口的 LayoutMgr属性设为 IWTemplateProcessorHTML1。 3)在 2.1.1 文件夹中建立 files 和 templates 文件夹(这两个文件名是固定的,不要改变),files

是一个很特别的文件夹,IntraWeb程序将所有可访问的资源(图片,文件等)都放在 files文件夹中。Templates 文件夹是默认的 html 模板的存放地。我们用别的编辑网页的软件建立一个模板放在templates文件夹中。它的结尾要是.html,且文件名要与其对应的窗口名一样。我们这里只对 IWForm1窗口进行美化。为其编辑的模板文件为 IWForm1.html。那窗口上的控件是如何进入到模板中的呢?只要将窗口中的控件的name放入{%%}中间即可。例如,控件 IWLabel1的模板标记为{%IWLabel1%},将{%IWLabel1%}直接写在网页模板里,在页面显示时,IntraWeb会将{%IWLabel1%}用控件 IWLabel1的内容替换掉。图 2-21将 IWForm1窗口中的 4个控件标记到模板中了。注:模板中所有引用的图片都要放在 files文件夹中,且只能用相对路径。

图 2-21 编辑中的模板

以下是运行时的页面 1,如图 2-22所示:

图 2-22 应用模板后实际页面 1

其它的窗口也是采用相同的方法来进行美化。通过这种方式,做Web应用时,美工和编程就可以一并进行了。而且是分开的,不同的美工设计可以得到不同的网站样式。而程序却不用修改。用 IIS服务器发布也是一样的效果。

Page 38: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.5 用 html模板美化我们的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 38页/共 376页

2.6 IntraWeb的 exe程序中开发自己的服务器界面

怎样开发自己的服务器界面? 以下请参考文件夹 2.2内的源代码。 接上一个例子: 1、新建立一个普通 Delphi窗口,将 IW Control选项卡上的 IWStandAloneServer1控件放入其中。

这个窗口中的编程与普通 Delphi内的编程是一样的。窗口中的控件布置如图 2-23所示:

图 2-23 开发中的服务器主界面 2、三个按钮以及 IWStandAloneServer1控件的相应事件代码如下: {$R *.dfm} procedure TForm4.Button1Click(Sender: TObject);//打开 IE begin IWStandAloneServer1.Run;//在 IE中运行我们的Web应用 end; procedure TForm4.Button2Click(Sender: TObject); begin close;//关闭本窗口,同时 IWStandAloneServer1被销毁,Web服务器被停止 end; procedure TForm4.IWStandAloneServer1NewSession(Sender: TObject);//当一个用户登录时 begin Label2.Caption := '当前在线' + inttostr(IWStandAloneServer1.ActiveSessions) + '人'; {当前存在多少个 Session就应该有多少人。但是不一定准确,如果登录的客户没有主动点击退出

程序按钮而是直接关闭 IE,这就会告造成误差。因为 Session 要等待一个相应的时间(IWServerController.SessionTimeout所设定的值)后才会自动关闭,这样 Session数才会减去 1。}

end; procedure TForm4.Button3Click(Sender: TObject); begin IWStandAloneServer1.ClearSessions;//将所有的 Session关闭 //已经登录的人将会被迫退出,只能重新登录 Label2.Caption := '当前在线' + inttostr(IWStandAloneServer1.ActiveSessions) + '人'; //刷新当前在线人数的显示 end; procedure TForm4.IWStandAloneServer1CloseSession(Sender: TObject);//当一个用户退出时 begin

Page 39: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.5 用 html模板美化我们的程序 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 39页/共 376页

Label2.Caption := '当前在线' + inttostr(IWStandAloneServer1.ActiveSessions) + '人'; //刷新当前在线人数的显示 end; 3、在运行编译之前,请先注释掉“Application.CreateForm(TformIWMain, formIWMain);”如图 2-24

所示:(要用默认的则请注释掉它下面一句,即我们刚才新建的窗口)

图 2-24 注释掉调用默认窗口的语句 4、运行程序如图 2-25所示:

图 2-25 自己开发的服务器运行时界面

这是一个普通的 windows窗口,在上面你可以添加你想添加的任何功能,如版权信息,软件注册,演示版本时间或次数限制,最小化到托盘,是不随开机启动等等所有 Delphi普通开发的所有功能(可以使用丰富的第三方控件)。只为过这只能在服务器一台机器上使用,客户端是看不到的。 文件夹 1.4中的英语听力学习站点的服务器运行时界面就是自己编写的,如图 2-26所示。

图 2-26 自己开发的服务器运行时界面

Page 40: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.6 IntraWeb程序开发经验小结 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 40页/共 376页

2.6 IntraWeb程序开发经验小结 1、开发 IntraWeb程序时请先用默认方式创建,exe形式的便于调试,如要用 IIS发布,可以方便

的转换成 dll形式。 2、新建工程,窗口等都是:点击 file->new->other,在弹出对话框(图 2-21)中选择 VCLfor the

Web选项卡,再选择自己相应的模块点击确定。IntraWeb在 Delphi中相对比较独立,从编程一开始,就用自己的模块来建立,在编程的过程中请尽量使用其自己的控件。(IntraWeb 数据库的编程时与Delphi的数据库编程类似)

图 2-21 VCLfor the Web选项卡 3、建立一个新的工程时,请选择默认选项,IntraWeb 为我们已经考虑得很周到了。默认选项里

会包括 UserSessionUnit,这将大大方便我们编程时的各个窗口之间的数据交换。它像 windows的剪贴板,要传递数据时,第一个窗口先将数据存贮在 UserSessionUnit的某一个变量中(相当于 windows的复制),所有的窗口就可以随时使用保存在 UserSessionUnit的变量值了(相当于 windows的粘贴)。这是最简便的一种方式。

4、对 ServerController 单元进行综合设置:(注:192.200.9.81是我调试时我的计算机的 IP,你使用时请将以下 192.200.9.81改为你自己的 IP,如果是单机没有联网,可以使用 127.0.0.1)

AppName:这个属性为Web应用程序指定一个名称(请填写英文字符),请尽量保证此名称的唯一性,如果两个应用的名称相同则它们不能同时运行在一个系统中。

AllowSubFolders:请选择 true。这将允许程序使用下级文件夹(例如 files文件夹下还可以新建无数级文件夹)。有利于我们的编程。

BoundIP:(发布成 exe 形式时有效)填写将要发布的服务器的 IP,如果空着,则自动被设为127.0.0.1,这样就只能本机访问了,其它用户通过 internet 不能访问。如果 IntraWeb 是体验版本的话,这个值会被固定为 127.0.0.1,不管你改为多少,如果服务器没有网络,则用指定的 IP打开会出错。它出现在 IE地址里(加黑部分)http://127.0.0.1:8888/EXEC/0/1qjam290b8qz3l17gsfk51vhfkxp。

ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal,当你用到数据库时,如果默认为 ciNone会出错。否则会出错,这是经验。

ExeCmd:可以任意指定(请用英文字符),默认为“exec”。它出现在 IE地址里 EXEC(加黑部分):http://127.0.0.1:8888/EXEC/0/1qjam290b8qz3l17gsfk51vhfkxp。

Port:指定端口,只要是当前计算机没有使用的端口都可以。如果 IntraWeb是体验版本的话,则

Page 41: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 2.6 IntraWeb程序开发经验小结 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 41页/共 376页

修改无效,且每次运行端口都会自动改变。它出现在 IE地址的 IP加冒号的后面,如下所示 8888(加黑部分)http://127.0.0.1:8888/EXEC/0/1qjam290b8qz3l17gsfk51vhfkxp。

SessionTimeout:设置一个等待时间,单位为分钟。因为要为每个用户创建一个 Session,如果永远保留,那服务器的内存开支就太大了。因此设置一个时间,如果在这时间之内用户没有与服务器

进行交互,则认为用户已经离开了,程序就会关闭他的 Session。这个时间如果太少,则可能导致用户不能正常使用,太长了又浪费资源,120 分钟较为合适(还是具体情况具体分析吧,主要看当前页面你认为用户最长应该保留多少时间)。

SessionTrackingMethod:如果不想 IE地址太长的话,请选择 tmHidden,这样 Session的 ID就不会出现在 IE地址里了,它被隐藏在网页里(网址最后的那一串经常变动的字符就没有了)。 其它的属性取默认值就行了。 5、网站根目录请先建立如下文件夹:files(存放所有要用的文件), templates(存放页面美化模

板)。 6、模板文件名的格式为:窗口 name.html,文件内不支持 ASP 代码,支持 JavaScript 代码。

IWRegion控件内的所有控件与 IWRegion是一个整体,不能再在模板中有 IWRegion内的控件标记。也就是说,{% IWRegion%}标记就包括了 IWRegion 和其内的所有控件了,其内的所有控件与IWRegion控件的相对位置不变。

7、ServerController的 OnCreate事件代码如下(指定程序运行时的 cache目录): procedure TIWServerController.IWServerControllerBaseCreate( Sender: TObject); begin self.CacheDir := self.GetAppPath + 'cache';//指定 IntraWeb的缓存目录

//GetAppPath得到网站根目录,这样有好处 end; 8、请在每一个窗口单元的 implementation 后面加上以下语句:uses ServerController,

UserSessionUnit;目的是确保可以方便的引用这两个单元的变量和函数。调用他们的格式如下:IWServerController.AppPath和 UserSession.ADOQuerytemp等,这只是举的两个例子。这两个单元请不要改名字,保存也请用默认名称,这有利于程序的移植。在 UserSessionUnit 单元里请在implementation后面加上以下语句:uses IWInit, ServerController;

9、在所有窗口的单元文件的最后一个 end前最好注册一下该类,否则显示窗口时会显示找不到某某类。代码类似如下。函数中的参数是窗口名前加个 T字符。切记一定要手动加入,不会自动生成的。如果窗口名为 IWForm2,则其代码如下:

initialization RegisterClass(TIWForm2);

10、如果有数据连接控件,如 TADOConnection等,请一定要放在 UserSession窗口里,否则用IIS形式发布时会有问题(例如放在 IWServerController窗口中,在 EXE形式发布时没有问题,但在IIS形式发布时会有问题)

Page 42: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.1 用虚拟键盘输入密码 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 42页/共 376页

第三章 Intraweb编程专题讲座

3.1 用虚拟键盘输入密码 当网页有密码要输入时,如果直接用键盘输入,有可能会被黑客程序截取密码并发送出去。但如

果能够在用户单击密码输入框后弹出一个虚拟键盘,再用鼠标点击虚拟键盘输入密码就会安全得多。

本节就是要实现这样的一个功能。而且是用 Intraweb来实现,不用写什么代码,速度很快,不信请跟我来。

1、打开 Delphi 7,点击 file->new->other,在弹出对话框中选择 VCLfor the Web选项卡,选择Intraweb Application Wizard,点击 Ok。

图 3-1 VCLfor the Web选项卡

2、在弹出对话框中点击 Ok。 3、点击 file->save,将文件分别保存为 Umain.pas,UserSessionUnit.pas,ServerController.pas,

Project_mykeyboard.dpr。注意,请保存同一目录下,并在该目录下新建一个文件夹 files,这是 Intraweb程序要使用的一个很特别的文件夹,是 Intraweb 默认的资源(各种文件,图片等)存放地。将文件mykeyboard.js拷贝到 files目录下。(文件目录:3.1\files\mykeyboard.js)

4、在 IWForm1上放上一个 IWEdit1控件和 IWButton1控件,他们在 IW Standard选项卡上。IWEdit1 控件是一个文体输入控件,我们用来输入密码。修改他的如下属性:ReadOnly 为 True;PasswordPrompt 为 True;双击 ScriptEvents 右边的…号按钮,在弹出的对话框中选择左边的onChange,在右边请写入“Calc.password.value=this.value;”(双引号内的所有符号,全部是在英语输入状态输入,且大小写要一样),再选择左边的 onClick,在右边请写入“

password1=null; initCalc(); password1=this; showkeyboard(); this.readOnly=1; Calc.password.value=this.value;”

Page 43: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.1 用虚拟键盘输入密码 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 43页/共 376页

图 3-2 OnChange事件代码

图 3-3 onClick事件代码

5、在 IWForm1窗口的空处点击一下,修改 IWForm1的属性如下:ExtraHeade中点击右边的…

号按钮,在对话框中输入“<SCRIPT language=JavaScript src="files/mykeyboard.js"></SCRIPT>”,此句的目的是将 files目录下的mykeyboard.js文件加入到网页的头部。不明白没有关系,照着做就行了。

图 3-4 在 ExtraHeade中加入 JS文件

6、将 IWButton1的 Capton属性改为“查看密码”,在 IWForm1窗口中双击 IWButton1按钮,为其单击事件写入如下代码:“self.WebApplication.ShowMessage('您输入的密码是:'+IWEdit1.Text);”,此处的目的是网页打开后,单击“查看密码”按钮,将会弹出一个信息框,告诉你密码框中的实际输入密码是什么,以此检验我们的虚拟键盘输入是否正确。

7、转到 IWSeverController 窗口,修改如下属性: SessionTrackmethd 改为 tmHidden 或tmCookie;(如果是 tmURL,程序运行会出错,在编写其它 Intraweb应用程序时也最好不要用 tmURL参数。)

Page 44: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.1 用虚拟键盘输入密码 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 44页/共 376页

图 3-5 修改 SessionTrackmethd属性

8、保存。点击菜单 run->run(或 F9),编译完后有一个窗口出现,按 F9 或点击最左边的按钮即

可运行我们的程序。单击输入框会有一个虚拟键盘弹出来,按 Cancel 可以进入用键盘输入状态。点击查看密码可以看到你输入的密码。程序运行界面如下。 (编译完后在程序保存的目录下有Project_mykeyboard.exe文件,直接运行就可以了)

图 3-6 程序运行界面 1

图 3-7程序运行界面 2

9、要实现这种功能,不用改写代码,只要在程序中修改密码输入框和他的窗口这两个控件的相应属性即可。别忘了在 files目录中拷入mykeyboard.js文件。很简单吧^_^,我可是经过了 N次的调试才搞定呀,很累,不过很有成就感。望高手不要见笑。程序发布时只要把 files 文件夹和Project_mykeyboard.exe文件同时拷贝走就可以了(放在同一个文件夹中)。

Page 45: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 45页/共 376页

3.2 IntraWeb数据库报表解决方案之一

———用 FastReport直接实现服务器端报表

IntraWeb数据库报表一直困绕着我。在潜意识中我一直在苦苦的思索着。如何在客户端不安装任何的控件而实现网络报表呢?用 PDF格式显示?这是一个好主义,因为 PDF软件安装是很普遍的,但找遍所有资料得到的结论是:在所有的将报表转换到 PDF格式的控件中,对中文的支持实在是太差了,一有中文就是乱码!Delphi自带的 Rave控件也有很多的毛病:数据库字段名不支持中文,转换成 PDF和 RTF等格式时有乱码等等。 网上的有一个报表控件号称可以解决此问题,但没有试用期,感觉当他网络发布时可能有问题,

而且收费很高,售后服务可能没有,作者联系电话都不公布,很是郁闷。还是自己想想办法吧。 有一个很好用的报表控件:FastReport v4.6.8.rar,相信大家都听说过,搞到他的安装版本应该是

不难的。下面我结合这个控件来谈谈我的报表解决方案。 先说说我的思路: 1、利用 FastReport报表控件制作报表模板文件,将报表模板文件存放在程序根目录下的 files目

录中。 2、利用 FastReport 的相关组件将我们的数据在服务器上报表成一个临时文件,将这所有的临时

文件存放在 files目录中的一个唯一的文件夹中(每一个用户 UserSession一开始使用时就生成一个绝对不会与别人相同的文件夹,UserSession结束时就删除这个刚刚建立的文件夹),这样就保证了不同用户调用报表时只能自己调用自己生成的数据报表。

3、为将在服务器上生成的临时文件报表发送到客户端,我们将为这个临时文件给定一个 URL 地址,这样就实现了在客户端查看,打印报表的功能。

4、可以传送的报表格式可以为 PDF,RTF(WORD格式),HTML(网页),XLS(EXCEL文件)等。经检测,FastReport可以很好的完成后三种格式的生成,PDF不支持中文(个人认为,也许是我不会用,见谅)。 下面我们就动手试一下。 像 2.1所介绍的那样,新建一个 IntraWeb工程 RaveDemo.dpr。请安装好 FastReport控件后打

开源代码自己看。(在文件夹 3.2中) FastReport的使用方法与 Delphi中的普通应用时的是一样的。这里就不作过多讲述。 图 3-8是所有的控件布局情况。相信大家一看源代码就清楚了。我对关键代码作一下说明。

图 3-8控件布局

各控件的属性请注意查看,如图 3-9。记住,Showdialog和 ShowProgress一定要是 false。

Page 46: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 46页/共 376页

frxHTMLExport1: frxXMLExport1: frxRTFExport1:

图 3-9控件的属性

图 3-10为主程序运行界面:

图 3-10主程序运行界面

请看 Unit1单元: 1、窗口生成时连接数据库,并打开数据集 数据库为 files目录下的 data.mdb文件。WebApplication.ApplicationPath用来得到主程序的根目

录。 procedure TIWForm1.IWAppFormCreate(Sender: TObject); begin RepQuery.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +

Page 47: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 47页/共 376页

WebApplication.ApplicationPath + 'files\data.mdb;Persist Security Info=False'; RepQuery.Open; end;

2、print-htm按钮的实现代码。 procedure TIWForm1.IWButton1Click(Sender: TObject); //生成 HTML报表 var LFile: string; LOptions: string; LWindowName: string; LURL: string; begin //导入报表模板文件 3.fr3 frxReport1.LoadFromFile(WebApplication.ApplicationPath + 'files\3.fr3'); //定义临时保存在服务器上的报表文件名 LFile := 'temp.htm'; //WebApplication.AppID 是服务器为每一个用户生成的唯一的一个字符串,这样就保证了用户只能调用自己生成的报表 frxHTMLExport1.FileName := WebApplication.ApplicationPath + 'files\' + WebApplication.AppID + '\' + LFile; //生成 files目录下的唯一文件夹 ForceDirectories(ExtractFileDir(frxHTMLExport1.FileName)); //准备报表数据 frxReport1.PrepareReport; //将报表数据以 HTML格式导出到文件 frxHTMLExport1.FileName中 frxReport1.Export(frxHTMLExport1); //以下为将报表发送到客户端 //窗口名称 LWindowName := 'HTML报表示例'; //是否有滚动条,IE窗口的长和宽 ,可以为空字符串,如果为空则窗口这完整的 IE窗口。 LOptions := 'scrollbars=yes,width=800,height=600'; //给出在服务器上生成的报表的 URL地址 LURL := WebApplication.AppURLBase + '/FilesNC/' + WebApplication.AppID + '/' + LFile; //打开一个新 IE窗口,将报表展现出来 AddToInitProc('NewWindow("' + LURL + '", "' + LWindowName + '","' + LOptions + '");'); end; 图 3-11为按下 print-htm按钮报表结果:

Page 48: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 48页/共 376页

图 3-11按下 print-htm按钮报表结果

3、print-xls按钮的实现代码

procedure TIWForm1.IWButton2Click(Sender: TObject);//生成 xls报表 var LFile: string; LURL: string; begin //导入报表模板文件 3.fr3 frxReport1.LoadFromFile(WebApplication.ApplicationPath + 'files\3.fr3'); //定义临时保存在服务器上的报表文件名 LFile := 'temp.xls'; //WebApplication.AppID 是服务器为每一个用户生成的唯一的一个字符串,这样就保证了用户只能调用自己生成的报表 frxXMLExport1.FileName := WebApplication.ApplicationPath + 'files\' + WebApplication.AppID + '\' + LFile; //生成 files目录下的唯一文件夹 ForceDirectories(ExtractFileDir(frxXMLExport1.FileName)); //准备报表数据 frxReport1.PrepareReport; //将报表数据以 HTML格式导出到文件 frxXMLExport1.FileName中 frxReport1.Export(frxXMLExport1);

//以下为将报表发送到客户端 //给出在服务器上生成的报表的 URL地址 LURL := WebApplication.AppURLBase + '/FilesNC/' + WebApplication.AppID + '/' + LFile; //在网页上显示一个在新窗口中打开报表的链接 IWRectangle1.Text:='<a href="'+LURL+'" target="_blank">打开 xls报表 </a>';

Page 49: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 49页/共 376页

end; 图 3-12为按下 print-xls按钮,点击“打开 xls报表”链接后的报表结果:

图 3-12按下 print-xls按钮报表结果

说明:本想按下 print-xls 按钮直接在新窗口中打开报表,但没有合适的代码实现,如是分成了两

步:先产生适时报表,再通过自动生成的链接打开报表。这样也有好处:当不小心关闭报表窗口后,

要再查看不必重新再生成报表,只需点击链接即可。产生链接的控件是 IWRectangle1,请注意这里的使用方法。

4、print-rtf按钮的实现代码 procedure TIWForm1.IWButton3Click(Sender: TObject);//生成 rtf报表 var LFile: string; LURL: string; begin //导入报表模板文件 3.fr3 frxReport1.LoadFromFile(WebApplication.ApplicationPath + 'files/3.fr3'); //定义临时保存在服务器上的报表文件名 LFile := 'temp.rtf'; //WebApplication.AppID 是服务器为每一个用户生成的唯一的一个字符串,这样就保证了用户只能调用自己生成的报表 frxRTFExport1.FileName := WebApplication.ApplicationPath + 'files\' + WebApplication.AppID + '\' + LFile; //生成 files目录下的唯一文件夹 ForceDirectories(ExtractFileDir(frxRTFExport1.FileName)); //准备报表数据 frxReport1.PrepareReport;

Page 50: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 50页/共 376页

//将报表数据以 rtf格式导出到文件 frxRTFExport1.FileName中 frxReport1.Export(frxRTFExport1); //给出在服务器上生成的报表的 URL地址 LURL := WebApplication.AppURLBase + '/FilesNC/' + WebApplication.AppID + '/' + LFile; //在网页上显示一个在新窗口中打开报表的链接 IWRectangle1.Text:='<a href="'+LURL+'" target="_blank">打开 rtf报表 </a>'; end; 图 3-13为按下 print-rtf按钮,点击“打开 rtf报表”链接后的报表结果:

图 3-13按下 print-rtf按钮报表结果

说明:本想按下 print-rtf按钮直接在新窗口中打开报表,但没有合适的代码实现,如是分成了两步:

先产生适时报表,再通过自动生成的链接打开报表。这样也有好处:当不小心关闭报表窗口后,要再

查看不必重新再生成报表,只需点击链接即可。产生链接的控件是 IWRectangle1,请注意这里的使用方法。 请看 ServerController单元: 1、动态自己绑定本机 IP。以下是取得本机的 IP地址。

function LocalIP: string; //取得本机的 IP,需要 uses中添加Winsock单元,此函数 LocalIP要放在调用它的函数的前面 type TaPInAddr = array[0..10] of PInAddr; PaPInAddr = ^TaPInAddr; var phe: PHostEnt; pptr: PaPInAddr; Buffer: array[0..63] of char; I: Integer; GInitData: TWSADATA;

Page 51: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 51页/共 376页

begin WSAStartup($101, GInitData); Result := ''; GetHostName(Buffer, SizeOf(Buffer)); phe := GetHostByName(Buffer); if phe = nil then Exit; pptr := PaPInAddr(phe^.h_addr_list); I := 0; while pptr^[I] <> nil do begin Result := StrPas(inet_ntoa(pptr^[I]^)); Inc(I); end; WSACleanup; end; 以下为 IWServerController生成时为自己的一些属性赋值(其详细属性设置上一章已有介绍):

procedure TIWServerController.IWServerControllerBaseCreate( Sender: TObject); begin //给 IWServerController 的一些属性赋值 self.CacheDir := self.GetAppPath + 'files\cache';//如不这样,它会在系统盘上生成 self.BoundIP:=LocalIP; //这样可以保证自动绑定本机 IP,如果没有网络,则为 127.0.0.1 self.Port:=8888;//数字基本上是任意的,只要没有被其它的程序占用的端口都可以用 end;

2、当 Session结束时执行如下代码,目的是删除在报表时生成的用 Session的 ID作为名称的文件夹,因报表需要而生成的临时文件被全部删除。 procedure TIWServerController.IWServerControllerBaseCloseSession( ASession: TIWApplication); var LFilesDir: string; sr: TSearchRec; begin LFilesDir := GServerController.FilesDir + ASession.AppID;//找到我们要删除的目录 if FindFirst(LFilesDir + PATHDELIM + '*.*', faAnyFile, sr) = 0 then//删除目录中的文件 begin repeat DeleteFile(LFilesDir + PATHDELIM + sr.Name); until FindNext(sr) <> 0; FindClose(sr); end; RemoveDir(LFilesDir);//删除文件夹,这样就保证 files文件下的垃圾文件得到及时的清除 end; 补充说明:RaveDemoDLL.dpr 为生成 dll 版本的工程文件。要用 IIS发布生才能查看。所有代码

Page 52: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 52页/共 376页

在WinXPSP2+Dlphi7.0 +IntraWeb9.0.45+ FastReport v3.20下调试通过。IWServerController的属性 ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal。

附录:FastReport 4 组件使用简介 安装指南:(网上搜集,仅供学习之用,严禁用于商业用途,购买正版请访问 http://fast-report.com/en/) 1、 Delphi7 请先安装本书所用控件 \FastReport4.6.8\fr4_2_d7e.exe(安装密码为

0043443E1D4100050C1226160F351D190D310E2028171E350A22)

2、Delphi2007 请先安装本书所用控件\FastReport4.6.8\fr4_2_d2007e.exe(安装密码为

0043443E1D4100050C1226160F351D190D310E2028171E350A22)

3 、 将 FastReport4.6.8 文 件 夹 下 的 文 件 拷 贝 到 安 装 目 录 下 :C:\Program

Files\FastReports\FastReport 4\进行覆盖

4、编辑 delphi7的相关文件并进行汉化:先关闭所有版本的 delphi程序,再运行文件 C:\Program

Files\FastReports\FastReport 4\ recompile.exe,界面如图:

点击 compile按钮。运行完毕后选择 change language to再点击 compile按钮进行汉化即可。

5、编辑 delphi2007 的相关文件并进行汉化:先关闭所有版本的 delphi 程序,再运行文件

C:\Program Files\FastReports\FastReport 4\ recompile.exe,界面如图:

Page 53: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 53页/共 376页

点击 compile按钮。运行完毕后选择 change language to再点击 compile按钮进行汉化即可。

组件介绍: 1、TfrxReport 这是 FastReport 3最核心的报表组件,一个 TfrxReport 组件组成一份报表。在设计时期,双击此

组件可打开报表设计器(Report Designer),此组件的属性及方法很重要。 TfrxReport 提供的方法: procedure Clear;//清除上一次产生的报表内容 function LoadFromFile(const FileName: String; ExceptionIfNotFound:Boolean = False): Boolean; ;//从

FileName文件载入报表模板。假如第二个参数等于 “True”且文件不存在,将产生异常,假如文件载入成功,返回值为”True ” 。

procedure LoadFromStream(Stream: TStream); //从数据流(stream)载入报表模板。 procedure SaveToFile(const FileName: String); //保存报表模板至指定的文件。 procedure SaveToStream(Stream: TStream); //保存报表模板至数据流(stream)。 procedure DesignReport; //进入报表模板设计环境。报表模板设计环境将嵌入在你的工程文件(要执

行此功能,只要在 uses 子句加入 frxDesign 单元或在工程文件中加入“TfrxDesigner” 组件)。 procedure ShowReport(ClearLastReport: Boolean = True); //开始按模板生成报表并将输出结果显示

在预览窗口中。例如“ClearLastReport” 参数等于“False”,报表内容将会加入至前一个报表内容的后面,否则前一个建立的报表内容会被清除。

function PrepareReport(ClearLastReport: Boolean = True): Boolean; //开按模板生成报表,但不显示预览窗口。参数指定方式与“ShowReport” 方法(method)相同。假如报表创建成功,此函数返回“True” 。

procedure ShowPreparedReport; //显示先前使用“PrepareReport” 所建立的报表内容。

Page 54: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 54页/共 376页

procedure Print; //打印报表。 procedure Export(Filter: TfrxCustomExportFilter); //使用指定的导出过滤器(export filter)导出报表內

容。因为下列的方法只提供一种服务,在大部分的情況之下,你并不须要使用它们。在增強 FastReport 的报表功能方面,他们可能是很有用的。例如,当撰写自定义的报表组件时。

TfrxReport 组件拥有下列属性: property EngineOptions: TfrxEngineOptions; //与 FastReport 引擎相关的属性集合。 property IniFile: String; //储存 fastReport 环境变量设定的文档或注册码的名称。 property Preview: TfrxCustomPreview; //连接到“TfrxPreview” 组件,完成的报表将显示在此组件上。

假如此属性空白,报表将显示在标准的预览窗口中。 property PreviewOptions: TfrxPreviewOptions; //与报表预览相关的属性。 property PrintOptions: TfrxPrintOptions; //与报表打印相关的属性。 property ReportOptions: TfrxReportOptions; //定义报表相关的属性。 property ScriptText: TStrings; //脚本语言的内容。 property AllObjects: TList readonly; //报表内所有的组件列表(包括页定义组件)。 property DataSets: TfrxReportDataSets readonly; //报表可用的数据集列表。 property Engine: TfrxCustomEngine readonly; //连结报表引擎。对于要使用程序码处理报表是非常有

用的,它可以自定义报表处理引擎。 property Errors: TStrings readonly; //错误清单,发生在一个或其它的进程中。 property FileName: String; //定义报表的文件名称;文件名会显示在设计环境的窗口标题中。 property PreviewPages: TfrxCustomPreviewPages readonly; //定义一个连结到已完成的报表页面。它

可被使用在所有地方,例如打印、存盘及导出等。 property Pages[Index: Integer]: TfrxPage readonly; //报表页面列表,其中对话框类型也包括在列表

中。 property PagesCount: Integer readonly; //报表的页数。 property Script: TfsScript readonly; //连结报表的“TfsScript” 组件,经由该连接,你可以为你的报表

脚本语言加入变量、类型、函数以供以后调用。 property Variables: TfrxVariables readonly; //报表变量列表。 FastReport 引擎的相关属性集合: property ConvertNulls: Boolean default True; //转换数据库字段的“Null” 值至“0”, “False” 或空字串

(依字段型态而定)。 property DoublePass: Boolean default False; //使报表进行二次处理,第一次进行资料搜集(例如报表

总页数),第二次才实际进行报表处理。 property MaxMemSize: Integer default 10; //配置报表页面缓存的最大内存使用量 ( M),当

“UseFileCashe” 属性等于“True” 时特别有用。假如在建立期间耗用太多内存,已建立的报表缓存页面将会被写入缓存文件,此属性并不非常的精确,它只大約的決定内存的限制。

property PrintIfEmpty: Boolean default True; //定义是否要打印空白报表(空报表)。 property TempDir: String; //指定保存临时文件的目录。 property UseFileCache: Boolean default False; //定义产生的预览报表是否缓存到文件。 (见

“MaxMemSize” 属性) 报表预览的相关属性集合: property AllowEdit: Boolean default True; //是否允许编辑预览窗口中的报表。 property Buttons: TfrxPreviewButtons; //预览窗口中的可用按钮集合: TfrxPreviewButtons = set of TfrxPreviewButton; TfrxPreviewButton= (pbPrint, pbLoad, pbSave,

pbExport, pbZoom, pbFind, pbOutline,pbPageSetup, pbTools, pbEdit, pbNavigator);

Page 55: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 55页/共 376页

此属性可用的值如下:pbPrint 为打印,pbLoad 为载入文件,pbSave 为存报表到文件,pbExport为导出,pbZoom为显示比例,pbFind为搜寻,pbOutline为选定报表边框,pbPageSetup为页面设定,pbTools为工具,pbEdit为编辑,pbNavigator为导航,上面的值你可以混合使用。

property DoubleBuffered: Boolean default True; //预览窗口采用双缓存区模式。假如启用(默认值),画面输出时屏幕不会有闪烁的情形,但处理速度会稍微下降。

property Maximized: Boolean default True; //定义预览窗口是否最大化。 property MDIChild: Boolean default False; //定义预览窗口是否为MDIChild (给MDI 介面使用)。 property Modal: Boolean default True; //定义预览窗口是否为Modal 模示。 property OutlineVisible: Boolean default False; //定义是否显示报表的大纲。 property OutlineWidth: Integer default 120; //定义报表大纲显示的宽度。 property ShowCaptions: Boolean default False; //定义是否显示按钮的标题。当启动该属性时,你应

该限制 Buttons 属性所显示按钮的个数,因为所有的按钮无法显示于同一画面。 property Zoom: Extended; //默认的显示百分比率。 property ZoomMode: TfrxZoomMode default zmDefault; //默认显示模式。可用的值如下: zmDefault为显示百分比率视“Zoom” 属性而定 zmWholePage为整页模示 zmPageWidth页宽 zmManyPages为两页 报表打印相关属性的集合: property Copies: Integer default 1; //默认的打印份数。 property Collate: Boolean default True; //不管校对份数。 property PageNumbers: String; //打印的页码。例如,“1,3,5-12,17-”(以“,”为分割)。 property Printer: String; //打印机名称。 property PrintPages: TfrxPrintPages default ppAll; //定义要打印的方式。可用的值如下: ppAll为全部 ppOdd为奇数页 ppEven为偶数页 property ShowDialog: Boolean default True; //是否显示打印窗口。 报表相关属性的集合: TfrxReportOptions = class(TPersistent) //published property Author: String; //报表作者。 property CreateDate: TDateTime; //报表建立日期。 property Description: TStrings; //报表描述。 property Name: String; //报表名称。 property LastChange: TDateTime; //报表最后修改日期。 property Password: String; //报表密码。假如该属性不为空白,当打开报表定义档时需要输入密码。 property Picture: TPicture; //报表图片。 property SilentMode: Boolean default False; //无声 (Silent)方式。所有的错误信息将被保存在

“TfrxReport.Errors” 属性,而不会在屏幕上显示任何信息。 property VersionBuild: String; property VersionMajor: String; property VersionMinor: String; property VersionRelease: String; //以上 4个属性决定报表版本的属性。 TfrxReport 组件事件

Page 56: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 56页/共 376页

property OnAfterPrint: TfrxAfterPrintEvent; //发生在处理完每个报表组件之后(打印后)。 property OnBeforePrint: TfrxBeforePrintEvent; //发生在处理完每个报表组件之前(打印前)。 property OnClickObject: TfrxClickObjectEvent; //当预览一份报表时,选取报表内的组件时触发该事

件。 property OnGetValue: TfrxGetValueEvent; //当启动一份报表,发现未定义的变量时,该事件必须返

回变量的值。 property OnManualBuild: TfrxManualBuildEvent; //当开始打印报表,假如此事件被启动,然后

FastReport 的引擎将被阻断(不处理),报表处理方法将交由程序员所写的程序处理。 property OnMouseOverObject: TfrxMouseOverObjectEvent; //当报表处于浏览窗口,且鼠标指针移到

该组件上时触发此事件。 property OnUserFunction: TfrxUserFunctionEvent; //当执行报表的过程中,当调用的函数不存在,请

使用“AddFunction” 方法提供自定义函数。 2、TfrxDesigner TfrxDesigner 组件是报表设计器,当使用此组件,你的工程文件就可以使用报表设计器,此组件

它只包含一些报表设计器的设定,当加入”frxDesign” 单元到 uses 清单中,就表明与报表设计器连接上了。 此组件包含下列的属性:

property CloseQuery: Boolean default True; //定义结束设计报表是否询问储存报表。 property OpenDir: String; //打开报表的默认数据目录。 property SaveDir: String; //储存报表的默认数据目录。 property Restrictions: TfrxDesignerRestrictions; //报表设计环境下,限制不同的报表操作标识,此标

识包含单一或混合数据值: drDontInsertObject为禁止插入组件 drDontDeletePage为禁止刪除页面 drDontCreatePage为禁止建立新的页面 drDontChangePageOptions为禁止修改页面属性 drDontCreateReport为禁止建立新报表 drDontLoadReport为禁止载入报表 drDontSaveReport为禁止储存报表 drDontPreviewReport为禁止预览报表 drDontEditVariables为禁止编辑变量 drDontChangeReportOptions为禁止修改报表属性 property OnLoadReport: TfrxLoadReportEvent; TfrxLoadReportEvent = function(Report: TfrxReport): Boolean of object; //此事件发生在载入报表之

时。利用此事件,你可以从数据库载入报表。 property OnSaveReport: TfrxSaveReportEvent;TfrxSaveReportEvent = function(Report:

TfrxReport;SaveAs:Boolean): Boolean of object; //此事件发生在储存报表之时。利用此事件,你可以将报表储存于数据库中。

property OnShow: TNotifyEvent; //此事件发生在启动报表设计环境时。 3、TfrxPreview 此组件专供建立自定义报表合预览窗口使用。 procedure AddPage; //加入空白页面到报表末端。 procedure DeletePage; //删除当前页。 procedure Print; //打印报表。

Page 57: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 57页/共 376页

procedure LoadFromFile; //显示文件载入窗口。 procedure LoadFromFile(FileName: String); //载入指定的文件。 procedure SaveToFile; //显示文件储存窗口。 procedure SaveToFile(FileName: String); //储存文件到指定的文件名称。 procedure Edit; //载入当前页至设计模式供编辑使用。 procedure Export(Filter: TfrxCustomExportFilter); //使用指定的导出过滤器导出报表。 procedure First; //第一页。 procedure Next; //下一页。 procedure Prior; //上一页。 procedure Last; //最后一页。 procedure PageSetupDlg; //显示页面设定窗口。 procedure Find; //显示文字搜寻窗口。 procedure FindNext; //继续找下一个。 procedure Cancel; //取消创建报表。 procedure Clear; //清除报表。 属性如下: property PageCount: Integer readonly; //报表页数。 property PageNo: Integer; //目前报表页码(起始值为 1)。要移至其它页面,指定此属性的值即可。 property Tool: TfrxPreviewTool; //选取工具。 property Zoom: Extended; //显示比例,“1” 代表 100% 。 property ZoomMode: TfrxZoomMode; //显示模式,可以的显示模式如下: zmDefault为默认值,显示比例根据“Zoom” 属性而定 zmWholePage为整页模式 zmPageWidth为与页面宽度相同 zmManyPages为一屏显示多页 property OutlineVisible: Boolean; //是否显示报表大纲(树状结构)。 property OnPageChanged: TfrxPageChangedEvent; //目前页面要改变时,此事件将被触发。 4、TfrxBarcodeObject 5、TfrxOLEObject 6、TfrxChartObject 7、TfrxRichObject 8、TfrxCrossObject 9、TfrxCheckBoxObject 10、TfrxGradientObject 4到 10组件说明:可在报表内部使用的组件,这些组件自己没做任何事情,它们会自动将组件的

单元加入 uses 清单,加入你打算打开一份报表,此功能会自动被加入报表,未包括此组件至工程文件的话,打开报表时将会发生错误。

11、TfrxDialogContols 附加项(add-in) 组件的集合,可用于报表内的对话窗口,它包含下列组件:button,edit box, list box

等。此组件自己不会执行任何事,加入此组件“frxDCtrl”将会自动加入“Uses”清单。 12、TfrxBDEComponents BDE 数据库组件,数据库界面采用 BDE(Borland Database Engine)时,工程文件必须加入此组件。 13、TfrxADOComponents ADO 数据库组件,数据库连接采用 ADO(Advance Data Object)时,工程文件必须加入此组件。

Page 58: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 58页/共 376页

14、TfrxIBXComponents Interbase 数据库组件,数据库采用 IBX 连接 Interbase 后台数据库时,工程文件必须加入此组件。 上述数据库组件,可被使用在报表的对话窗口上,它包括下列的组件: “Database”,“Table” 及

“Query” 。这些组件本身并不做任何事;它们只会将组件隶属的单元自动加入 uses 清单中。 简单范例 1、存取报表 报表定义表格与工程文件的表格储存在同一个文件(.DFM),在大部分的情況下,并不需要额外的

操作步骤,因此载入报表便相当简单。假如你要将报表储存在文件或数据库的 BLOB 字段,你必须使用“TfrxReport”提供的方法来载入及储存报表。

function LoadFromFile(const FileName: String;ExceptionIfNotFound: Boolean = False): Boolean; 载入指定的报表,假如第二个参数的值等于”True ” 且指定的文件不存在,然后它会产生一个例外。

假如文件载入成功,它返回“True”。 procedure LoadFromStream(Stream: TStream); //从数据流(stream)载入报表。 procedure SaveToFile(const FileName: String); //储存报表至指定的文件名。 procedure SaveToStream(Stream: TStream); //储存报表至数据流(stream) 。 报表默认的后缀名称为“fr3”。范例: frxReport1.LoadFromFile('d:\temp.fr3'); frxReport1.SaveToFile('d:\end.fr3'); Designing a report 设计报表 通过“TfrxReport.DesignReport”方法调用报表设计器(reportdesigner),要具有设计报表的功能,你必

须 在 工 程 文 件 中 加 入 “TfrxDesigner” 组 件 , 或 在 uses 加 入 “frxDesgn” 单 元 。 范 例 :frxReport1.DesignReport;

2、执行报表 应用下列两个“TfrxReport”组件的方法启动报表: procedure ShowReport(ClearLastReport: Boolean = True); 启动报表并显示结果在浏览窗口。假如“ClearLastReport”参数等于“False”,然后报表将会清前一份

报表的末端,否则前一份报表的内容将会被清除。 function PrepareReport(ClearLastReport: Boolean = True):Boolean; 启动报表,但不开启预览窗口,参数用法同“ShowReport”方法,假如报表建立成功,它返回“True”。 在大部分的情況下,采用第一种方法比较方便,当报表建立的过程中,它会立刻显示预览窗口。

当我们要把报表加入上一份报表的后面时,“ClearLastReport”参数是非常方便的技巧在批次报表打印时特别有效)。范例:

frxReport1.ShowReport; 3、预览报表 在报表预览窗口显示报表有两种方式:不管是调用“TfrxReport.ShowReport”方法(前面已提及)或使

用“TfrxReport.ShowPreparedReport”方法。在第二种状况,报表创建的过程不会执行,但是报表的结果会显示于屏幕。这个意思是说,你应该使用“PrepareReport”方法创建报表或载入先前已经建立的报表。范例:

if frxReport1.PrepareReport then frxReport1.ShowPreparedReport; 在这个案例中,报表创建完成在先,然后显示报表于浏览窗口。创建大型的报表可能耗费许多时

间,那也是为什么使用“ShowReport”方法会比“PrepareReport/ShowPreparedReport” 来的好的原因,我们指定“TfrxReport.PreviewOptions” 属性,指定预览的参数。

Page 59: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 59页/共 376页

4、打印报表 在大部份的情況,你会从预览窗口打印报表。要手动打印报表,你应该使用“TfrxReport.Print”方法,

例如: frxReport1.Print; 在此同时,你可以设定打印对话窗口的参数。你可以从“TfrxReport.PrintOptions”属性指定打印的默

认值及取消显示打印窗口。 5、存取已完成的报表 它可以从预览窗口执行,这也可以手动的用“TfrxReport.PreviewPages”方法执行: function LoadFromFile(const FileName: String; ExceptionIfNotFound: Boolean = False): Boolean; procedure SaveToFile(const FileName: String); procedure LoadFromStream(Stream: TStream); procedure SaveToStream(Stream: TStream); 指定参数与 TfrxReport 对应的方法类似,报表文件后缀名必须是”fp3” 。例如: frxReport1.PreviewPages.LoadFromFile('c:\1.fp3'); frxReport1.ShowPreparedReport; 注:当已完成报表载入后,预览报表必须通过 “ShowPreparedReport”方法来执行。 6、导出报表 它可从预览窗口执行,此项功能也可以用“TfrxReport.Export”方法来执行,在此方法的参数中,你

必须指定要使用的导出过滤组件:例如: frxReport1.Export(frxHTMLExport1); //导出过滤组件必须是可用的(你必须将它放入工程文件的表

单上)且设定正确。 7、建立自定义预览窗口 FastReport 显示报表于标准的预览窗口。假如为了某种理由它无法满足你,你可以使用自定义的

预览窗口。为此,FastReport 的“TfrxPreview” 组件于是诞生了,要显示报表,这个组件必须连接到“TfrxReport.Preview”属性。

8、建立复合,报表批量打印 在某些情况下,我们必须一次打印数份报表,或封装及实现多份报表于同一个预览窗口。要执行

这项工作,在 FastReport 中有多个工具,允许建立一份新的报表,置于另一份已存在的报表末端,TfrxReport.PrepareReport方法有此 ClearLastReport是否为 True,此参数定义是否清除前一份已建立的报表。下列的程序码示范如何从两个报表定义文件,批次建立一份报表:

frxReport1.LoadFromFile('1.fr3');//载入模板文件 1.fr3 frxReport1.PrepareReport;//清除现有报表内容,生成 1.fr3报表数据但不显示 frxReport1.LoadFromFile('2.fr3'); //载入模板文件 2.fr3 frxReport1.PrepareReport(False);//生成 2.fr3报表数据但不清除上一次生成的 1.fr3报表内容 frxReport1.ShowPreparedReport;//显示生成的报表(第二份报表会接在第一份报表后面) 我们载入第一个报表并在后台处理报表(不显示),然后我们载入第二份报表到同一 TfrxReport 组

件,并置参数 ClearLastReport 的值为 False建立报表。此功能允许第二份报表的结果接在第一份报表的后面。最后,我们将两份报表显示在同一个预览窗口中。

9、复合报表中的页数 你可以使用 Page, Page#, TotalPages 及 TotalPages# 系统变量显示页码或总页数。在复合式报表,

这些变量代表的意义如下: Page -目前报表的页码 Page# -批次报表的页码

Page 60: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.2 IntraWeb数据库报表解决方案之一 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 60页/共 376页

TotalPages -目前报表的总页数(报表必须设定为 two-pass) TotalPages# -批次报表的总页数 Combination of pages in a composite report 复合报表的合并页 如上所述,当打印时,报表设计的属性 PrintOnPreviousPage可以利用前一页的可用空间打印下一

页的内容。在复合报表中,它允许你在前一份报表最后一页的可用空间上建立一份新的报表,要执行

此功能,必须在每一份连续报表的第一个设计页面启动属性 PrintOnPreviousPage。

Page 61: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.3 IntraWeb数据库报表解决方案之二 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 61页/共 376页

3.3 IntraWeb数据库报表解决方案之二 ———用 FastReport + ActiveX控件实现服务器端报表

经过很长的思考,终于想试一下用 ActiveX 控件来实现我们的网络报表,只是这种控件很多用户

都不喜欢,但如果不介意的话,这是一种很好的报表解决方案。 先说一下应用环境:所有代码在WinXPSP2+Dlphi7.0 +IntraWeb9.0.45+ FastReport v3.20下调

试通过。 我的思路是这样的:(所有源代码在文件夹 3. 3中) 1、利用 FastReport报表控件制作报表模板文件,将报表模板文件存放在程序根目录下的 files目

录中,此处将报表模板文件为 report1.fr3。 2、利用 FastReport的相关组件将我们的数据在服务器上报表成一个临时文件 temp.fp3,将这所

有的临时文件存放在 files目录中的一个唯一的文件夹中(每一个用户 UserSession一开始使用时就生成一个绝对不会与别人相同的文件夹,UserSession结束时就删除这个刚刚建立的文件夹),这样就保证了不同用户调用报表时只能自己调用自己生成的数据报表。

3、将此文件 temp.fp3加密编码为字符串,再加入必要的代码生成一个网页文件 temp.htm,这个文件中我们保存了 temp.fp3的加密编码,并加入了 ActiveX控件代码。生成 temp.htm文件后我们让程序马上删除 temp.fp3文件。

4、为将在服务器上生成的临时文件 temp.htm 报表发送到客户端,我们将为这个临时文件给定一个 URL地址在新窗口中打开,这样就实现了在客户端查看,打印报表的功能。

5、通过这个 ActiveX 控件报表格式可以被转换成 PDF,RTF(WORD 格式),HTML(网页),XLS(EXCEL文件),bmp,jpg,tif 等。经检测,用 FastReport3制作报表模板时,有中文的字段请将字体改为中文字体,字符集请选择 CHINESE_GB2312,否则格式转换时,RTF和 PDF会出现乱码。

Files目录下的 Fr3ocx.ocx是我们要使用的 ActiveX控件,report1.fr3为利用 FastReport报表控件制作报表模板文件,data.mdb 为本程序所使用的数据库。应用这种解决方案时,记得一定要将Fr3ocx.ocx放在 Files目录下。 下面我们就动手试一下。 像 2.1所介绍的那样,新建一个 IntraWeb工程 RaveDemo.dpr。请安装好 FastReport3.09控件

后打开源代码自己看。(在文件夹 3.3中) 图 3-14是所有的控件布局情况。相信大家一看源代码就清楚了。我对关键代码作一下说明。

图 3-14 程序控件布局

Page 62: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.3 IntraWeb数据库报表解决方案之二 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 62页/共 376页

1、unit ServerController的代码和 3.2的完全一样,大家请参考 3.2的相关说明。 2、以下为 Unit1的完整代码:

unit Unit1; interface uses//记得要在这里加入 Zlib ,EncdDecd SysUtils,IWAppForm,IWApplication,IWBaseHTMLControl, frxClass, frxDBSet, ADODB, IWHTMLControls,Zlib,EncdDecd,DB, IWDBStdCtrls, IWCompButton, IWGrids, IWDBGrids, Classes, Controls,IWVCLBaseControl, IWBaseControl, IWControl; type TIWForm1 = class(TIWAppForm) IWButton1: TIWButton; IWDBGrid1: TIWDBGrid; IWDBNavigator1: TIWDBNavigator; RepQuerySource: TDataSource; RepQuery: TADOQuery; frxDBDataset1: TfrxDBDataset; frxReport1: TfrxReport; procedure IWButton1Click(Sender: TObject); procedure IWAppFormCreate(Sender: TObject); public end; implementation {$R *.dfm} uses ServerController, IWGlobal; // CompressAndEncode为编码函数,对字串压缩并加密,以下两个函数请放在最前面,回为后面要调用它 function CompressAndEncode(const input: string): string; var fCompressedStream: TMemoryStream; fStreamCompressor: TCompressionStream; fStringStream: TStringStream; begin fCompressedStream := TMemoryStream.Create; try fStreamCompressor := TCompressionStream.Create(clDefault, fCompressedStream); try fStreamCompressor.Write(input[1], length(input)); finally FreeAndNil(fStreamCompressor); end;

Page 63: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.3 IntraWeb数据库报表解决方案之二 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 63页/共 376页

fStringStream := TStringStream.Create(''); try fCompressedStream.Position := 0; EncodeStream(fCompressedStream, fStringStream); Result := fStringStream.datastring; finally FreeAndNil(fStringStream); end; finally FreeAndNil(fCompressedStream); end; end; // BianMa为读取一个文件并进行编码的函数,目的是将我们的已经准备好的报表文件 temp.fp3变成字符串,这样好“组装”到我们要生成的网页文件 temp.htm中 function BianMa(nfilename: string): string; var MyFileStream: TFileStream; Buffer: string; begin try MyFileStream := TFileStream.Create(nfilename, fmOpenRead); SetLength(Buffer, MyFileStream.Size); MyFileStream.Read(Buffer[1], MyFileStream.Size); Buffer := CompressAndEncode(Buffer); //得到编码后的字符串 finally MyFileStream.Free; //eventually end; if Buffer <> '' then Result := Buffer else Result := 'No Data'; end; //以下为按下“报表”按钮后的运行代码 procedure TIWForm1.IWButton1Click(Sender: TObject); var LFile, ss, tt, sfile: string; LOptions: string; LWindowName: string; LURL: string; Temp: TStringList; begin LFile := 'temp.htm';//我们要生成的报表网页文件 sfile := WebApplication.ApplicationPath + 'files\' + WebApplication.AppID + '\temp.fp3';//在服务器

Page 64: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.3 IntraWeb数据库报表解决方案之二 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 64页/共 376页

上生成的含数据的报表所保存的文件 ForceDirectories(sysutils.ExtractFilePath(sfile));//强制生成临时的唯一目录 //----------- ss := ''; frxReport1.Clear;//清除 frxReport1前一次报表内容 frxReport1.LoadFromFile(WebApplication.ApplicationPath + 'files\report1.fr3');// frxReport1导入报表模板文件 report1.fr3 frxReport1.ShowProgress := false;// frxReport1不要显示报表进程条 frxReport1.PrepareReport;// frxReport1准备报表的数据 frxReport1.PreviewPages.SaveToFile(sfile);// frxReport1将报表保存成文件 temp.fp3 if fileexists(sfile) then//如果 temp.fp3文件存在 begin ss := BianMa(sfile);// 将准备好的数据报表文件 temp.fp3进行编码为 ss字符串 deletefile(sfile);//删除文件 temp.fp3 end else ss := 'No Data'; //----------- //以下我们将“组装”一个网页文件 temp.htm,直接在 IE中浏览此文件客户端就可以看到报表 tt := '<html><head> <title>报表预览</title>' + '<META NAME="Author" CONTENT=""> ' + '<META NAME="Keywords" CONTENT=""> ' + '<META NAME="Description" CONTENT=""> ' + '<style type="TEXT/CSS">body { font-family: 宋体, Arial; font-size: 10.2pt; background-color: #FFFFFF;' + ' margin-left: 0; margin-top: 0 }</style></head>' + '<body style="margin:0 "><textarea id=''RMVIEWER_DATA'' style=''display:none''>'; tt := tt + ss;//将我们准备好的 ss字符串加入其中 tt := tt + '</textarea><table border="0" width="100%" height="100%"><tr><td width="100%">' + '<OBJECT' + ' id=ufo name=ufo' + ' classid=''clsid:AE0C8E65-C847-11D6-BE31-00E04CEF42D5''' + ' codebase=''../Fr3ocx.ocx#version=1,0,0,0''' + ' width=100%' + ' height=100%>' + ' </OBJECT>' + ' <SCRIPT language=VBScript>' + ' document.all("ufo").pone=document.all("RMVIEWER_DATA").value</Script>' + ' </td> </tr></table></body></html>'; //以上其余的 HTML元素请不要更改,Fr3ocx.ocx为我们要用的 ActiveX控件,名称请不要更改 temp:=TStringList.Create;

Page 65: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.3 IntraWeb数据库报表解决方案之二 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 65页/共 376页

temp.Clear; temp.Add(tt); temp.SaveToFile(WebApplication.ApplicationPath + 'files\' + WebApplication.AppID +'\' + LFile); temp.Free; //以上代码为将我们“组装”的字符串保存成一个网页文件 temp.htm //以下为将报表发送到客户端 //窗口名称 LWindowName := '报表预览'; //是否有滚动条,IE窗口的长和宽 ,可以为空字符串,如果为空则窗口这完整的 IE窗口。 //LOptions := 'scrollbars=yes,width=800,height=600'; LOptions :=''; //给出在服务器上生成的报表的 URL地址 LURL := WebApplication.AppURLBase + '/FilesNC/' + WebApplication.AppID + '/' + LFile; //打开一个新 IE窗口,将报表展现出来 AddToInitProc('NewWindow("' + LURL + '", "' + LWindowName + '","' + LOptions + '");'); end; end; procedure TIWForm1.IWAppFormCreate(Sender: TObject);//动态连接数据库,并打开 RepQuery查询 begin RepQuery.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + WebApplication.ApplicationPath + 'files\data.mdb;Persist Security Info=False'; RepQuery.Open; end; initialization TIWForm1.SetAsMainForm;//将此窗口设为主页面 end. 因为在 IE中浏览文件 temp.htm时,其中含有 ActiveX控件,所以 IE的相关设置要更改一下,让

IE 允许下载未签名的 ActiveX 控件,安装好我们的“Fr3ocx.ocx”ActiveX 控件后再改回来。如图 3-15所示:

Page 66: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.3 IntraWeb数据库报表解决方案之二 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 66页/共 376页

图 3-15 更改 IE相关安全设置

图 3-16 为在 IE中浏览 temp.htm时的报表打开界面:

图 3-16 报表打开界面 补充说明:RaveDemoDLL.dpr 为生成 dll 版本的工程文件。要用 IIS发布生才能查看。所有代码

在WinXPSP2+Dlphi7.0 +IntraWeb9.0.45+ FastReport v3.20下调试通过。IWServerController的属性 ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal。

Page 67: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.4 在 IntraWeb中轻松实现通用的 HTML文本编辑器 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 67页/共 376页

3.4 在 IntraWeb中轻松实现通用的 HTML文本编辑器 看到网上论坛中的 HTML文本编辑器,很是喜欢,可我用的是 IntraWeb,它自己又没有带这样的

控件,在好奇心的驱动下,我决定自己亲手试一下。经过不懈的努力,已基本实现当初的梦想,现与

朋友们共享。想法和资料有一些是来自网上,找不到作者,在此默默谢过。 所有源代码在文件夹 3.4中,其中,3.4\files文件夹中的 images文件夹是我们要使用的基本素材,

我们就靠它来实现我们的 HTML文本编辑器,如果愿意的话,就把它当成一个控件吧。看一下运行效果先:(图 3-17)

图 3-17运行效果 下面请看我们的实现过程: 像以前一样新建一个 IntraWeb工程,命名为 Project1.dpr。请打开源代码自己对照来看。 以下是关键步骤: 1、将我们的“控件”放到 files文件夹中(将 images文件夹拷贝到 files文件夹下),不要改变其中任

何内容,这是必要条件。 请看 Unit1单元: 2、将一 TIWMemo 控件放在该页面上,并命名为 IWMemo110(切记一定要是这个名字),将其

拉伸到最小,放到其它可视控件的后面,这里是放在 IWRectangle1控件的后面,移动 IWRectangle1控件即可看到。切记一定要放在可视控件的后面,这样做是为了在程序运行时不被用户看到。如果它

在其它可视控件的前面,请在 IWMemo110上点击右键,选择 Control下的 Send to Back即可。 3、将一 IWRectangle控件放在页面上,这里面将放置我们的 HTML多功能编辑器,它的宽度为程

Page 68: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.4 在 IntraWeb中轻松实现通用的 HTML文本编辑器 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 68页/共 376页

序运行时的实际宽度 4、编写如下函数:(导入 HTML多功能编辑器的代码) 当页面生成时运行时下代码:

procedure TIWForm1.IWAppFormCreate(Sender: TObject); var AText:TStringList; AFile:String; Begin //找到“控件”中的 edithtml.htm文件。WebApplication.ApplicationPath为主程序所在根目录 AFile:=WebApplication.ApplicationPath+'files/images/post/edithtml.htm'; //如果文件存在,则将其内容导入到 AText,再将 AText.Text的值赋予 IWRectangle1.Text,这样,程序运行时就会在 IWRectangle1中显示我们的 HTML文本编辑器 if FileExists(AFile) then begin AText:=TStringList.Create; AText.LoadFromFile(AFile); IWRectangle1.Text:=AText.Text; AText.Free;//释放临时创建的 AText变量 end; end; 提交按钮的实现代码: 5、在窗口中放置一个提交用的按钮 IWButton1,其 TIWScriptEvents中的属性 onMouseDown中

加入如下代码:(图 3-18) Dvbbs_CopyData('Body'); return Checkpostdata();

图 3-18 onMouseDown中加入代码

6、程序中对 IWMemo110.text的操作就是对 HTML多功能编辑器中的内容的 HTML代码的操作,将 IWMemo110.text内容保存在数据库中,也就是 HTML多功能编辑器中所显示的内容的 HTML代码

Page 69: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.4 在 IntraWeb中轻松实现通用的 HTML文本编辑器 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 69页/共 376页

被保存在数据库中了。以下是点击提交按钮后的对 IWMemo110.tex的示例操作: procedure TIWForm1.IWButton1Click(Sender: TObject); begin //显示多功能编辑器中的内容的 HTML代码,这只是为了验证我们的程序

webapplication.ShowMessage(IWMemo110.Text); //将 IWMemo110.Text中的内容用 IWRectangle2控件输出,程序运行时就会看到 HTML多功能编

辑器中所显示的内容 IWRectangle2.Text:=IWMemo110.Text; end; 由于 images文件夹中的内容基本不用修改,其中的内容就不作过多讲述,有兴趣的请自行审查,

谢谢。 这个例子没有自动绑定本机 IP,大家可以采用 3.2 中的方法,在 ServerController 单元中加入

LocalIP 函数,并进行相应的赋值操作。这样如果本机有网络的话,其地址就可以被其它机器访问,大家可以在其它机器中看到运行效果,应该是和本机一样的。 补充说明: 1、如果一定要改变 IWMemo控件的名字,不想用 IWMemo110这个名字,例如改为 IWMemook,

就要麻烦你在 images 文件夹中找到 edithtml.htm 和 DhtmlEdit1.js,将其中的 IWMEMO110 替换成IWMEMOOK(一定要全部大写)。再次调试程序时请在 IE 的 internet 选项中删除 internet 临时文件。否则调试会出错。

2、如果要限制输入文字的多少,请在 images文件夹中找到 edithtml.htm修改第 4句: MaxConlength=1624000000;数字即为文字的数量,当然,不是很精确,只是个大概。这里默认数

字很大,目的是不限制字数。 3、同样,Project_dll.dpr 为生成 dll 版本的工程文件。要用 IIS 发布生才能查看。所有代码在

WinXPSP2+Dlphi7.0 +IntraWeb9.0.45下调试通过。IWServerController的属性 ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal。

Page 70: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.5 让超级链接变成可向服务器传递参数的按钮 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 70页/共 376页

3.5 让超级链接变成可向服务器传递参数的按钮 一般超级链接都是用来打开一个新的页面。超级链接可以表示为图片或文字,比一般的按钮漂亮。

所以,如果可以利用超级链接来做按钮应该很实用。这一节我们来讨论一下怎样让超级链接变成可传

递参数的按钮? 所有源代码在文件夹 3.5中,其中,3.5\templates文件夹中的 IWForm1.html是我们主页面的模板。

看一下运行效果先:(图 3-19)

图 3-19 超级链接向服务器提交的数据

我先解释一下原理: 分三步完成这个任务: 1、产生超级链接。让超级链接指向空链接,再给它加入一个事件。代码类似如下:<a href="#none"

onclick="return SubmitClickConfirm('@a','@b_@c', true, '@d');">@e</a>,其中,参数@a为窗口中的 TIWDBGrid控件的控件名,我们这里为 ComGrid;@b为一个整数,是 TIWDBGrid控件的行号;参数@c 为向服务器提交的数据,为一个字符串;参数@d 可以为空,如果不为空,则点击链接时会出现一个警告对话框,提示内容为字符串@d;参数@e为显示在页面上的超级链接内容。 例如 1:<a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_喜剧片', true, '');">喜

剧片</a> ,这表明这个链接是 ComGrid的索引号为 1(即第二行)的行的 onclick事件来响应,传递的参数为“喜剧片”三个字,没有警告提示。 例如 2:<a href="#none" onclick="return SubmitClickConfirm('ComGrid','0_提交的数据 0', true, '

确认提交吗?');">超级链接 0</a>,这表明这个链接是ComGrid的索引号为 0(即第一行)的行的 onclick事件来响应,传递的参数为“提交的数据 0”,有警告提示:确认提交吗?当点击“确定”时继续执行,点击”取消”时退出执行。

2、在窗口中放入一个 TIWDBGrid控件,并新建与参数@b相对应的行。 3、为该行编写其 onclick事件代码,它将响应参数@b为此行的索引的超级链接,AValue的值即

为参数@c的值。这样,客户端就将数据传递到了服务器中。 请看具体实现过程: 模板内容如图 3-20所示:

Page 71: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.5 让超级链接变成可向服务器传递参数的按钮 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 71页/共 376页

图 3-20 模板设计时界面

模板上蓝色的部分是一些超级链接,其相应的源代码如下: <a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_喜剧片', true, '');">喜剧片</a> <a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_恐怖片', true, '');">恐怖片</a> <a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_动作片', true, '');">动作片</a> <a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_科幻片', true, '');">科幻片</a> <a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_惊险片', true, '');">惊险片</a> <a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_伦理片', true, '');">伦理片</a> <a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_故事片', true, '');">故事片</a> <a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_成人片', true, '');">成人片</a> <a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_电视剧', true, '');">电视剧</a> <a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_其它', true, '');">其它片</a> 程序设计时主界面如图 3-21所示:

图 3-21 程序设计时主界面

在窗口中放入了 4个 TIWRectangle控件,目的是为了输出 4个超级链接,相应代码台下: procedure TIWForm1.IWAppFormCreate(Sender: TObject); begin IWRectangle1.Text:='<a href="#none" onclick="return SubmitClickConfirm(''ComGrid'',''0_提

交的数据 0'', true, ''确认提交吗?'');">超级链接 0</a>'; IWRectangle2.Text:='<a href="#none" onclick="return SubmitClickConfirm(''ComGrid'',''1_提

交的数据 A1'', true, ''一定要提交吗?'');">超级链接 10</a>'; IWRectangle3.Text:='<a href="#none" onclick="return SubmitClickConfirm(''ComGrid'',''1_提

交的数据 A2'', true, ''可以提交了吗?'');">超级链接 11</a>';

Page 72: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.5 让超级链接变成可向服务器传递参数的按钮 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 72页/共 376页

IWRectangle4.Text:='<a href="#none" onclick="return SubmitClickConfirm(''ComGrid'',''2_提交的数据 1'', true, ''提交吗?提交后不能修改!'');">超级链接 1</a>';

end; 在窗口中加入了一个 TIWDBGrid控件,我们将它改名为 ComGrid,visible属性改为 false。点击

Columns属性右边的按钮,如图 3-22所示:

图 3-22 程序设计时主界面

新建三个行 (TIWDBGridColumn),分别为 ComGridColumns [0],ComGridColumns [1],ComGridColumns [2]。他们的 OnClick函数分别如下:(AValue中保存着超级链接传递来的数据)

procedure TIWForm1.IWDBGrid1Columns0Click(ASender: TObject;const AValue: String); begin // 响应超级链接 0的点击,因为该行的索引为 0 self.WebApplication.ShowMessage('超级链接 0向服务器提交的数据为:'+AValue); self.WebApplication.ShowMessage('超级链接源代码为:'+IWRectangle1.Text); end; procedure TIWForm1.ComGridColumns1Click(ASender: TObject;const AValue: String); begin // 响应超级链接 10和超级链接 11的点击,因为该行的索引为 1 if AValue='提交的数据 A1' then begin self.WebApplication.ShowMessage('超级链接 10向服务器提交的数据为:'+AValue); self.WebApplication.ShowMessage('超级链接源代码为:'+IWRectangle2.Text); exit; end; if AValue='提交的数据 A2' then begin self.WebApplication.ShowMessage('超级链接 11向服务器提交的数据为:'+AValue); self.WebApplication.ShowMessage('超级链接源代码为:'+IWRectangle3.Text);

Page 73: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.5 让超级链接变成可向服务器传递参数的按钮 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 73页/共 376页

exit; end; // 响应模板内的超级链接的点击 (各种影片的链接),因为该行的索引为 1 self.WebApplication.ShowMessage('您提交的数据为:'+AValue); end; procedure TIWForm1.ComGridColumns2Click(ASender: TObject;const AValue: String); begin // 响应超级链接 1的点击,因为该行的索引为 2 if AValue='提交的数据 1' then begin self.WebApplication.ShowMessage('超级链接 1向服务器提交的数据为:'+AValue); self.WebApplication.ShowMessage('超级链接源代码为:'+IWRectangle4.Text); end; end; 补充说明:

1、TIWDBGrid控件的控件名,我们这里为 ComGrid,也可以是别的任何名字,不过相应的超级链接中的名字也要改。

2、这种方式很实用,你可以组装自己需要的超级链接,通过改变传递的参数,可以实现不同的功能。

3、同样,Project_dll.dpr 为生成 dll 版本的工程文件。要用 IIS 发布生才能查看。所有代码在WinXPSP2+Dlphi7.0 +IntraWeb9.0.45下调试通过。IWServerController的属性 ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal。

Page 74: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.6 实现网页复杂提示信息框 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 74页/共 376页

3.6 实现网页复杂提示信息框 当鼠标移动到网页上的按钮或链接时,能否出现一个复杂的提示信息框?为什么说是复杂呢?我

说的这种提示信息框可以包含网页的任何元素,即可以是一个完整的网页。当鼠标移动到它上面时它

会保持住,当离开时会自动消失。经过多次的试验,现在终于可以实现了。注:加粗字体请仔细查看。 所有源代码在文件夹 3.6中,其中,3.6\templates文件夹中的 IWForm1.html是我们主页面的模板。

先看一下运行效果(当鼠标移动到按钮上时):

图 3-23 程序运行界面

1、打开 Delphi 7,点击 file->new->other,在弹出对话框中选择 VCLfor the Web选项卡,选择

Intraweb Application Wizard,点击 Ok。

图 3-24 VCLfor the Web选项卡

2、在弹出对话框中点击 Ok。 3、点击 file->save,将文件分别保存为 Umain.pas,UserSessionUnit.pas,ServerController.pas,

Project1.dpr。注意,请保存同一目录下,并在该目录下新建一个文件夹 files,这是 Intraweb 程序要使用的一个很特别的文件夹,是 Intraweb 默认的资源(各种文件,图片等)存放地。将文件 tip.js 拷贝到 files目录下。(文件目录:3.6\files\tip.js)

4、在 IWForm1上放上一个 IWRectangle1控件和 IWButton1控件,他们在 IW Standard选项

Page 75: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.6 实现网页复杂提示信息框 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 75页/共 376页

卡上。IWButton1 控件是一个按钮控件。当鼠标移动到它上面时会显示一个信息提示框。我们借助IWRectangle1输出一些自定义的 html代码。

图 3-25 编程时主窗口

5、在 IWForm1窗口的空处点击一下,修改 IWForm1的属性如下:ExtraHeade中点击右边的…

号按钮,在对话框中输入<SCRIPT language=JavaScript src="files/tip.js"></SCRIPT>,此句的目的是将 files目录下的 tip.js文件加入到网页的头部。

图 3-26 在 ExtraHeade中加入 tip.js文件

6、在 IWForm1窗口的空处点击一下,双击 OnCreate右边的空白处,加入如下函数:

图 3-27加入 onFormCreate事件

procedure TIWForm1.IWAppFormCreate(Sender: TObject);

Page 76: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.6 实现网页复杂提示信息框 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 76页/共 376页

var str: string; //str为我们要显示的字符串,可以是 html代码,如果 html代码中有',请将其替换成\'' begin str := '<table cellPadding=0 cellSpacing=0 border=0 width=600 style=\''table-layout: fixed\'' align=center><tr><td style=\''word-wrap: break-word\''><font color=red>最牛的优化大师(注册版本):</font>' + ' <table cellSpacing=0 width=100% bgColor=#cccccc align=center><tr><td height=1></td></tr></table><br><a href="files/ss.bmp" target=_blank title="点击开新窗口查看图片"><img src="files/ss.bmp" border=0 ' + ' onLoad=\''javascript:if(580<this.width)this.width=580\''></a><br>' + ' <br>============================================== ...</td></tr></table>'; //第一种应用方式: // 函数 showTip(str,x) :期中 str前后要有单引号,x为显示框出现时的 x坐标位置,如果为-1则自动取鼠标的当前 x坐标值,x为数字 //函数 hideTip():可以直接调用,用来隐藏显示框的 IWLink2chazaojieguo.ScriptEvents.Clear; //为 IWButton1增加一个 Script事件 onMouseMove,当鼠标经过时,执行'showTip('''+str+''',-1)' ,显示显示框 IWButton1.ScriptEvents.Add('onMouseMove').EventCode.Text := 'showTip(''' + str + ''',-1)'; //为 IWButton1增加一个 Script事件 onMouseout,当鼠标移走时,执行'hideTip()',隐藏显示框 IWButton1.ScriptEvents.Add('onMouseout').EventCode.Text := 'hideTip()'; //第二种应用方式: //************************************************************* 直接输出 html代码如下实现 IWRectangle1.Text := ' <table width="100%" border="1">' + '<tr>' + '<td width="20%">序号:</td> ' + '<td width="80%">内容: </td> ' + '</tr> ' + '<tr> ' + '<td>1</td> ' + '<SCRIPT language=JavaScript> var temp1 ='''+str+''' </SCRIPT>' + //先要定义变量 temp1,注意每个变量名要不一样。不能直接将 str放在函数中 '<td><a onMouseMove=showTip(temp1,100); onMouseOut=hideTip(); href="files/ss.bmp" target=_blank title=""><font color="#996633">最好的优化大师(注册版本)</font></a> ' + '</td> ' + '</tr> ' + '</table>'; //********************************************************** end;

7、要实现这种功能,只要在相应的控件中加入两个 Script事件即可,字符串为信息提示框的 html源代码,可以用 dreamweaver 协助设计。切记如果代码中有’,请用\’’替换。别忘了在 files 目录中拷入 tip.js文件。很简单吧^_^,我可是经过了 N次的调试才搞定呀,很累,不过很有成就感。望高手不要见笑。程序发布时只要把 files、templates文件夹和 Project1.exe文件同时拷贝走就可以了(放在同一个文件夹中)。

Page 77: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.6 实现网页复杂提示信息框 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 77页/共 376页

8、同样,Project_dll.dpr 为生成 dll 版本的工程文件。要用 IIS 发布生才能查看。所有代码在WinXPSP2+Dlphi7.0 +IntraWeb9.0.45下调试通过。IWServerController的属性 ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal。以下为用 IIS发布时的运行界面。S为网站虚拟目录。

图 3-28用 IIS发布时的程序运行界面

Page 78: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.7 实现网页中的目录树 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 78页/共 376页

3.7 实现网页中的目录树 在 intraweb 实现目录树总是有点不太让人满意,远没有下图好看。经过多次的试验,现在终于

可以实现了。可以把它当作一个控件使用,files文件夹下的 dtree文件夹即是我们的“控件”。使用时请将该控件拷贝到 files目录下即可。 所有源代码在文件夹 3.7中,其中,3.7\templates文件夹中的 IWForm1.html是我们主页面的模板。

先看一下运行效果:

图 3-29 程序运行界面

1、打开 Delphi 7,点击 file->new->other,在弹出对话框中选择 VCLfor the Web选项卡,选择

Intraweb Application Wizard,点击 Ok。

Page 79: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.7 实现网页中的目录树 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 79页/共 376页

图 3-30 VCLfor the Web选项卡

2、在弹出对话框中点击 Ok。 3、点击 file->save,将文件分别保存为 Umain.pas,UserSessionUnit.pas,ServerController.pas,

Project1.dpr。注意,请保存同一目录下,并在该目录下新建一个文件夹 files,这是 Intraweb 程序要使用的一个很特别的文件夹,是 Intraweb 默认的资源(各种文件,图片等)存放地。将文件夹 dtree 拷贝到 files目录下。(文件目录:3.7\files\dtree)

4、在 IWForm1 上放上一个 dtree 控件(dtree: TIWRectangle)和 ComGrid 控件(ComGrid: TIWDBGrid;)。我们借助 dtree输出自定义的目录树的 html代码。

图 3-31 编程时主窗口

5、在 IWForm1窗口的空处点击一下,修改 IWForm1的属性如下:ExtraHeade中点击右边的…号按钮,在对话框中输入<LINK href="files\dtree\dtree.css" type=text/css rel=stylesheet>和<script type="text/javascript" src="files\dtree\dtree.js"></script>,此句的目的是将 dtree 目录下的 dtree.css和 dtree.js文件加入到网页的头部。

图 3-32 在 ExtraHeade中加入 dtree.css和 dtree.js文件

6、在 IWForm1窗口的空处点击一下,双击 OnCreate右边的空白处,加入如下函数:

图 3-33加入 onFormCreate事件

procedure TIWForm1.IWAppFormCreate(Sender: TObject);

Page 80: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.7 实现网页中的目录树 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 80页/共 376页

var i, j, k, m: Integer; str1, str2, str: string; begin//以下 4个为算法实现的辅助变量 str1 := ''; str2 := ''; j := 0; m := 0; UserSession.Querytemp.Close; //填充目录树:数据库中的 typeid1为上一级,typeid2为下一级 UserSession.Querytemp.SQL.Clear;//以下将目录树的内容一次性选择出来并排好序 UserSession.Querytemp.SQL.Add('select * from basetype order by typeid1,typeid'); UserSession.Querytemp.Open; UserSession.Querytemp.First; dtree.Text := '';// 清空 dtree.Text是的 html代码 dtree.Text := dtree.Text + '<script type="text/javascript"><!--' +#13+ ' d = new dTree(''d'');' +

//' d.config.useIcons = false;' +//如果去掉这一名的注释,则目录树不会有文件夹图标显示 //以下为加入目录的一个节点的函数 d 是我们新建立的目录树对象,add 是加入节点的方法。

Add(id, pid, name, url),各参数意义如下(前 3个是必需的。)

id Number 唯一标识目录树节点的一个数字。

pid Number 该节点的父节点的 id。如果为-1则为根目录

name String 该节点在网页上显示的文字。

url String 点击该节点所对应的超级链接。

title String 鼠标移动到该节点时的提示信息。

//以下一句加入根节点,显示文字为“所有内容”,超级链接为空,但点击时调用一个 javascript代码,目的是调用该网页所对应窗口的 ComGrid控件的第一行的 ComGridColumns0Click(ASender: TObject;const AValue: String)事件,且会将 All字符串传递给 Avalue参数。这在《怎样让超级链接变成可传递参数的按钮》已经有所讲解,这里不再详述。注:在 javascript代码中,\’才表示会输出一个单引号’,所以下面有很多地方有\。 ' d.add(''' + '0' + ''',''' + '-1' + ''',''' + '所有内容' + ''',''"#none" onclick = "javascript: return SubmitClickConfirm(\''ComGrid\'', \''0_'+'All'+'\'', true, \''\''); " ''); '; for i := 1 to UserSession.Querytemp.RecordCount do//从第一条记录开始,逐条对比。 begin j := j + 1;//j为 id号,从 1开始编号(0已经被根节点用了) str2 := UserSession.Querytemp.FieldByname('typeid1').AsString; if str1 <> str2 then//如果不等,这说明是一个新的父节点 begin str := str2;//str为节点在网页上显示的文字,即 name参数的内容 m := j;//将当前节点的 id保存在m中,如果这个节点有子节点,那么子节点的父节点 id就是m k := 0;//k为该节点的父节点 id,我们这里只有两级,所以所有父节点的父节点 id都是 0 end else//如果该节点是子节点 begin str := UserSession.Querytemp.FieldByname('typeid2').AsString;//该节点显示子节点的内容 k := m;//该子节点的父节点 id为m

Page 81: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.7 实现网页中的目录树 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 81页/共 376页

end; //以下为加入父节点或子节点。显示文字为 str变量内容,超级链接为空,但点击时调用一个 javascript代码,目的是调用该网页所对应窗口的 ComGrid控件的第一行的 ComGridColumns0Click(ASender: TObject;const AValue: String)事件,且会将 str变量内容传递给 Avalue参数。 dtree.Text := dtree.Text + ' d.add(''' + inttostr(j) + ''',''' + inttostr(k) + ''',''' + str + ''',''"#none" onclick = "javascript: return SubmitClickConfirm(\''ComGrid\'', \''0_'+str+'\'', true, \''\''); " ''); '; UserSession.Querytemp.Next;//移动到下一条记录 str1:=str2;//更新 str1的内容 end; dtree.Text := dtree.Text + ' document.write(d);d.openTo(2,false); //--> </script></td>'; UserSession.Querytemp.Close;

7、加入 ComGrid控件的第一行的 ComGridColumns0Click事件:

图 3-34加入 ComGridColumns0Click事件

//每一链接都会调用该函数: procedure TIWForm1.ComGridColumns0Click(ASender: TObject; const AValue: String); begin WebApplication.ShowMessage('您刚才点击的是:'+AValue);//在这里可以写入任何复杂的代

码以实现你所有想实现的功能。 end; 运行效果如图:

图 3-35点击链接后调用 ComGridColumns0Click事件的结果

8、同样,Project_dll.dpr为生成 dll版本的工程文件。要用 IIS发布生才能查看。所有代码在WinXPSP2+Dlphi7.0 +IntraWeb9.0.45下调试通过。IWServerController的属性 ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal。

Page 82: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 82页/共 376页

3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息) 在 intraweb 实现导航条,我们有一种简便的方法,那就是通过窗口的继承。可以设置一个窗口

UformBase,在其中可以定义一些每页都可能用到的元素,其它的窗口从它继承即可。 所有源代码在文件夹 3.8中,其中,3.8\templates\1文件夹中的 IWFormmain.html是我们主页面

IWFormmain的模板。先看一下运行效果:

图 3-36 程序运行界面

图 3-37为与运行界面对应的 html模板图。在图中共有 6个 intraweb控件标记:{%DengLu%},{%IWRegionchazhao%} , {%messagebox1%} , {%messagebox%} , {%messagebox2%} ,{%messagebox5%}。

(1) {%DengLu%}是一个 TIWRegion 控件,它是一个容器,包含在里面的所有的控件可以一起被引用。在网页上指定{%DengLu%},即可把 DengLu内的所有控件都显示在网页中。这里面可以输入用户名和密码,登录,注册,搜索和退出程序 4个按钮,一个搜索内容输入框,有三个链接,分别是打开学习资源主页,打开 BBS主页和返回首页。他们都可以传递参数的超级链接,这在前面已经详细介绍过了。正确登录后,相应的登录和注册控件的 visible属性将改为 false,这样他们就不可见了。

(2) {%IWRegionchazhao%}也是一个 TIWRegion控件。这里面有一个要查找的单词的输入框,一个查找的链接,还有查找结果,我的收藏夹和修改注册信息 3个隐藏链接,当点击查找链接找到相应的词后查找结果链接变得可见,后 2个链接正确登录后将会可见,同样他们也是可以传递参数的超级链接。

(3) {%messagebox1%}是一个 TIWRectangle控件,表现就是一个方框。往它的 text属性填写html 代码,可以在网页中显示正确的内容。我们可以利用它组装我们的 html 代码,让他在模板的相应位置显示出来。这里将从数据库中任意读取一条英语名句显示出来。{%messagebox2%}也是一样的,只是它显示的是从数据库中随机读取的一个单词。

(4) {%messagebox%}也是一个 TIWRectangle控件。他主要显示一些提示信息和相应的权限控制链接。登录后会有欢迎信息和相应的权限控制链接显示。

Page 83: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 83页/共 376页

(5) {%messagebox5%}也是一个 TIWRectangle 控件。主要用来显示从数据库中读取到的版权信息。

图 3-37 与运行界面对应的 html模板图

请打开 3.8中的 exe.dpr工程文件。再打开我们的导航窗口 UFormBase.pas。所有控件如图 3-38

所示。

图 3-38 编程时导航窗口(用来被继承的窗口) 如图 3-40,通过继承 IWFormBase窗口生成主页窗口 IWFormmain。生成后保存为 Umain.pas,

窗口名称为 IWFormmain。

图 3-40 通过继承 IWFormBase窗口生成主页窗口 IWFormmain

Page 84: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 84页/共 376页

在主页窗口中我们定义搜索按钮的事件代码如下: procedure TIWFormmain.SearchClick(Sender: TObject); begin inherited; UserSession.BasetableSearch := Searchedit.Text; if (WebApplication.FindComponent('IWFormbasetable') as TIWContainer) = nil then //TIWFormbasetable.Create(WebApplication).Show;//工程文件中还没有完成。 end; 记得在最后一个 end 前加上如下代码将这个窗口设定为主页面(同时去掉被继承的窗口以下代

码): initialization TIWFormmain.SetAsMainForm; 通过这种方法实现的导航条,相当灵活实用。只需继承这个窗口,不用写一句多余的代码。 代码导读 1、以下我说一下编程思路: 这个继承它的窗口每次在 IE中显示时都要做如下事情:是否登录,如果没有登录,则显示登录

输入框和注册按钮,如果已经登录则根据用户的权限来显示公告信息框的欢迎信息和相应的权限控制

链接,查找登录都的收藏夹信息,如果有则显示我的收藏夹链接,并将所有收藏夹的内容用一个复杂

的网页提示框显示(前面有一节实现网页复杂提示信息框对此进行了专门讲解),显示修改注册信息链接。再给每日一句和每日一词和版权信息三个控件的 text赋值。 procedure TIWFormBase.IWAppFormRender(Sender: TObject); procedure changeface;//判断已登录者的权限来改变相应控件的 visible属性,这该事件内部的一个过程。 begin Login.Visible := False; Reg.Visible := False; UserID.Visible := False; PASS.Visible := False; Label1.Visible := False; Label2.Visible := False; messagebox.Text := GetSpace(3) + GetHourStr + '好 ,<strong>' + UserSession.nicheng + '(' + UserSession.UserLoginName + ')</strong>';// GetSpace(3)是 ServerController内的一个公用函数,用来组装 html 代码中的空格个数,这里显示 3 个空格。GetHourStr 函数得到一天的时间段称呼。UserSession.nicheng为在 UserSession中定义的全局变量(以后所有的窗口都可以直接调用它,是一种网页之间传递参数的好方法),在点击登录按钮时会给它赋值。UserSession.UserLoginName与前类似,记录用户名。 if UserSession.Userrole = 'admin' then//如果用户角色是管理员 begin messagebox.Text := messagebox.Text + GetLinkString('1', '管理资源目录分类', '【管理资源目录分类】', '', '', 'ComGrid0') + '|' + GetLinkString('1', '管理 BBS分类', '【管理 BBS分类】', '', '', 'ComGrid0') + '|' + GetLinkString('1', '系统综合设置', '【系统综合设置】', '', '', 'ComGrid0') + '|' + GetLinkString('1', '管理用户', '【管理用户】', '', '', 'ComGrid0'); end;

Page 85: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 85页/共 376页

IWLink7xiugaizhuce.Visible := True; //显示修改注册信息链接 IWLink7shucangjia.Visible := True;//显示收藏夹链接 messagebox.Text := messagebox.Text + ',如果要关闭浏览器,请先点击页面右上角的[退出程序]按钮。<hr>' + GetSpace(3) + message0; ShowShouCangJia; //显示收藏夹内容,请查看其相应的过程 end;//子过程结束 var//正式开始 IWAppFormRender事件 VLIst: TStringList; closestr: string; begin closestr := '<script FOR=window EVENT=onunload>if (window.event.clientY <0) ' + '{SubmitClickConfirm(''ComGrid0'',''0_close'', true, '''');window.alert(''欢迎下次再来!'');}</script>';//此句很重要。它将每页中加入这些代码,作用是当你直接关闭 IE时会调用一个函数来主动结束该用户的 Session,从而主动释放了服务器的内存。它调用的是 ComGrid0控件的每一行的 onclick事件。 Label1.Text := '用户:'; //----------------------------------------- UserSession.Querytemp.close; //插入公告信息 UserSession.Querytemp.SQL.Clear; UserSession.Querytemp.SQL.Add('select * from settables where setid=:setid'); UserSession.Querytemp.Parameters.ParamByName('setid').Value := GY.Encrypt_text(' 公 告 信 息 ', UserSession.mm);// GY.Encrypt_text是一个给字符加密的函数 UserSession.Querytemp.Open; if UserSession.Querytemp.RecordCount > 0 then begin message0 := GY.DeEncrypt_text(UserSession.Querytemp.FieldByname('content').Value, UserSession.mm); // GY.DeEncrypt_text是一个给字符解密的函数 end else message0 := '暂无公告。'; UserSession.Querytemp.close; //----------------------------------------- ……类似代码略 //----------------------------------------- VLIst := TStringList.Create; VLIst.LoadFromFile(WebApplication.ApplicationPath + 'files\FilmSystem.ini'); // FilmSystem.ini文件保存了系统的相关信息 IWTemplateProcessorHTML1.Templates.Default := UserSession.Skin + '\' + WebApplication.ActiveForm.Name + '.Html'; //IWTemplateProcessorHTML1是 html模板控件,这一句是保证继承它的窗口会调用相应的模板文件。模板文件的命名规则是对应窗口的 name加.html。 if StrToBoolDef(VLIst.ValueFromIndex[1], False) then //如果支持页面特效 ExtraHeader.Text := ' <meta HTTP-EQUIV="Page-Enter" CONTENT="revealtrans(duration=0.5,

Page 86: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 86页/共 376页

transition=23)"> ' + ExtraHeader.Text;//加号前是支持页面特效的代码,加号后是说我的ExtraHeader.Text本来就有的值不能丢。 VLIst.Free; //如果不是注册会员 messagebox.Text := GetSpace(3) + GetHourStr + '好,' + '请您先登录。登录后如果要关闭浏览器,请先点击页面右上角的[退出程序]按钮。<hr>' + GetSpace(3) + message0; //如果是注册会员,则改变相应控件的 visible属性。 if UserSession.IsRegUser then changeface; end;

2、登录按钮主要完成对用户的判断: 是否要审核(网站新注册的可能要管理员审核),如果要审核则不能让你登录;根据数据库的记录

判断登录者的可登录时间是否已经用完或者已经过期,不符合条件则不能登录;判断权限,根据不同

的 权 限 给 UserSession 中 的 相 应 变 量 赋 值 。 UserSession.IsRegUser( 是 否 已 注 册 ) ,UserSession.UserLoginName(登录名称),UserSession.nicheng(昵称),UserSession.Userrole(角色即权限),这样其它的函数就可以使用这些变量。如前面介绍的 IWAppFormRender事件。

这里的每个链接都是可以向服务器传递参数的,此种方法在前面一节已经有详细介绍。图 3-41 为登录后的窗口。公告信息(其内容生成代码

if UserSession.Userrole = 'admin' then begin messagebox.Text := messagebox.Text + GetLinkString('1', '管理资源目录分类', '【管理资源目

录分类】', '', '', 'ComGrid0') + '|' + GetLinkString('1', '管理 BBS分类', '【管理 BBS分类】', '', '', 'ComGrid0') + '|' + GetLinkString('1', '系统综合设置', '【系统综合设置】', '', '', 'ComGrid0') + '|' + GetLinkString('1', '管理用户', '【管理用户】', '', '', 'ComGrid0'); end;)内的管理权限链接都会调用 ComGrid0Columns1Click事件:

图 3-41 登录后的窗口

链接传递的参数由 Avalue接收。根据不同的参数调用不同的窗口。 procedure TIWFormBase.ComGrid0Columns1Click(ASender: TObject; const AValue: string); begin if AValue = '管理资源目录分类' then begin UserSession.basetypeType1 := 'All'; UserSession.basetypeSearch := ''; if Self.WebApplication.ActiveForm.Name <> 'IWFormmain' then Free;

Page 87: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 87页/共 376页

//TIWFormbasetype.Create(WebApplication).Show;//由于此窗口在工程中没有,所有注释了 end; if AValue = '管理 BBS分类' then begin UserSession.bbstypeType1 := 'All'; if Self.WebApplication.ActiveForm.Name <> 'IWFormmain' then Free; //TIWFormbbstype.Create(WebApplication).Show; //由于此窗口在工程中没有,所有注释了 end; if AValue = '管理用户' then begin UserSession.usertablesReg := 0; //表示不是注册 UserSession.usertablesmody := 0; if Self.WebApplication.ActiveForm.Name <> 'IWFormmain' then Free; //TIWFormusertables.Create(WebApplication).Show; //由于此窗口在工程中没有,所有注释了 end; if AValue = '系统综合设置' then begin //TIWFormsettablespost.Create(WebApplication).Show; //由于此窗口在工程中没有,所有注释

了 end; end; 3、查找链接中的实现代码请参考实现网页复杂提示信息框这一节的内容。 4、退出程序按钮的代码实现: procedure TIWFormBase.IWButton1Click(Sender: TObject); begin UserSession.loginout; //处理退出,将该用户标记为退出并记录上网剩余时间 WebApplication.TerminateAndRedirect('files/exit.htm');//结束该 Session并转向退出页面。 end; 5、当直接关闭 IE时会调用一个函数来主动结束该 Session。原因是 closestr := '<script FOR=window EVENT=onunload>if (window.event.clientY <0) ' + '{SubmitClickConfirm(''ComGrid0'',''0_close'', true, '''');window.alert('' 欢 迎 下 次 再 来 !

'');}</script>'; messagebox1.Text := closestr + …… 这样,在所有继承了该窗口的网页内都有这一段代码,它会调用以下事件: procedure TIWFormBase.ComGrid0Columns0Click(ASender: TObject; const AValue: string); begin UserSession.closesessoion;//这个函数可以主动结束该 Session以释放服务器资源。 end; procedure TIWUserSession.closesessoion;//方法是关闭所有的已生成窗口,有几个就要关几个,这

Page 88: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 88页/共 376页

里只有一个主界面WFormmain begin loginout;//处理退出 try if (WebApplication.FindComponent('IWFormmain') as TIWContainer) <> nil then (WebApplication.FindComponent('IWFormmain') as TIWContainer).free; except Exit; end; end; 6、IWFormBase窗口的 javascript属性如下(这样可以保证继承它的每个窗口都有): var rate = 30; var obj; var act = 0; var elmH = 0; var elmS = 128; var elmV = 255; var clrOrg; var TimerID; if (navigator.appName.indexOf("Microsoft",0) != -1 && parseInt(navigator.appVersion) >= 4) { Browser = true; } else { Browser = false; } if (Browser) { document.onmouseover = doRainbowAnchor; document.onmouseout = stopRainbowAnchor; } function doRainbow() { if (Browser && act != 1) { act = 1; obj = event.srcElement; clrOrg = obj.style.color; TimerID = setInterval("ChangeColor()",100); } } function stopRainbow() { if (Browser && act != 0) { obj.style.color = clrOrg; clearInterval(TimerID); act = 0;

Page 89: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 89页/共 376页

} } function doRainbowAnchor() { if (Browser && act != 1) { obj = event.srcElement; while (obj.tagName != 'A' && obj.tagName != 'BODY') { obj = obj.parentElement; if (obj.tagName == 'A' || obj.tagName == 'BODY') break; } if (obj.tagName == 'A' && obj.href != '') { act = 1; clrOrg = obj.style.color; TimerID = setInterval("ChangeColor()",100); } } } function stopRainbowAnchor() { if (Browser && act != 0) { if (obj.tagName == 'A') { obj.style.color = clrOrg; clearInterval(TimerID); act = 0; } } } function ChangeColor() { obj.style.color = makeColor(); } function makeColor() { if (elmS == 0) { elmR = elmV; elmG = elmV; elmB = elmV; } else { t1 = elmV; t2 = (255 - elmS) * elmV / 255; t3 = elmH % 60; t3 = (t1 - t2) * t3 / 60;

Page 90: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 90页/共 376页

if (elmH < 60) { elmR = t1; elmB = t2; elmG = t2 + t3; } else if (elmH < 120) { elmG = t1; elmB = t2; elmR = t1 - t3; } else if (elmH < 180) { elmG = t1; elmR = t2; elmB = t2 + t3; } else if (elmH < 240) { elmB = t1; elmR = t2; elmG = t1 - t3; } else if (elmH < 300) { elmB = t1; elmG = t2; elmR = t2 + t3; } else if (elmH < 360) { elmR = t1; elmG = t2; elmB = t1 - t3; } else { elmR = 0; elmG = 0; elmB = 0; } } elmR = Math.floor(elmR); elmG = Math.floor(elmG); elmB = Math.floor(elmB); clrRGB = '#' + elmR.toString(16) + elmG.toString(16) + elmB.toString(16); elmH = elmH + rate; if (elmH >= 360) elmH = 0; return clrRGB; } //以上代码是实现链接当鼠标上去时的七彩闪烁效果 // Check_Search是搜索按钮的 javascript事件调用的代码,注意:控件名称要大写且在其后面要

加上 IWCL,这样才能在 javascript中调用它。 function Check_Search() { if (SEARCHEDITIWCL.value=="") { alert("请输入查询条件!"); SEARCHEDITIWCL.focus(); return false; } SubmitClickConfirm('SEARCH','', true, '');

Page 91: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.8 用窗口继承的方法实现网页中的导航条(即每页都有的信息) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 91页/共 376页

} // Check_Search是登录按钮的 javascript事件调用的代码 function Check_Users() { var obj = USERIDIWCL; if (obj.value== "") { alert("用户名不能空!"); obj.focus(); return false; } var obj = PASSIWCL; if (obj.value== "") { alert("密码不能空!"); obj.focus(); return false; } SubmitClickConfirm('LOGIN','', true, ''); }

Page 92: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.9 用 html模板格式化输出数据库中的数据 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 92页/共 376页

3.9 用 html模板格式化输出数据库中的数据 在 intraweb中实现如图 3-42样式的表格,好像用控件直接实现是有一定困难的。 所有源代码在文件夹 3.9中,其中,3.9\templates\1文件夹中的 IWFormmain.html是我们主页

面 IWFormmain的模板。先看一下运行效果:

图 3-42 程序运行界面

图 3-43为程序的主窗口的控件布局,用两个 IWRectangle控件在页面上输出我们用程序组装出来的 html代码。newbasetable1中显示最新的几条英语文摘信息,newbasetable2中显示最新的几条教案课件信息,newbasetable1和 newbasetable2都是 TIWRectangle控件。ComGrid表格控件用来编写链接的服务器端响应事件(这种应用方式已经在让超级链接变成可向服务器传递参数的按钮这一节中讲解过了)。

图 3-43 程序的主窗口的控件布局

Page 93: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.9 用 html模板格式化输出数据库中的数据 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 93页/共 376页

图 3-44为程序的主窗口对应的 html模板,{%newbasetable1%} 和{%newbasetable2%}分别代

表最新的几条英语文摘信息和最新的几条教案课件信息。

图 3-44 程序的主窗口对应的 html模板

我们实现的思路是这样的: TIWRectangle控件的 text属性可以接收 html代码,我们可以先建立一个 html文件,这可以用

可视开发工具实现,我们可以把它叫做皮肤文件。本例的皮肤文件放在 3.9\files\Skin\1文件夹下,文件名为 newbasetable.Html。图 3-45 即为此皮肤模板。我们可以先载入该文件的 html 代码,再用相应的数据替换皮肤中的唯一的特定标记,这样就就可实现复杂格式的页面表格显示。

图 3-45 皮肤模板

1、请修改 IWServerController内 TemplateDir属性为“templates\1\”,因为程序模板文件不在默认目录下,所以要指定。

2、自己建立了一个函数 topnew(IWRectangle,typeid1),IWRectangle 为输出 html 代码的TIWRectangle控件名,typeid1为数据分类,这里只有“新闻”和“教案课件”两类。 procedure TIWFormmain.topnew(IWRectangle: TIWRectangle; typeid1:string); var Temp: TStringList;//用来导入皮肤的 html代码 Memo,atitle: string;//用来记录简介和标题 i,j: Integer; begin IWRectangle.Text := '';//先清空 html代码 Temp := TStringList.Create; with UserSession.Querytemp do begin Close; SQL.Clear; SQL.Add('select top 10 * from basetable where typeid1='''+typeid1+''' order by dateandtime desc'); Open; if UserSession.Querytemp.RecordCount>10 then j:=10 else j:=UserSession.Querytemp.RecordCount;//最多输出 10条记录 try for I := 1 to j do begin//循环开始

Page 94: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.9 用 html模板格式化输出数据库中的数据 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 94页/共 376页

if Length(FieldByname('jianjie').AsString) >= 100 then//如果简介字段大于 100个字符,则显示标题加回车加简介加这 100个字符。 Memo := FieldByname('title').AsString+':'+#13+'简介:'+Copy(FieldByname('jianjie').AsString, 0, 100) + '....' else if Length(FieldByname('jianjie').AsString) > 0 then//如果没有超过 100但大于 0 Memo := FieldByname('title').AsString+':'+#13+'简介:'+FieldByname('jianjie').AsString Else//如果没有简介 Memo := FieldByname('title').AsString; if Length(FieldByname('title').AsString) >= 22 then//如果标题大于 22个,标题最多显示 22个,和了就截掉 atitle := Copy(FieldByname('title').AsString, 0, 22) + '....' else atitle := FieldByname('title').AsString; //以上是取出数据库的大字段数据进行截断处理,以下每一条记录都这样做:载入皮肤再用相应的数据替换皮肤中的特定标记 Temp.Clear;//清空上一条记录的影响 Temp.LoadFromFile(WebApplication.ApplicationPath + '\files\Skin\' + GSkin + '\newbasetable.Html');//载入皮肤的 html代码 Temp.Text := StringReplace(Temp.Text, '[typeid2]', GetLinkString('1', FieldByname('typeid2').AsString, FieldByname('typeid2').AsString, '查找该分类'), [rfReplaceAll]); // StringReplace函数在 sysutils中,大家应该都会用,在第一个参数中查找到第二个参数后用第三个参数替换掉。GetLinkString(Row, ID: string; Link: string; title: string = ''; Cof: string = ''; GridName: string = 'ComGrid'): string; 也是我们编写的一个函数,生成一个超级链接,它给服务器传递的参是 ID,在网页上显示的链接文字是 Link,当鼠标移动到链接上显示的提示信息为 title,默认为空,即没有提示信息,点击后弹出确认对话框的内容为 Cof,默认为空,即没有确认对话框,服务器上响应该链接的控件为GridName,默认为 ComGrid,本例中就有一个 ComGrid 控件,Row 即指 GridName 的第几行,从 0开始,依次对应 GridName的第 1、2、3、…的 onclick事件,该事件的 avalue参数将接收该链接所提交的 ID 值。此处替换类别,对应 ComGrid 的第二行的 onclick 事件,传递的参数是FieldByname('typeid2').AsString Temp.Text := StringReplace(Temp.Text, '[title]', GetLinkString('2', FieldByname('recordid').AsString,atitle,Memo), [rfReplaceAll]);//此处替换标题,对应 ComGrid的第 3行的 onclick事件,传递的参数是 FieldByname(' recordid ').AsString Temp.Text := StringReplace(Temp.Text, '[updatename]', GetLinkString('4', FieldByname('updatename').AsString,GY.DeEncrypt_text(FieldByname('updatename').AsString,UserSession.mm), '查看上传者详细信息'), [rfReplaceAll]);//此处替换上传者,对应 ComGrid的第 3行的 onclick事件,传递的参数是 FieldByname(' updatename ').AsString Temp.Text := StringReplace(Temp.Text, '[dateandtime]', FieldByname('dateandtime').AsString, [rfReplaceAll]); //此处替换时间 Temp.Text := StringReplace(Temp.Text, '[downloadhits]', FieldByname('downloadhits').AsString, [rfReplaceAll]); //此处替换下载次数 Temp.Text := StringReplace(Temp.Text, '[lookhits]', FieldByname('lookhits').AsString, [rfReplaceAll]); //此处替换点击次数 Temp.Text := StringReplace(Temp.Text, '[评论]', '评论+' + FieldByname('lookafters').AsString,

Page 95: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.9 用 html模板格式化输出数据库中的数据 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 95页/共 376页

[rfReplaceAll]); //此处替换评论 Next;//转到下一条记录 IWRectangle.Text := IWRectangle.Text + Temp.Text;//累加我们组装出来的代码 end; except IWRectangle.Text := Temp.Text; end; end; Temp.Free; end;

3、在窗口的 onFormRender事件中填写如下代码: procedure TIWFormmain.IWAppFormRender(Sender: TObject);//每次显示页面时都会执行 begin topnew(newbasetable1, '新闻'); //给 newbasetable1的 text属性赋值,用 typeid1为新闻的数据显

示 topnew(newbasetable2, '教案课件'); //给 newbasetable1的 text属性赋值,用 typeid1为教案课件

的数据显示 end; 通过这种方法,任何复杂的页面形式都可以实现。用 intraweb 进行 html 代码组装和 javascript

代码组装是我们应该掌握的基本技巧,这是用最少的控件实现最为灵活的应用的必由之路。

Page 96: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.10 用自己的代码实现表格翻页控件 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 96页/共 376页

3.10 用自己的代码实现表格翻页控件 如图 3-46样式的表格,我们在用 html模板格式化输出数据库中的数据这一节中讲解过了,但数

据库中有很多条记录,必然要实现翻页,下面我们就讨论一下翻页的实现。 所有源代码在文件夹 3.10中,其中,3.10\templates\1文件夹中的 IWFormbasetable.html是我

们主页面 IWFormbasetable的模板,3.10\files\Skin\1\ Listbasetable.HTMl是表格的皮肤模板。先看一下运行效果:

图 3-46 程序运行界面

图 3-47 为程序的主窗口的控件布局,用一个 TIWDBGrid 控件 ListGrid 在页面上输出表格中的数据内容。用一个 TIWRectangle控件 Page显示翻页链接。ComGrid表格控件用来编写链接的服务器端响应事件(这种应用方式已经在让超级链接变成可向服务器传递参数的按钮这一节中讲解过了)。

图 3-47 程序的主窗口的控件布局

Page 97: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.10 用自己的代码实现表格翻页控件 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 97页/共 376页

图 3-48 为程序的主窗口对应的 html 模板,{%ListGrid%} 和{%Page%}分别显示表格中的数据

和翻页链接。

图 3-48 程序的主窗口对应的 html模板

我们实现的思路是这样的: TIWDBGrid控件 ListGrid是一个表格控件,我们定义它的列为 1(双击 columus属性,在出现的

对话框中新建一个列),行为 5(rowlimit 属性设定为 5,这也就定义了每页的记录数为 5,当然也可以改为别的大于 0的整数),我们将采用皮肤技术,在每一个表格的 sell(格子)中导入图 3-49中皮肤模板的 html代码,并用数据库中的数据替换其中的特定标记(这里每个都用了一对中括号),这样可以保证表格的每一个 cell中可以显示任意复杂的子表格。

图 3-49 皮肤模板

1、请修改 IWServerController内 TemplateDir属性为“templates\1\”,因为程序模板文件不在默认目录下,所以要指定。

2、表格的数据我们在 ListGrid的 onRenderCell事件中完成(表格控件填写每一个格子时执行该事件),完整代码如下: procedure TIWFormbasetable.ListGridRenderCell(ACell: TIWGridCell; const ARow, AColumn: Integer); var Temp: TStringList;//用来导入皮肤模板 html的工具 Memo, strtemp: string; i: Integer; begin Temp := TStringList.Create;//初始化,记得用完要释放 strtemp := ''; try if ListGrid.DataSource.DataSet.IsEmpty then//如果表格控件数据源中的数据集为空则退出 exit; if (AColumn = 0) and (ARow > 0) then//如果当前格子是第一列,且表格的行数大于 0 begin with ListGrid.DataSource.DataSet do begin//开始操作表格控件数据源中的数据集 Temp.Clear; Temp.LoadFromFile(WebApplication.ApplicationPath + '\files\Skin\' + GSkin +

Page 98: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.10 用自己的代码实现表格翻页控件 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 98页/共 376页

'\Listbasetable.Html');//导入皮肤模板的 html代码 if Length(FieldByname('jianjie').AsString) >= 250 then//将长的简介字段截断到 250个字符并将其保存在Memo变量中 Memo := Copy(FieldByname('jianjie').AsString, 0, 250) + '....' else Memo := FieldByname('jianjie').AsString; if Memo = '' then Memo := '没有简介,请点击标题查看详细内容。'; Temp.Text := StringReplace(Temp.Text, '[typeid2]', GetLinkString('1', FieldByname('typeid2').AsString, FieldByname('typeid2').AsString, '查找该分类 '), [rfReplaceAll]); // StringReplace函数在 sysutils中,大家应该都会用,在第一个参数中查找到第二个参数后用第三个参数替换掉。GetLinkString(Row, ID: string; Link: string; title: string = ''; Cof: string = ''; GridName: string = 'ComGrid'): string; 也是我们编写的一个函数,生成一个超级链接,它给服务器传递的参是 ID,在网页上显示的链接文字是 Link,当鼠标移动到链接上显示的提示信息为 title,默认为空,即没有提示信息,点击后弹出确认对话框的内容为 Cof,默认为空,即没有确认对话框,服务器上响应该链接的控件为GridName,默认为 ComGrid,本例中就有一个 ComGrid 控件,Row 即指 GridName 的第几行,从 0开始,依次对应 GridName的第 1、2、3、…的 onclick事件,该事件的 avalue参数将接收该链接所提交的 ID 值。此处替换类别[typeid2],对应 ComGrid 的第 2 行的 onclick 事件,传递的参数是FieldByname('typeid2').AsString,显示的链接字符为 FieldByname('typeid2').AsString,当鼠标移动到链接上显示的提示信息为“查找该分类” Temp.Text := StringReplace(Temp.Text, '[title]', GetLinkString('2', FieldByname('recordid').AsString, FieldByname('title').AsString, '查看详细内容'), [rfReplaceAll]); 此处替换标题[title],对应 ComGrid的第 3行的 onclick事件,传递的参数是 FieldByname('recordid').AsString,显示的链接字符为 FieldByname('title').AsString,当鼠标移动到链接上显示的提示信息为“查看详细内容” if (GY.DeEncrypt_text(FieldByname('updatename').AsString, UserSession.mm) = UserSession.UserLoginName) or (UserSession.Userrole = 'admin') or (UserSession.Userrole = 'power_user') then//如果上传者是当前的登录者 UserLoginName 或者是管理员 admin或者是权力用户 power_user 才执行如下操作,以确定是否显示删除,修改和增加按钮 begin Temp.Text := StringReplace(Temp.Text, '[ 删 除 ]', GetLinkString('3', FieldByname('recordid').AsString, '删除', '删除该条信息', '确认要删除吗?'), [rfReplaceAll]); 此处替换[删除],对应 ComGrid的第 4行的 onclick事件,传递的参数是 FieldByname('recordid').AsString,显示的链接字符为“删除”,当鼠标移动到链接上显示的提示信息为“删除该条信息”,点击时有确认对话

框,显示内容是“确认要删除吗?”。以下两句类似。 Temp.Text := StringReplace(Temp.Text, '[ 修 改 ]', GetLinkString('4', FieldByname('recordid').AsString, '修改', '修改该条信息', '确认要修改吗?'), [rfReplaceAll]); Temp.Text := StringReplace(Temp.Text, '[ 增 加 ]', GetLinkString('6', FieldByname('recordid').AsString, '增加', '增加一条信息', '确认要增加吗?'), [rfReplaceAll]); end else//不显示权限链接 begin Temp.Text := StringReplace(Temp.Text, '[删除]', '', [rfReplaceAll]); Temp.Text := StringReplace(Temp.Text, '[修改]', '', [rfReplaceAll]); Temp.Text := StringReplace(Temp.Text, '[增加]', '', [rfReplaceAll]);

Page 99: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.10 用自己的代码实现表格翻页控件 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 99页/共 376页

end; Temp.Text := StringReplace(Temp.Text, '[updatename]', GetLinkString('5', FieldByname('updatename').AsString, GY.DeEncrypt_text(FieldByname('updatename').AsString, UserSession.mm), '查看上传者详细信息'), [rfReplaceAll]); 此处替换上传者[updatename],对应 ComGrid的第 6 行的 onclick 事件,传递的参数是 FieldByname('updatename').AsString,显示的链接字符为GY.DeEncrypt_text(FieldByname('updatename').AsString, UserSession.mm),当鼠标移动到链接上显示的提示信息为“查看上传者详细信息” Temp.Text := StringReplace(Temp.Text, '[dateandtime]', FieldByname('dateandtime').AsString, [rfReplaceAll]); for i := 1 to FieldByname('levels').Value do//显示 levels个星星 begin strtemp := strtemp + '★'; end; Temp.Text := StringReplace(Temp.Text, '[levels]', strtemp, [rfReplaceAll]); strtemp := ''; Temp.Text := StringReplace(Temp.Text, '[downloadhits]', FieldByname('downloadhits').AsString, [rfReplaceAll]); //显示下载数 Temp.Text := StringReplace(Temp.Text, '[lookhits]', FieldByname('lookhits').AsString, [rfReplaceAll]); //显示点击数 Temp.Text := StringReplace(Temp.Text, '[评论]', '评论+' + FieldByname('lookafters').AsString, [rfReplaceAll]); //显示评论 Temp.Text := StringReplace(Temp.Text, '[jianjie]', Memo, [rfReplaceAll]); //显示相关简介 ACell.Text := Temp.Text;//将组装完毕的代码赋给表格的格子 ACell.Text end; end; except ACell.Text := Temp.Text; end; Temp.Free; end;

3、翻页控件的 html 代码我们放在 Page.Text 中。在每一次显示页面时就执行 onFormRender事件(这里要注意,我们每一次显示完页面后就关闭了数据集控件 List,所以每一次显示页面时都要再重新打开数据集): procedure TIWFormbasetable.IWAppFormRender(Sender: TObject); begin if Pos('basetable', UserSession.List.SQL.Text) = 0 then// List是一个数据集控件,我们显示的就是它里面的数据。这里判断其 SQL 代码中是否有 basetable 字符,如果有则直接打开就行,如果没有,则执行以下代码(查询 basetable中的所有数据): UserSession.List.SQL.Text := 'select * from basetable order by dateandtime DESC'; UserSession.List.Open;//打开数据集 UserSession.List.First; UserSession.List.MoveBy(UserSession.RecNumble);//跳到指定的记录

Page 100: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.10 用自己的代码实现表格翻页控件 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 100页/共 376页

ListGrid.DataSource := UserSession.ListSource;//用代码指定表格控件 ListGrid的数据源,其使用的数据集为 List Page.Text := GetToolStr(ListGrid.DataSource.DataSet.RecNo, ListGrid.DataSource.DataSet.RecordCount, ListGrid.RowLimit, 0, 6, '条记录');//显示翻页控件,此函数后面有详细介绍。图 3-50为翻页控件效果图

图 3-50 翻页控件效果图 end;

4、翻页控件的 html代码实现函数 function GetToolStr(RecNo, RecordCount, RowLimit: Integer; GridID: Integer; Nums: Integer = 10; Captions: string = '条记录'; Grid: string = 'ComGrid'): string;各个参数的意义如下:RecNo为当前数据集的当前记录数, RecordCount为当前数据集的记录总数,RowLimit 为每页显示的记录数,GridID 为翻页控件的链接对应的服务器端响应 ComGrid 对应的行数,Nums每页显示多少页面数字,最好为偶数,默认为 10个数字, Captions为统计时的字符提示例如 :共 144条记录 每页 4条记录 共 36页,默认为条记录,Grid为翻页控件的链接对应的服务器端响应控件名,默认为 ComGrid。 function GetToolStr(RecNo, RecordCount, RowLimit: Integer; GridID: Integer; Nums: Integer = 10; Captions: string = '条记录'; Grid: string = 'ComGrid'): string; var P: real; n, n1, n2, P1, P2: Integer; S: string; begin P := RecNo / RowLimit; P1 := Trunc(P); if Frac(P) > 0 then Inc(P1); P := RecordCount / RowLimit; P2 := Trunc(P); if Frac(P) > 0 then Inc(P2); Result := '&nbsp;&nbsp;'; if P1 > 1 then//当前页数大于 1的话,则显示首页和上一页的链接 begin Result := Result + GetLinkStringEx(GridID, '0_1', '<font face="Webdings" title="首页">9</font>', '', Grid) + GetLinkStringEx(GridID, '0_2', '<font face="Webdings" title="上一页">7</font>', '', Grid) + '%S'; end else//当前页数=1的话,则不显示首页和上一页的链接 begin Result := Result + '<font face="Webdings" color=gray title="首页">9</font>' + '<font face="Webdings" color=gray title="上一页">7</font>%S'; end; if P1 <> P2 then//如果当前页数不等于总页数,是显示尾页和下一页的链接 begin Result := Result + GetLinkStringEx(GridID, '0_3', '<font face="Webdings" title="下一页">8</font>', '', Grid) + GetLinkStringEx(GridID, '0_4', '<font face="Webdings" title="尾页">:</font>', '', Grid); end else//如果当前页数等于总页数,是不显示尾页和下一页的链接

Page 101: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.10 用自己的代码实现表格翻页控件 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 101页/共 376页

begin Result := Result + '<font face="Webdings" color=gray title="下一页">8</font>' + '<font face="Webdings" color=gray title="尾页">:</font>'; end;//以下显示中间的数字链接 Nums := Trunc(Nums / 2); n1 := P1 - Nums; if n1 < 1 then n1 := 1; n2 := P1 + Nums + ABS(P1 - Nums - n1) - 1; if n2 > P2 then n2 := P2; S := '&nbsp;'; for n := n1 to n2 do begin if n = P1 then S := S + Format('<font color=red><b>%D</b></font>&nbsp;', [n]) else S := S + GetLinkStringEx(GridID, '1_' + inttostr(n), inttostr(n), '', Grid) + '&nbsp;'; end; Result := Format(Result, [S]); Result := Result + '去<input id=page name="textfield" type="text" size="3">页' + '<a href="#none" onclick="ss=''0_1_''+page.value;return SubmitClickConfirm(''ComGrid'',ss, true, '''');">&nbsp;Go</a>' + Format('&nbsp;&nbsp;共<b>%D</b>' + Captions + ' 每页<b>%D</b>' + Captions + ' 共<b>%D</b>页&nbsp;&nbsp;', [RecordCount, RowLimit, P2]); end; 以上代码调用了如下函数: function GetLinkStringEx(Row: Integer; ID, Link: string; Cof: string = ''; GridName: string = 'ComGrid'): string; begin Result := Format('<a href="#none" onclick="return SubmitClickConfirm(''%S'',''%D_%S'', true, ''%S'');">%S</a>', [GridName, Row, ID, Cof, Link]); end; //GetLinkString('0',t,temp,cof,ComGrid) 0 是对应的 ComGrid 的 0 行的 ComGridColumns0Click 命令, temp超级连接的内容,t为向服务器传递的数据,cof为确认对话框内容,ComGrid为窗口内的 ComGrid控件名

5、当点击翻页控件的链接后会执行如下代码: procedure TIWFormbasetable.ComGridColumns0Click(ASender: TObject; const AValue: string); //页面导航条的链接 begin SetPage(ListGrid, AValue, UserSession.RecNumble);//主要用来修改 UserSession.RecNumble的值,以确定要显示的当前记录。 ListGrid 为表格控件, Avalue 翻页控件的链接向服务器传递的数据,UserSession.RecNumble指明数据集当前记录为第几条记录,在每次页面显示完后会被记录,在如下事件中完成。 procedure TIWFormbasetable.IWAppFormAfterRender(Sender: TObject); //页面输出完毕后关闭数据集 begin UserSession.RecNumble := UserSession.List.RecNo; //记录当前记录号,当页面只刷新时可以保持不变

Page 102: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.10 用自己的代码实现表格翻页控件 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 102页/共 376页

UserSession.List.close;//关闭表格控件所使用的数据集,节约服务器系统资源 end; end; 以下函数的作用是:根据当前记录号 RecNumble和翻页控件传递的页数数据计算应该跳转到指定的页的当前记录数,并把此值赋给 UserSession.RecNumble。 procedure SetPage(Grid: TIWDBGrid; AValue: string; RecNumble: Integer); var n1, n2: Integer; begin try n1 := Strtoint(Copy(AValue, 1, 1)); if Copy(AValue, 3, 20) = '' then begin n2 := 1; WebApplication.ShowMessage('填写正确的页码!'); end else n2 := Strtoint(Copy(AValue, 3, 20)); except Exit; end; case n1 of 0: begin case n2 of 1: begin UserSession.RecNumble:=0;end; 2: begin UserSession.RecNumble:=RecNumble-Grid.RowLimit;end; 3: begin UserSession.RecNumble:=RecNumble+Grid.RowLimit;end; 4: begin UserSession.RecNumble:=999999999; end; end; end; 1: begin if n2 < 1 then n2 := 1; //if Grid.DataSource.DataSet.RecordCount = 0 then Exit; G := inttostr((n2 - 1) * Grid.RowLimit + 1); //Grid.DataSource.DataSet.RecNo := (n2 - 1) * Grid.RowLimit + 1; UserSession.RecNumble:=(n2 - 1) * Grid.RowLimit + 1; end; end; end;

总结:程序执行过程是这样的: (1)每次页面显示时,先执行 TIWFormbasetable.IWAppFormRender(Sender: TObject)事件,打开数

据集,并根据 UserSession.RecNumble(改变此值就会改变页数)这个当前记录号定位页数并调用以下函数 显 示 翻 页 控 件 Page.Text := GetToolStr(ListGrid.DataSource.DataSet.RecNo, ListGrid.DataSource.DataSet.RecordCount, ListGrid.RowLimit, 0, 6, ' 条 记 录 ') , 再 执 行

Page 103: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.10 用自己的代码实现表格翻页控件 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 103页/共 376页

TIWFormbasetable.IWAppFormAfterRender(Sender: TObject)事件,记录当前记录号并关闭数据集。 (2)当点击翻页控件的链接后会执行 TIWFormbasetable.ComGridColumns0Click(ASender: TObject;

const AValue: string)事件来调用 SetPage(Grid: TIWDBGrid; AValue: string; RecNumble: Integer)函数,以改变 UserSession.RecNumble值,再执行(1)中的过程就实现了翻页。

Page 104: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.11 窗口切换详解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 104页/共 376页

3.11 窗口切换详解 Intraweb 的窗口管理基本上可以这样理解。生成窗口时会执行 onCreate 事件,这和 windows

下的编程是一样的。每次显示该窗口时会先后执行 onRender和 onAfterRender事件(窗口的几个事件是这样的:首先执行 onCreate事件,如果窗口不 release或者 free,此事件不会再执行,然后执行onRender事件,在窗口每次显示前执行,执行结果可以立即显示到页面上,最后执行 onAfterRender事件,担它的执行结果不能在本次页面上体现出来。onDestroy事件是当窗口执行 release时引发的,相当于以前的 onclose 事件,但在执行 free 时,不会引发该事件)。生成的所有窗口可以理解成为一叠纸张,IE 每次只能显示最上面的那张纸。怎么样才能让一个窗口跑到最上面呢(即把已经存在的一张纸抽出来放在最上面)?有下面 3种方法:1、窗口生成之后直接调用其 show过程,2、将窗口设置成为程序的 ActiveForm,3、如果要显示的窗口在从上到下的第二的位置,可以调用最上面窗口的 hide过程(相当于抽走这张纸),这样位于第二的窗口将自然出现。采用以上方法,窗口上的所有被用户更改的状态在该窗口下次显示时还保持不变(除非在 onRende事件中更改了)。

所有源代码在文件夹 3.11中。先看一下运行效果:

图 3-51 程序运行界面 1

图 3-52 程序运行界面 2

Page 105: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.11 窗口切换详解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 105页/共 376页

图 3-53 程序运行界面 3

在图 3-51中,当窗口生成时执行了如下事件: procedure TIWForm1.IWAppFormCreate(Sender: TObject); begin IWEdit1.Text:='我已经执行了 TIWForm1.IWAppFormCreate(Sender: TObject);'; end;

由于窗口生成后始终存在,所以不会执行第二次,当你更改了 IWEdit1 中的值后当从别的页面再次显示本页面时,IWEdit1中的值会是我们刚刚输入的值。 procedure TIWForm1.IWAppFormRender(Sender: TObject); begin IWEdit2.Text:='我已经执行了 TIWForm1.IWAppFormRender(Sender: TObject);'; end;

以上事件相当于 windows下的编程的 onshow 事件,每次页面显示时都会执行的。所以我们在IWEdit2中输入的值当从别的页面再次显示本页面时不保持不了的。始终是程序给它赋值。

第一种直接的方法: 打开页面的代码如下:

procedure TIWForm1.IWButton1Click(Sender: TObject);//这是显示窗口 2:IWForm2 begin //切换窗口的方法一:看看是否已经生成了该窗口,没有则生成并显示,有则直接显示 if (WebApplication.FindComponent('IWForm2') as TIWContainer)=nil then TIWForm2.Create(WebApplication).Show//1、窗口生成之后调用其 show过程直接显示 else WebApplication.SetActiveForm(WebApplication.FindComponent('IWForm2') as TIWContainer);// 2、将窗口设置成为程序的 ActiveForm end;

隐藏当前窗口的代码如下: procedure TIWForm1.IWButton4Click(Sender: TObject); begin//3、如果要显示的窗口在从上到下的第二的位置,可以调用最上面窗口的 hide过程(相当于抽走这张纸),这样位于第二的窗口将自然出现

Page 106: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.11 窗口切换详解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 106页/共 376页

self.Hide;//隐藏当前窗口,前一个窗口自然出现(只要前一个窗口没有 free掉),但当这是最后一个被隐藏的窗口时,程序将会结束。 end;

使用第一种方法的注意事项: 在当前窗口中一定要引用将要显示的窗口的单元。 第二种通用的方法: 请看文件夹 3.11\使用通用函数显示窗口中的源代码。

我们在 UserSessionUnit中定义了两个函数: procedure TIWUserSession.FreeShowForm(AFormName: string); type TIWFormClass = class of TIWForm; //记得要在 uses中加入 IWForm,否则会提示 TIWForm没有定义 begin TIWAppForm(WebApplication.ActiveForm).Free;//free当前窗口 TIWFormClass(FindClass('T' + AFormName)).Create(WebApplication).show;//生成并显示目标窗口 end; procedure TIWUserSession.ShowForm(AFormName: string); type TIWFormClass = class of TIWForm; begin if (WebApplication.FindComponent(AFormName) as TIWContainer)=nil then //没有生成过目标窗口发,记得要在 uses中加入 IWContainer,否则会提示 TIWContainer没有定义 TIWFormClass(FindClass('T' + AFormName)).Create(WebApplication).show//生成并显示目标窗口 else//生成过目标窗口 WebApplication.SetActiveForm(WebApplication.FindComponent(AFormName) as TIWContainer);//将目标窗口设定为当前窗口 end;

打开页面的代码如下: procedure TIWForm1.IWButton2Click(Sender: TObject); begin

UserSession.ShowForm('IWForm3');//显示窗口 3,且不用引用窗口 3 的单元。这样就变得相当简洁了。

//UserSession. FreeShowForm('IWForm3');// free当前窗口,再显示窗口 3 end;

使用第二种方法的注意事项: 在所有窗口的单元文件的最后一个 end 前一定要注册该类,否则显示窗口时会显示找不到某某

类。代码类似如下。函数中的参数是窗口名前加个 T字符。切记一定要手动加入,不会自动生成的。 initialization RegisterClass(TIWForm2);

Page 107: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.12 窗口之间数据参数传递详解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 107页/共 376页

3.12 窗口之间数据参数传递详解 Intraweb的窗口之间的数据参数的传递有以下两种简便的方法。 1、在 UserSession中定义公共变量,所有窗口都可以调用和修改 UserSession的变量。这样,

窗口 1要传递一个参数给窗口 2,它可以修改该参数,窗口 2可以直接调用已经修改好的参数,如果该参数的值只使用一次,窗口 2使用完成后便可对该参数再次赋值。只要记住 UserSession中的变量是所有窗口共用的就行了。

2、可以设定 WebApplication.RunParams,同样,所有窗口也可调用和修改 RunParams 中的值。

我们提供的例子是这样的:我们可以直接在 IE中输入 http://127.0.0.1:866/查看首页。这时首页中的输入框是空白的。我们输入姓名刘文昌和职业特警(如 3-53所示)后点击提交按钮,输入的值被传递到 UserSession中的 xingming和 zhiwu变量。在窗口 2显示时将其值显示到了我的简历框里,如图 3-54所示。

图 3-53 程序运行界面 1

图 3-54 程序运行界面 2

在点击打开页面 3时,我们更改了 RunParams中的值(canshu1=胡英&canshu2=老师),在窗口3中将显示我们出参数 1和参数 2的值,如图 3-55所示。

Page 108: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.12 窗口之间数据参数传递详解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 108页/共 376页

图 3-55 程序运行界面 3

RunParams中的值是全局的,我们再点击打开页面 1按钮时,首页也会显示这两个参数的值,

如图 3-56所示。

图 3-56 程序运行界面 4

如果在 IE直接输入以下地址:“http://127.0.0.1:866/?canshu1=高勇&canshu2=工程师”(格式为

问号加参数名加等号加参数值,如果有多个参数,中间用英文&连接),首页将会采集这两个参数的值并显示出来,如图 3-57所示。这种应用方式的好处是可以根据不同的参数显示不同的页面内容。

图 3-57 程序运行界面 4

所有源代码在文件夹 3.12中。

Page 109: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.12 窗口之间数据参数传递详解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 109页/共 376页

关键代码讲解: 点击提交按钮后执行如下代码:

procedure TIWForm1.IWButton1Click(Sender: TObject); begin //以下判断输入不要为空,如果为空则给出相应的提示信息 if IWEdit1.Text='' then begin self.WebApplication.ShowMessage('请填写姓名!'); exit; end; if IWEdit2.Text='' then begin self.WebApplication.ShowMessage('请填写职务!'); exit; end; //给在 UserSession中定义的两个参数赋值,一个是姓名,一个是职务 UserSession.xingming:=IWEdit1.Text; UserSession.zhiwu:=IWEdit2.Text; UserSession.ShowForm('IWForm2');//打开页面 2(这种方法已经在窗口切换详解这一节中讲解过了) end;

在首页显示时提取 RunParams的参数值如图 3-56所示: procedure TIWForm1.IWAppFormRender(Sender: TObject); begin IWEdit1.Text:=WebApplication.RunParams.Values['canshu1'];//提取名为 canshu1变量的值 IWEdit2.Text:=WebApplication.RunParams.Values['canshu2'];//提取名为 canshu2变量的值 end;

页面 2显示由窗口 1传递的参数如图 3-54所示: procedure TIWForm2.IWAppFormRender(Sender: TObject); begin if (UserSession.xingming<>'') and (UserSession.zhiwu<>'') then IWMemo1.Text:='姓名:'+UserSession.xingming+#13+'职务:'+UserSession.zhiwu; end;

点击打开页面 3的按钮将会在更新 RunParams的值后打开页面 3,页面 3将会在显示时提取RunParams参数值并显示出来,如图 3-55所示: procedure TIWForm2.IWButton2Click(Sender: TObject); begin self.WebApplication.RunParams.Clear;//先清空所有变量 self.WebApplication.RunParams.Add('canshu1=胡英'); //增加一个参数,名称为 canshu1,值为胡英 self.WebApplication.RunParams.Add('canshu2=老师'); //增加一个参数,名称为 canshu2,值为老师 self.WebApplication.RunParams.BeginUpdate; ;//将更改第生效 UserSession.ShowForm('IWForm3');//显示页面 3

Page 110: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.12 窗口之间数据参数传递详解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 110页/共 376页

end; 在页面 3显示时提取 RunParams的参数值的代码:

procedure TIWForm3.IWAppFormRender(Sender: TObject); begin IWEdit1.Text:=WebApplication.RunParams.Values['canshu1'];//提取名为 canshu1变量的值 IWEdit2.Text:=WebApplication.RunParams.Values['canshu2'];//提取名为 canshu2变量的值 end;

当然传递参数的方法还不止这两种,但这两种是最简单且最安全的方法。页面显示完成后在网

页中点击查看源代码是看不到这些参数值的,其中 RunParams的参数也不在地址栏中显示。ASP和PHP那可是都要在地址栏中显示哟,这样就会有不安全的因素。

总的来说,这两种方法建立的变量都是全局变量,各个页面都可以调用或修改它们,这确实是

很灵活的。每个 Session建立的这些变量都独立的,大可放心使用,不要担心你我他在不同的机器上访问同一程序时各自的变量会打架。

Page 111: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.13 使用 Cookies在客户端保存数据 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 111页/共 376页

3.13 使用 Cookies在客户端保存数据 某些常用的输入,让 IE自己记住这也许是一件好事。例如,要输入的用户名,已登录状态等等。

用 Intraweb操作 Cookies(可以简单的认为是一种保存在客户端的临时数据)便可轻松实现。 所有源代码在文件夹 3.13中。 如图 3-57所示为程序运行界面。

图 3-57 程序运行界面 1

当输入姓名和职务后,如果选择了让 IE记住输入信息并填写有效期后,点击提交将会在客户端

创建一个 Cookies并将数据保存在其中,下次再次打开相同的页面时,上次输入的姓名和职务将会自动出现在输入框中。

创建 Cookie的代码如下: procedure TIWForm1.IWButton1Click(Sender: TObject); var Cookies1: TstringList; youxiaoqi: integer; //定义一个 Cookies和一个表示有效期的变量 begin if IWEdit1.Text = '' then //判断姓名和职务是否为空 begin self.WebApplication.ShowMessage('请填写姓名!'); exit; end; if IWEdit2.Text = '' then begin self.WebApplication.ShowMessage('请填写职务!'); exit; end; if IWCheckBox1.Checked then //保存输入信息 begin try //判断有效期的合法性 youxiaoqi := strtoint(IWEdit3.Text); except self.WebApplication.ShowMessage('请填写有效期,它是一个自然数!'); exit;

Page 112: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.13 使用 Cookies在客户端保存数据 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 112页/共 376页

end; try Cookies1 := TstringList.create;//创建自己 Cookies1.Add('CookieName1=' + IWEdit1.Text);//增加一行,格式为参数名加等号加参数值 Cookies1.Add('CookieName2=' + IWEdit2.Text);//再增加一个参数,保存职务 WebApplication.Response.SetCookieField( Cookies1, // 要设置的 Cookies '', //发送到 Cookies的域名,如果为空的话,则使用当前的 '', //发送到 Cookies的路径,如果为空的话,则使用任意路径 Now + youxiaoqi,//Cookies的有效期 False//是否使用加密的连接 ); self.WebApplication.ShowMessage('如果 IE允许使用 Cookies,则 IE记住姓名成功,下次打开该网页时上次输入的姓名将会自动出现。'); finally Cookies1.free;//自己创建的对象自己记得要释放 end; end; self.WebApplication.ShowMessage('你输入的信息为姓名:'+IWEdit1.Text+'职务:'+IWEdit2.Text); end;

再次打开页面时,如图 3-58 所示:

图 3-58 程序运行界面 2

读取 Cookies的代码如下: procedure TIWForm1.IWAppFormCreate(Sender: TObject);//当窗口生成时执行 begin if WebApplication.request.cookieFields.values['CookieName1'] <> '' then// CookieName1 为Cookie中的一个参数名称,如果该参数的值不为空,我们将其取出赋给 IWEdit1.Text IWEdit1.Text := WebApplication.request.cookieFields.values['CookieName1']; if WebApplication.request.cookieFields.values['CookieName2'] <> '' then IWEdit2.Text := WebApplication.request.cookieFields.values['CookieName2']; end; 注意:Cookie所保存的数据好像不支持中文,大家可以试试。英语和数字是没有问题的。有一种变通的方法,那就是将要保存的数据加密为英文字串,读取时解密就行了。这样保存在客户端的数据还比

较安全。

Page 113: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.14 让 IE的后退按钮重新发挥作用 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 113页/共 376页

3.14 让 IE的后退按钮重新发挥作用 用 Intraweb编写的程序在默认情况下,IE的后退按钮是没有作用的。这个目的也很明确,如果

我们在窗口的生成和显示事件中写了一些只要执行一次的代码,如果允许后退的话将会给程序的逻辑

造成混乱,但有时,我们也需要让 IE的后退按钮重新发挥作用,使用户的使用习惯符合惯例,这就要求我们编程时要注意避免逻辑上的混乱。总的来说,用 Intraweb可以禁用后退按钮,这样方便于我们编写WEB应用程序(就像在单机上运行的 windows程序一样),只是不用发布客户端,客户端就是 IE,所以这是 ntrweb的一大优点,同时也可以让 IE的后退按钮重新发挥作用,下面我们用一个例子来进行讲解。

所有源代码在文件夹 3.14中。 如图 3-58所示为程序运行界面。

图 3-59 运行界面

本例中网页中的按钮响应代码已经在窗口切换详解中讲解过了。这里关键只讲后退按钮的实现。 上图中,大家可看到,后退按钮的下拉列表,点击任意项即可后退到相应页面。实现方法其实

很简单,大家注意以下两点就行了: 1、在所有窗口的单元文件的最后一个 end前一定要注册该类,否则显示窗口时会显示找不到某

某类。代码类似如下。函数中的参数是窗口名前加个 T字符。切记一定要手动加入,不会自动生成的。 initialization RegisterClass(TIWForm2); 2、在 ServerController的 onBackButton事件中加入以下代码:

procedure TIWServerController.IWServerControllerBaseBackButton( ASubmittedSequence, ACurrentSequence: Integer; AFormName: string; var VHandled, VExecute: Boolean); const DefaultFormName = 'IWForm1';//定义首页窗口的 name,此处首页窗口名为 IWForm1,这是我们针对具体的项目要修改的地方,以下代码通用。 type

Page 114: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.14 让 IE的后退按钮重新发挥作用 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 114页/共 376页

TIWFormClass = class of TIWForm;//记得要在 uses中加入 IWForm,否则会提示 TIWForm没有定义 begin VHandled := True; VExecute := True; if AFormName = '' then// AformName是后退按钮保存的访问过的页面窗口名称 AFormName := DefaultFormName; if WebApplication.FindComponent(AFormName) <> nil then//如果找到该窗口则直接显示该窗口 begin WebApplication.SetActiveForm(WebApplication.FindComponent(AFormName) as TIWContainer); //记得要在 uses中加入 IWContainer,否则会提示 TIWContainer没有定义 end else//如果没有找到该窗则生成并显示出来 begin try WebApplication.SetActiveForm(TIWFormClass(FindClass('T'+ AFormName) ).Create(WebApplication)); //如果没有找到该窗则生成并显示出来 except VHandled := False; end; end; end;

以上方法是不是很简单呢,多说无意,就此打住。当然还有一种更简单的方法,不得不说一下,

那就是如果你的 intraweb版本的ServerController单元窗口属性中有HistoryEnabled的话,设置成 true就行了。不必用本节前面所讲述的方法,是不是更简单呢?但仔细对比一下,还是有点差别的。不说

了。

Page 115: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.15 用 Frame来实现各页面的公共菜单 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 115页/共 376页

3.15 用 Frame来实现各页面的公共菜单 用 Intraweb编写程序时,怎样实现一个漂亮的菜单条,而且不用在每个窗口都写相同的代码,

如图 3-60所示那样。前面有一节说过用继承的方法来实现,但这一节我们用 Frame来实现。 所有源代码在文件夹 3.15中。

图 3-60 漂亮的菜单条

大家打开程序源代码可以看到,窗口 1和窗口 2很普通,窗口 1是建立 intraweb程序就会自动生成,窗口 2是在 new items对话框中的 VCLfor the Web选项卡中选择 new form后生成的。有点特殊的是 IWFrame3,它是 VCLfor the Web选项卡中选择 new frame后生成的(记住只能这样生成,只要是 intraweb的窗口都要从这里开始)。如图 3-61所示。点击 ok后出现的对话框选择默认即可。

图 3-61 新建一个 frame

图 3-62是新建成的 IWFrame3,当然此名称可以在 name属性任意一更改,但请一次性改好,

当它注册到面板被引用后再改就麻烦了。下图显示出了其中的控件。一个菜单 IWMenu1,两个超级链接 IWLink1和 IWLink2。还有一点要记住,IWFrameRegion.ClipRegion的属性一定要设定这 false,这样,菜单下拉时就不会在其内部展开。大家不明白的话可以改变这个属性试试运行效果便知道了。

图 3-62 frame中控件

在此窗口中,请在 implementation后加入:“uses IWInit, ServerController,UserSessionUnit;”,

Page 116: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.15 用 Frame来实现各页面的公共菜单 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 116页/共 376页

切记。打开页面的链接的方法已经在窗口的切换详解这一节讲过了。 在上图中点击右键,点击 add to pallete,出现图 3-63。点击 OK即可。

图 3-63 注册 frame对话框

接下来请在 Templates组件面板中找到我们刚刚注册的控件,直接拖入窗口 1和窗口 2中。这样这两个窗口都有菜单条了,如图 3-64所示。

图 3-64 窗口 1中加入菜单条

在所有窗口的单元文件的最后一个 end 前一定要注册该类,否则显示窗口时会显示找不到某某

类。代码类似如下。函数中的参数是窗口名前加个 T字符。切记一定要手动加入,不会自动生成的。 initialization RegisterClass(TIWForm2); 程序运行时如图 3-65所示。没有采用模板,所有不是很漂亮。但还有一个更重要的原因,那就

是 Intraweb自带的菜单控件确实不怎么漂亮,远不如 TMS组件的。如果你安装的 TMS,请在文件夹

3.15\TMS版本中查看其源代码,主要看看 MainMenu1.pas就行了,其它的不用详究。它采用模板后运行的效果如图 3-60所示。

图 3-65 程序运行时的界面

Page 117: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.16 用 realone插件来播放声音(视频) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 117页/共 376页

3.16 用 realone插件来播放声音(视频) 曾用 Intraweb 编写过一个英语听力学习站点,这其中要求能够在网页中播放 rm 格式的声音文

件,而 Intraweb中又没有能够调用它的控件,最后只好采用模板来实现了,大家只要按照我讲的步骤保证很简单。

所有源代码在文件夹 3.16 中。图 3-66 为程序运行界面,点击小喇叭后会出现一个播放器的工具条,同时播放声音。双击可以隐藏,并且可被鼠标拖动并定位。

图 3-66 程序运行界面

1、我们的宝贝是制作好模板:3.16\Templates\ IWindex.html。你可以给文件改名以适应不同的窗口,也可以修改网页模板的任何可视化元素,如表格,图片等,但请不要直接修改其源代码,特别

是其关于播放器的 javascript代码,否则有可能不能正常调用播放器播放声音。图 3-67为 IWindex.html的模板界面,我们在其中只放了一个 intraweb控件:IWRegionA。

图 3-67 IWindex.html模板界面

2、生成调用播放器播放声音的代码。我们借用 IWRectangle1控件输入 html代码。

procedure TIWindex.IWAppFormCreate(Sender: TObject); var luyinfile:string; begin UserSession.ADOQuerytemp.Close;//以下从数据库中取出文件名 UserSession.ADOQuerytemp.SQL.Clear;

Page 118: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.16 用 realone插件来播放声音(视频) 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 118页/共 376页

UserSession.ADOQuerytemp.SQL.Add('select * from Bsd where unit =''' + '116' + '''');//查询第一册 16单元的题目 UserSession.ADOQuerytemp.Open; if UserSession.ADOQuerytemp.RecordCount > 0 then//如果查询到记录 begin luyinfile := Trim(UserSession.ADOQuerytemp.FieldByname('luyin1').AsString);//取得要播放的录音文件名 if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\luyin\' + luyinfile) then//如果文件存在 IWRectangle1.Text := IWRectangle1.Text +' 第 一 题 : <span id="spanSpk1" language=javascript onClick="run(''' + 'files/luyin/' + luyinfile + ''')" ><a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音"></a></span>';//输出第一题的调用播放器的 html代码。录音文件存放在 files/luyin/目录下。点击小喇叭后会将播放器的工具条显示出来并播放声音。 luyinfile := Trim(UserSession.ADOQuerytemp.FieldByname('luyin2').AsString); //取得要播放的录音文件名 if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\luyin\' + luyinfile) then//如果文件存在 IWRectangle1.Text := IWRectangle1.Text +'<br> 第 二 题 : <span id="spanSpk1" language=javascript onClick="run(''' + 'files/luyin/' + luyinfile + ''')" ><a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音"></a></span>'; //输出第二题的调用播放器的 html代码。 ……//第 3,4,5题目很类似

end; UserSession.ADOQuerytemp.Close; end;

就这么简单,运行即可。但值得注意的是:切记我们所用的模板文件不可乱改动,那可是经过

我的 N多次修改才搞定的。使用起来简单的,当初做起来肯定是很复杂的(这叫越简单的越复杂)。 对了,我们的标题中不是还提到了一个视频吗?不要急,只要你上面的搞懂了,下面的播放视

频就很简单了。将 3.16\Templates\播放音视频文件的模板.html文件名更改为 IWindex.html即可,即让程序应用播放音视频文件的模板.html这个模板。图 3-68为应用视频模板后程序运行界面,如果播放的 rm文件是视频,则会有图像,如果没有,则只有声音。

图 3-68 应用视频模板后程序运行界面

这两个模板文件可是私人珍藏,以前在 ASP下用过,播放界面都是可以拖动,定位和隐藏的,没想到 intraweb下也用得这么好,功夫真是没有白费呀。就拿出来共享吧。

Page 119: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.17 IntraWeb利用 excel报表 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 119页/共 376页

3.17 IntraWeb利用 excel报表 在 3.2和 3.2这两节中,我们讨论了用 FastReport来制作报表。在实际工作中,我遇到了利用 excell

模板和 word模板进行报表的实际需求。前提是服务器上一定要安装 excell和 word。这一节中,我们讨论怎样通过 excell导出数据,以下是一个简单的演示。 思路如下: 1、首先使用 ComObj创建 Excel 对象。 2、添加新工作簿。 3、设置第 1个工作表为活动工作表,准备向这个表中写入数据。 4、将数据库中的适当数据赋值给 excell单元格。 5、工作表另存为WebApplication.ApplicationPath + 'files\' + WebApplication.AppID + '\temp.xls'

(记住,文件名只能为英文)。 6、关闭工作簿,并退出 excell。 7、生成打开 temp.xls的超级链接。 程序界运行面如图 3-69所示:

图 3-69程序运行界面(右边为在新窗口中打开 temp.xls)

下面我们就动手试一下。 像 2.1节所介绍的那样,新建一个 IntraWeb工程 RaveDemo.dpr。打开源代码自己看。(在文件夹

3.17中) 图 3-70是所有的控件布局情况。相信大家一看源代码就清楚了。很多地方都被注释掉了,那是对

excell进行各种控制的代码,如果需要,大家随时可以启用,每一句都有详细的功能说明。

图 3-70 程序控件布局

Page 120: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.17 IntraWeb利用 excel报表 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 120页/共 376页

1、unit ServerController的代码和 3.2的完全一样,大家请参考 3.2的相关说明。 2、以下为 Unit1的完整代码:切记,一定要 uses Comobj单位。 unit Unit1; interface uses Classes, SysUtils, IWAppForm, IWApplication, IWDBGrids, IWDBStdCtrls, IWCompText, IWVCLBaseControl, IWCompEdit,IWCompRectangle, DB, ADODB, IWGrids, Controls, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompButton; type TIWForm1 = class(TIWAppForm) IWDBGrid1: TIWDBGrid; IWDBNavigator1: TIWDBNavigator; IWButton2: TIWButton; RepQuerySource: TDataSource; RepQuery: TADOQuery; IWRectangle1: TIWRectangle; procedure IWAppFormCreate(Sender: TObject); procedure IWButton2Click(Sender: TObject); public end; implementation {$R *.dfm} uses ServerController, IWGlobal,Comobj; procedure TIWForm1.IWAppFormCreate(Sender: TObject); begin RepQuery.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +

WebApplication.ApplicationPath + 'files\data.mdb;Persist Security Info=False'; RepQuery.Open; end; procedure TIWForm1.IWButton2Click(Sender: TObject); var LFile: string; LURL: string; var ExcelApp: Variant; i,j:integer; begin

Page 121: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.17 IntraWeb利用 excel报表 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 121页/共 376页

//首先创建 Excel 对象,使用 ComObj: ExcelApp := CreateOleObject( 'Excel.Application' ); //1) 显示当前窗口: //ExcelApp.Visible := True; //2) 更改 Excel 标题栏: //ExcelApp.Caption := '应用程序调用 Microsoft Excel'; //3) 添加新工作簿: ExcelApp.WorkBooks.Add; //4) 打开已存在的工作簿: //ExcelApp.WorkBooks.Open( 'C:\temp.xls' ); //5) 设置第 1个工作表为活动工作表: ExcelApp.WorkSheets[1].Activate; //或 //ExcelApp.WorksSheets[ 'Sheet1' ].Activate; //6) 给单元格赋值: RepQuery.first; for i:=1 to RepQuery.RecordCount do //稍加改动可以增加表头 或填充模板实现精确报表 begin for j:=1 to RepQuery.FieldCount do ExcelApp.Cells[i,j].Value :=RepQuery.Fields.Fields[j-1].AsString; RepQuery.Next; end; //7) 设置指定列的宽度(单位:字符个数),以第一列为例: //ExcelApp.ActiveSheet.Columns[1].ColumnWidth := 5; //8) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例: //ExcelApp.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米 //9) 在第 8行之前插入分页符: //ExcelApp.WorkSheets[1].Rows[8].PageBreak := 1; //10) 在第 8列之前删除分页符: //ExcelApp.ActiveSheet.Columns[4].PageBreak := 0; //11) 指定边框线宽度: //ExcelApp.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3; //1-左 2-右 3-顶 4-底 5-斜( \ ) 6-斜( / ) //12) 清除第一行第四列单元格公式: //ExcelApp.ActiveSheet.Cells[1,4].ClearContents; //13) 设置第一行字体属性: //ExcelApp.ActiveSheet.Rows[1].Font.Name := '隶书'; //ExcelApp.ActiveSheet.Rows[1].Font.Color := clBlue; //ExcelApp.ActiveSheet.Rows[1].Font.Bold := True; //ExcelApp.ActiveSheet.Rows[1].Font.UnderLine := True; //另外下边这个是用来自动换行的 //sheet.Rows[i].WrapText := True; //14) 进行页面设置:

Page 122: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.17 IntraWeb利用 excel报表 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 122页/共 376页

//a.页眉: //ExcelApp.ActiveSheet.PageSetup.CenterHeader := '报表演示'; //b.页脚: //ExcelApp.ActiveSheet.PageSetup.CenterFooter := '第&P页'; //c.页眉到顶端边距 2cm: //ExcelApp.ActiveSheet.PageSetup.HeaderMargin := 2/0.035; //d.页脚到底端边距 3cm: //ExcelApp.ActiveSheet.PageSetup.HeaderMargin := 3/0.035; //e.顶边距 2cm: //ExcelApp.ActiveSheet.PageSetup.TopMargin := 2/0.035; //f.底边距 2cm: //ExcelApp.ActiveSheet.PageSetup.BottomMargin := 2/0.035; //g.左边距 2cm: //ExcelApp.ActiveSheet.PageSetup.LeftMargin := 2/0.035; //h.右边距 2cm: //ExcelApp.ActiveSheet.PageSetup.RightMargin := 2/0.035; //i.页面水平居中: //ExcelApp.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035; //j.页面垂直居中: //ExcelApp.ActiveSheet.PageSetup.CenterVertically := 2/0.035; //k.打印单元格网线: //ExcelApp.ActiveSheet.PageSetup.PrintGridLines := True; //15) 拷贝操作: //a.拷贝整个工作表: //ExcelApp.ActiveSheet.Used.Range.Copy; //b.拷贝指定区域: //ExcelApp.ActiveSheet.Range[ 'A1:E2' ].Copy; //c.从 A1位置开始粘贴: //ExcelApp.ActiveSheet.Range.[ 'A1' ].PasteSpecial; //d.从文件尾部开始粘贴: //ExcelApp.ActiveSheet.Range.PasteSpecial; //16) 插入一行或一列: //a. ExcelApp.ActiveSheet.Rows[2].Insert; //b. ExcelApp.ActiveSheet.Columns[1].Insert; //17) 删除一行或一列: //a. ExcelApp.ActiveSheet.Rows[2].Delete; //b. ExcelApp.ActiveSheet.Columns[1].Delete; //18) 打印预览工作表: //ExcelApp.ActiveSheet.PrintPreview; //19) 打印输出工作表: //ExcelApp.ActiveSheet.PrintOut; //20) 工作表保存: //if not ExcelApp.ActiveWorkBook.Saved then //ExcelApp.ActiveSheet.PrintPreview;

Page 123: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.17 IntraWeb利用 excel报表 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 123页/共 376页

//21) 工作表另存为: LFile := 'temp.xls'; sysutils.ForceDirectories(WebApplication.ApplicationPath + 'files\' + WebApplication.AppID +

'\'); ExcelApp.ActiveWorkbook.SaveAs( WebApplication.ApplicationPath + 'files\' +

WebApplication.AppID + '\' + LFile); //ExcelApp.ActiveWorkbook.SaveAs('C:\temp1.xls' ); //22) 存盘: //ExcelApp.ActiveWorkbook.Save; //23) 关闭工作簿: ExcelApp.WorkBooks.Close; //24) 退出 Excel: ExcelApp.Quit; LURL := WebApplication.AppURLBase + '/FilesNC/' + WebApplication.AppID + '/' + LFile; IWRectangle1.Text:='<a href="'+LURL+'" target="_blank">打开 xls报表 </a>';//在新窗口中打

开生成的 temp.xls文件 end; initialization TIWForm1.SetAsMainForm; end. 别看此程序简单,只要模板设计得好(打开模板对相应表格进行填充即可),可以报出任何复杂的

excell表格。

Page 124: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.18 IntraWeb利用 word报表 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 124页/共 376页

3.18 IntraWeb利用 word报表 在 3.2和 3.2这两节中,我们讨论了用 FastReport来制作报表。在实际工作中,我遇到了利用 excell

模板和 word模板进行报表的实际需求。前提是服务器上一定要安装 excell和 word。这一节中,我们讨论怎样通过 word导出数据,以下是一个简单的演示。 思路如下: 1、首先使用 ComObj创建 Excel 对象。 2、添加新工作簿。 3、设置第 1个工作表为活动工作表,准备向这个表中写入数据。 4、将数据库中的适当数据赋值给 excell单元格。 5、工作表另存为WebApplication.ApplicationPath + 'files\' + WebApplication.AppID + '\temp.xls'

(记住,文件名只能为英文)。 6、关闭工作簿,并退出 excell。 7、生成打开 temp.xls的超级链接。 程序界运行面如图 3-69所示:

图 3-69程序运行界面(右边为在新窗口中打开 temp.xls)

下面我们就动手试一下。 像 2.1节所介绍的那样,新建一个 IntraWeb工程 RaveDemo.dpr。打开源代码自己看。(在文件夹

3.17中) 图 3-70是所有的控件布局情况。相信大家一看源代码就清楚了。很多地方都被注释掉了,那是对

excell进行各种控制的代码,如果需要,大家随时可以启用,每一句都有详细的功能说明。

Page 125: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.19 IntraWeb怎样实现模式弹出窗口 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 125页/共 376页

3.19 IntraWeb怎样实现模式弹出窗口 在 intraweb中实现弹出式窗口,一直是一个比较难的问题。近日上网,从一些网友的代码中发现

了实现的一种方法,现将其方法简要的介绍如下。按照惯例,还是先看一下程序运行的结果吧。如图

3-69所示。单击主页面中的返回数据输入框或点击按钮,就会出现右边的对话框,在对话框中填写数据,点击确认按钮后就可以把数据传给主页面中的输入框内。

图 3-69程序运行界面

确实现思路如下: 1、首先 UserSessionUnit中创建以下变量

varTempform:TIWBaseForm; FData:String; FClose:Boolean; varTempform 用来记住弹出对话框的母窗口,此例中为 Unit1 窗口,FData 用来传递对话框中传

入的数据。FClose用来通知 intraweb是否 Free对话框窗口。 2、在 ServerController加入以下事件,此函数目的是:在每次产生新的页面之前,分析从浏览器

地址传回的数据,如果 page参数的值为 Dialogform,则生成 TIWForm2的页面并显示出来。同时判断 UserSession.FClose 的真假,如果为真,表示对话框被关闭了,则将此值改为假,再将要显示的新页面设置为 UserSession.varTempform,同时 free对话框 TIWForm2的页面。

procedure TIWServerController.IWServerControllerBaseBeforeRender( ASession: TIWApplication; AForm: TIWBaseForm; var VNewForm: TIWBaseForm); var WebPara:STring; begin WebPara:=ASession.Request.QueryFields.Values['page']; if WebPara='Dialogform' then begin VNewForm:=TIWForm2.Create(ASession); //生成 TIWForm2的页面并显示出来 end; if UserSession.FClose then begin UserSession.FClose:=False; // 将要显示的新页面设置为 UserSession.varTempform

Page 126: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.19 IntraWeb怎样实现模式弹出窗口 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 126页/共 376页

VNewForm:=UserSession.varTempform; WebApplication.ActiveForm.Free;// free对话框 TIWForm2的页面 end; end; 3、在 Unit1 窗口中加入 IWButton1,将其隐藏在按钮 IWButton2 后面(将 IWButton2 的 zindex

设为 1即可),给该按钮写如下事件,该事件将会被对话框网页关闭时调用。 procedure TIWForm1.IWButton1AsyncClick(Sender: TObject; EventParams: TStringList); begin IWEdit1.Text:=UserSession.FData;//将对话框网页输入的参数传递给主页面的输入框 UserSession.FClose:=True;//表示对话框已经被关闭了 UserSession.varTempform:=Self;//对话框网页的母窗口 end; 4、给 IWButton2加入如下事件,其实就是组合 window.showModalDialog(sURL [, vArguments] [,

sFeatures])网页模式对话框。 procedure TIWForm1.IWButton2Click(Sender: TObject); var tmp:string; begin

tmp:='window.showModalDialog('+''''+'http://'+''''+'+window.location.host+'+''''+'/index.htm/'+''''+'+GTrackID+'+''''+'/'+''''+'+GAppID+'+''''+'/?page=Dialogform'+''''+',window,'+''''+'dialogWidth:400px;dialogHeight:260px;center:1;scroll:0;help:0;status:0'+''''+');IWBUTTON1_onclick();';

//生成的字符如下 http://127.0.0.1:90/index.htm/1/01o09u11y1ds5i1gg8a2e0it26or/?page=Dialogform // window.location.host网站根地址,即上面的 127.0.0.1:90 // GTrackID即上面的 1,每次都会变化 // GAppID即上面的 01o09u11y1ds5i1gg8a2e0it26or // Dialogform我们前面在 2中提到的参数 page的值,一定要对应 // IWBUTTON1_onclick() 就 是 对 TIWForm1.IWButton1AsyncClick(Sender: TObject;

EventParams: TStringList);事件的调用 //因为 IWServerController.ExecCmd:='index.htm',所以用 index.htm AddToInitProc(tmp); end; 以下为补充说明: 网页模式对话框使用方法如下: vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures]) 参数说明: sURL 必选参数,类型:字符串。用来指定对话框要显示的文档的 URL。 vArguments 可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通

过 window.dialogArguments来取得传递进来的参数。

Page 127: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 3.19 IntraWeb怎样实现模式弹出窗口 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 127页/共 376页

sFeatures 可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号

“;”隔开。 dialogHeight 对话框高度,不小于100px,IE4中 dialogHeight 和 dialogWidth 默认的单位

是 em,而IE5中是 px,为方便其见,在定义modal方式的对话框时,用 px做单位。 dialogWidth: 对话框宽度。 dialogLeft: 距离桌面左的距离。 dialogTop: 离桌面上的距离。 center: {yes | no | 1 | 0 }:窗口是否居中,默认 yes,但仍可以指定高度和宽度。 help: {yes | no | 1 | 0 }:是否显示帮助按钮,默认 yes。 resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改变大小。默认 no。 status: {yes | no | 1 | 0 } [IE5+]:是否显示状态栏。默认为 yes[ Modeless]或 no[Modal]。 scroll:{ yes | no | 1 | 0 | on | off }:指明对话框是否显示滚动条。默认为 yes。 5、对话框 Unit2中的事件如下: procedure TIWForm2.IWAppFormCreate(Sender: TObject); begin UserSession.FData:='';//将参数置空

end; procedure TIWForm2.IWButton2AsyncClick(Sender: TObject; EventParams: TStringList); begin UserSession.FData:=''; //给参数赋值 AddToInitProc('window.close();');//加入关闭网页的代码 end; procedure TIWForm2.IWButtonAsyncClick(Sender: TObject; EventParams: TStringList); begin //这里处理数据交换问题 UserSession.FData:=IWEdit1.Text; //给参数赋值 AddToInitProc('window.close();'); //加入关闭网页的代码 end;

Page 128: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 128页/共 376页

第四章 完整应用实例讲解 用 IntraWeb开发有两种编程习惯:只用 IntraWeb最简单的几个控件,自己用 JavaScript和 HTML

等“组装”代码,详见:“4.1 一个电影网站的出生之旅”,另一种习惯是大量使用控件 IntraWeb和TMS IntraWeb Component,这样很像原有的桌面程序开发方式,详见:“4.2 一个英语教学网站的综合编程”。

4.1 一个电影网站的出生之旅 4.1.1 网站模板与运行界面 在第一章时,我们提到过一个电影网站。这里,我们对它进行完整讲解。 这个程序第一次看也许觉得很复杂,但只要明白了其中的原理,其实是很简单的。此程序中直接

应用 IntraWeb 控件倒不是很多,看懂此程序应该具备一定的网页编程经验,说白了,也就是要懂得HTML网页中的代码的意思,会基本的网页设计。(源代码在文件夹 4.1中) 闲话少述,先说一下整个程序的总体思路: 1、网站一般都有一个每页都有的导航条之类的东西,就是每页都出现的一些公共界面,我们在

BaseForm窗口中实现,其它页面要拥有这些公共界面,我们就从这个窗口继承。 2、所有窗口要调用的共用函数我们都写在 IWServerController 窗口中,其它窗口只要 uses

ServerController单元,就可以直接调用这些函数。 3、各单元之间要传递的参数我们都事先在 IWUserSession 窗口中定义,传递时先给相应的参数

赋值,接收时从这个参数取值。这样就可以实现各网页之间的参数传递。 4、界面布局我们依然采用模板的方法,用 HTML文件作为模板,相应的窗口调用相应的模板将我

们的 IntraWeb控件自动嵌入到相应的位置中。不同的模板可以实现不同的网页风格。 5、每个 IntraWeb 中用到的表格控件我们都采用皮肤(skin)技术,也就是一个小的模板,用来

美化我们的表格。而且更改外部皮肤就可以更改我们的表格风格。 我们的模板放在\templates\1 目录下,这表示是第一套模板。但模板在设计时,还是请直接放在

templates目录下,完全确立可以了再放在文件 1目录下。原因是文件中的图片路径在 templates目录下是可以显示的,在 1目录下就不能正常显示了。这里共有 8个页面,它们的文件名中小数点前的部分都和相应的窗口名称是一样的。下面我解释一下各个页面的作用:

1)MainForm.html,图 4-1-1是这个模板文件的视图:

Page 129: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 129页/共 376页

图 4-1-1 MainForm.html在 IE中的视图

这个模板对应我们程序中的窗口 MainForm,从窗口 Baseform 继承,是网站的首页。主要用来显示登录输入框、显示最新电影列表和点播排行榜列表。“{%NewFilm%}”(双引号之间的部份)这种格式是模板网页中的一个标记,IntraWeb 程序在运行时会查找这种标记“{% %}”,将两个%号之间的字符取出来当作本模板对应窗口内的一个 IntraWeb 控件名,如果窗口内有以此为名的控件,程序就将此控件生成的相应HTML代码输出,替换模板文件中的这个标记“{%NewFilm%}”。这里“{%NewFilm%}”和“{%HotFilm%}”是两个表格控件,输出时会生成两个表格。运行时如图 4-1-2生成最新电影列表和点播排行榜列表。

Page 130: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 130页/共 376页

图 4-1-2 MainForm运行时的界面 这样程序的界面设计就与编程可以分开了,设计好网页,将我们的相应标记放进去就行了。 下面我着重讲一下图 4-1-3中的标记:

图 4-1-3 Baseform窗口上的控件

这就是我说的每个页面都有的公共界面,我们有一个窗口 Baseform,就有以上标记的所有控件。

其它页面窗口都是从它继承的,所以其它页面窗口也都有这些控件。但运行时并不是每个页面都显示

这些控件内容,当控件的 visible属性为 false时就不会显示。 运行时可能是如图 4-1-4界面:

Page 131: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 131页/共 376页

图 4-1-4 Baseform窗口被继承后的运行界面

“{%Label1%}”输出一个字符串,这里是“用户”,“{%UserID%}” 输出为一个输入框,用来输入用户名,“{%Label2%}”输出一个字符串,这里是“密码”,“{%PASS%}” 输出为一个输入框,用来输入密码。“{%Login%}”和“{%Reg%}”是两个按钮,前者为登录,后者为注册。“{%Search%}”也是一个按钮,为搜索,“{%Searchedit%}”是一个输入框,用来输入要搜索电影的关键词。如果有的看不见是因为控件的 visible属性为 false。

2)RegForm.html图 4-1-5是这个模板文件的视图:

图 4-1-5 RegForm.html在 IE中的视图

这个模板对应我们的窗口 RegForm,从窗口 Baseform 继承,是用户的注册页,用来填写注册信

息的。运行时其对应显示的控件如图 4-1-6(运行时点击注册按钮就会出现以下页面):

图 4-1-6 窗口 RegForm的运行界面

“{%UserName%}”输出一个输入框,用来输入会员名,此会员名即是登录时的用户名,“{%PassWord%}” 输出为一个输入框,用来输入密码,“{%CheckPass%}” 输出为一个输入框,用来输入第二遍密码。“{%Boy%}”和“{%Girl%}”是两个单选框,前者为男,后者为女。“{%RegBtn%}”是一个按钮,为添加,按下此按钮即提交注册信息到数据库,“{%ResetBtn%}” 也是一个按钮,为返回,按下将返回到首页。

3)ListForm.html图 4-1-7是这个模板文件的视图:

Page 132: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 132页/共 376页

图 4-1-7 ListForm.html在 IE中的视图

这个模板对应我们的窗口 ListForm,从窗口 Baseform 继承,是电影列表显示页面,点击列表中

的相应链接就可以播放电影。运行时其对应显示的控件如图 4-1-8(点击搜索按钮或影片分类文字链接就会出现以下页面):

图 4-1-8 窗口 ListForm的运行界面 “{%ListGrid%}”输出电影列表,如上图所示 4部电影,“{%Page%}” 输出为上图最下面的页

面导航条,用来快速到达所需页面。 4)PlayForm.html图 4-1-9是这个模板文件的视图:

Page 133: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 133页/共 376页

图 4-1-9 PlayForm.html在 IE中的视图

这个模板对应我们的窗口 PlayForm,从窗口 Baseform 继承,是电影播放显示页面。运行时其对应显示的控件如图 4-1-10(点击列表中的相应链接就会出现以下页面):

图 4-1-10 窗口 PlayForm在运行时的界面

“{%PlayFilm %}”输出一个组装的 HTML代码,显示效果如上图。有电影播放界面,也有相关的

电影信息。所有元素是以表格的形式来定位的。全部通过 HTML代码来实现。 5)SystemForm.html图 4-1-11是这个模板文件的视图:

此处为电影内容

Page 134: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 134页/共 376页

图 4-1-11 SystemForm.html在 IE中的视图 这个模板对应我们的窗口 SystemForm,从窗口 Baseform 继承,是管理员登录后的显示页面。

运行时其对应显示的控件如图 4-1-12(填入管理员用户名和密码后点击登录按钮后就会出现以下页面):

图 4-1-12 窗口 SystemForm运行时的界面

“{%EdtPort%}”输出一个输入框,用来输入服务器所绑定的端口号,“{%EdtNewFilm%}” 输出为一个输入框,用来输入主页面显示的最新数目电影,默认为 6,“{%EdtHotFilm%}” 输出为一个输入框,用来输入主页面显示的热门数目电影,默认为 14。“{%UserControl%}”和“{%FilmControl%}”是两个 HTML 代码输出控件,分别显示添加,修改,删除用户链接和添加,修改,删除电影链接。“{%IWCheckBox1%}”是一个复选框,其作用为是否支持换页面特效, “{%AffirmBtn%}” 是一个按钮,为保存所修改的信息,“{%ReturnBtn%}” 也是一个按钮,为返回,按下将返回到首页。

6)UserForm.html图 4-1-13是这个模板文件的视图:

Page 135: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 135页/共 376页

图 4-1-13 UserForm.html在 IE中的视图 这个模板对应我们的窗口 UserForm,从窗口 Baseform 继承,是管理员登录后的用户管理页面。

运行时其对应显示的控件如图 4-1-14(点击用户管理中的【修改,删除】后就会出现以下页面):

图 4-1-14 窗口 UserForm运行时的界面

“{%ListUser%}”输出用户列表,如上图所示,“{%Page%}” 输出为上图最下面的页面导航条,用来快速到达所需页面。

7)adminForm.html图 4-1-15是这个模板文件的视图:

图 4-1-15 adminForm.html在 IE中的视图 这个模板对应我们的窗口 adminForm,从窗口 Baseform 继承,是管理员登录后的用户管理页面。

运行时其对应显示的控件如图 4-1-16(点击电影管理中的【修改,删除】后就会出现以下页面):

Page 136: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 136页/共 376页

图 4-1-16 窗口 adminForm运行时的界面

“{%ListFilm%}”输出电影列表,如上图所示,“{%Page%}” 输出为上图最下面的页面导航条,

用来快速到达所需页面。点击修改将进入修改页面,点击删除将会删除该部电影。 7)ModiforAddForm.html图 4-1-17是这个模板文件的视图:

图 4-1-17 ModiforAddForm.html在 IE中的视图

Page 137: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 137页/共 376页

这个模板对应我们的窗口 ModiforAddForm,从窗口 Baseform 继承,是管理员登录后的修改、添

加电影的页面。运行时其对应显示的控件如图 4-1-18(点击电影管理中的【添加】后就会出现以下页面):

图 4-1-18 窗口 ModiforAddForm运行时的界面 相应标记和输出控件可以对比以上两图,这里不再详述。 补充说明:标记中间的字符串是窗口中的控件的 name,从标记中一般看不出是什么控件,要知道

标记的是什么控件,可以打开源代码的相应窗口自己对照来看。 因为数据库的功能设计不是我们的主要目的,我们在这里主要关注有关 intraweb的编程方法,所

以数据库的设计我就不讲了,很简单,大家打开 database\ imovie.mdb自己查看就清楚了,我们要将大多数精力放在研究程序代码上。

Page 138: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 138页/共 376页

4.1.2 程序代码全面解析 4.1.2.1 ServerController单元 这是一个很重要的单元,因为很多公用函数在这个单元里实现。下面我会详细讲解每一个函数,

如果没有详细的说明,那这个函数你可以不用明白它是怎么实现的,只要知道结果是什么,怎么使用

它就行了。在自己的程序中,你可以把这整个函数抄过去而不用更改任何参数,把该函数引用到的相

应单元 uses进去即可。以下有很多可以收藏的函数。 unit ServerController; interface uses SysUtils, Classes, IWServerControllerBase, IWBaseForm, HTTPApp,WinSock, // For OnNewSession Event UserSessionUnit, IWApplication, IWAppForm, ADODB, DB, IWDBGrids, ShellAPI, Variants,StrUtils; type TIWServerController = class(TIWServerControllerBase) procedure IWServerControllerBaseNewSession(ASession: TIWApplication; var VMainForm: TIWBaseForm); procedure IWServerControllerBaseBackButton(ASubmittedSequence, ACurrentSequence: Integer; AFormName: string; var VHandled, VExecute: Boolean); procedure IWServerControllerBaseCreate(Sender: TObject); procedure IWServerControllerBaseCloseSession(ASession: TIWApplication); private public end; var GSkin, G: string; function GetLocalIP: string; //得到本机 IP地址) function PlayFilms(IQuery: Tadoquery; Search: string; PlayFilmNum: Integer = 0): string; function GetLinkStringEx(Row: Integer; ID, Link: string; Cof: string = ''; GridName: string = 'ComGrid'): string; function GetToolStr(RecNo, RecordCount, RowLimit: Integer; GridID: Integer; Nums: Integer = 10; Captions: string = '条记录'; Grid: string = 'ComGrid'): string; function ShowForm(AFormName: string): Boolean; function GetSpace(Count: Integer): string; function HotFilms(IQuery: Tadoquery; ICount: Integer = 14): string; function NewFilms(IQuery: Tadoquery; ICount: Integer = 6): string; function pictureString(IPath, ISize: string): string; function GetLinkString(Row, ID: string; Link: string; Cof: string = ''; GridName: string = 'ComGrid'): string; //给服务器 iwdbgrid第几行处理,给服务器 iwdbgrid处理的数据,在 IE显示超连接 function UserSession: TIWUserSession; function IWServerController: TIWServerController; procedure SetPage(Grid: TIWDBGrid; AValue: string); function PlayRM(Iflie: string): string; function PlayAvi(Iflie: string): string;

Page 139: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 139页/共 376页

function CopyDirectory(const Source, Dest: string): Boolean; function DelDirectory(const Source: string): Boolean; function RenDirectory(const OldName, NewName: string): Boolean; function gethzPy(const AHzStr: string): string; //得到汉字首字母 function RenString(Istring: string): string; function IIF(str, num: string): string; function GetHourStr: string; implementation {$R *.dfm} uses IWInit, IWGlobal, IWForm, IWContainer; //得到本机 IP地址,会用就行,记得要 uses WinSock单元 function GetLocalIP: string; type TaPInAddr = array [0..10] of PInAddr; PaPInAddr = ^TaPInAddr; var phe : PHostEnt; pptr : PaPInAddr; Buffer : array [0..63] of char; I : Integer; GInitData : TWSADATA; begin WSAStartup($101, GInitData); Result := ''; GetHostName(Buffer, SizeOf(Buffer)); phe :=GetHostByName(buffer); if phe = nil then Exit; pptr := PaPInAddr(Phe^.h_addr_list); I := 0; while pptr^[I] <> nil do begin result:=StrPas(inet_ntoa(pptr^[I]^)); Inc(I); end; WSACleanup; end; //得到一天的时间段称呼,用来向登录用户问好 function GetHourStr: string; var Hour, Min, Sec, MSec: word; begin DecodeTime(Now, Hour, Min, Sec, MSec); case Hour of

Page 140: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 140页/共 376页

0, 1, 2, 3, 4: result := '午夜'; 5, 6, 7: result := '早上'; 8, 9, 10: result := '上午'; 11, 12, 13: result := '中午'; 14, 15, 16, 17, 18: result := '下午'; 19, 20, 21, 22, 23: result := '晚上'; end; end; //如果 str 为空,则函数值为 num,如果不为空,则函数值为 str,函数功能可以总结为:给空字符串str赋值为 num,不空就保持不变 function IIF(str, num: string): string; begin begin if Trim(str) = '' then result := num else result := str; end end; //将字符串 Istring中的/替换成\,目的是将 URL地址转换成文件路径 function RenString(Istring: string): string; function ReplaceText(const S, ReplacePiece, ReplaceWith: string): string; var Position: Integer; TempStr: string; begin Position := Pos(ReplacePiece, S); if Position > 0 then begin TempStr := S; Delete(TempStr, 1, Position - 1 + Length(ReplacePiece)); result := Copy(S, 1, Position - 1) + ReplaceWith + ReplaceText(TempStr, ReplacePiece, ReplaceWith) end else result := S; end; begin result := ReplaceText(Istring, '/', '\') end; //得到汉字首字母 function gethzPy(const AHzStr: string): string; const ChinaCode: array[0..25, 0..1] of Integer = ((1601, 1636), (1637, 1832), (1833, 2077), (2078, 2273), (2274, 2301), (2302, 2432), (2433, 2593), (2594, 2786), (9999, 0000),

Page 141: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 141页/共 376页

(2787, 3105), (3106, 3211), (3212, 3471), (3472, 3634), (3635, 3722), (3723, 3729), (3730, 3857), (3858, 4026), (4027, 4085), (4086, 4389), (4390, 4557), (9999, 0000), (9999, 0000), (4558, 4683), (4684, 4924), (4925, 5248), (5249, 5589)); var i, j, HzOrd: Integer; begin i := 1; while i <= Length(AHzStr) do begin if (AHzStr[i] >= #160) and (AHzStr[i + 1] >= #160) then begin HzOrd := (Ord(AHzStr[i]) - 160) * 100 + Ord(AHzStr[i + 1]) - 160; for j := 0 to 25 do begin if (HzOrd >= ChinaCode[j][0]) and (HzOrd <= ChinaCode[j][1]) then begin result := result + char(byte('A') + j); break; end; end; Inc(i); end else result := result + AHzStr[i]; Inc(i); end; end; // 更改文件夹名,将 OldName用 NewName代替,更改成功函数返回 true function RenDirectory(const OldName, NewName: string): Boolean; var fo: TSHFILEOPSTRUCT; begin FillChar(fo, SizeOf(fo), 0); with fo do begin Wnd := 0; wFunc := FO_RENAME; pFrom := PChar(OldName + #0); pTo := PChar(NewName + #0); fFlags := FOF_NOCONFIRMATION + FOF_SILENT; end; result := (SHFileOperation(fo) = 0); end; //删除文件夹 Source

Page 142: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 142页/共 376页

function DelDirectory(const Source: string): Boolean; var fo: TSHFILEOPSTRUCT; begin FillChar(fo, SizeOf(fo), 0); with fo do begin Wnd := 0; wFunc := FO_DELETE; pFrom := PChar(Source + #0); pTo := #0#0; fFlags := FOF_NOCONFIRMATION + FOF_SILENT; end; result := (SHFileOperation(fo) = 0); end; //复制文件夹(Source为被拷贝的文件夹名,Dest新文件夹名) function CopyDirectory(const Source, Dest: string): Boolean; var fo: TSHFILEOPSTRUCT; begin FillChar(fo, SizeOf(fo), 0); with fo do begin Wnd := 0; wFunc := FO_COPY; pFrom := PChar(Source + #0); pTo := PChar(Dest + #0); fFlags := FOF_NOCONFIRMATION + FOF_NOCONFIRMMKDIR; end; result := (SHFileOperation(fo) = 0); end; //在网页中生成播放 AVI文件的代码(嵌入 windows的媒体播放器),打开网页即可播放 Iflie所指定的AVI文件。Hint字符串为自己定义的,可以参考修改,但它以下的代码不需要更改。GetSpace(18)为在网页中加入 18 个空格,数字是几就加入几个空格。UserSession.PlayFilmNum 为电影的集数,如果不为 0,则显示电影名 UserSession.Film 和集数 UserSession.PlayFilmNum,否则只显示电影名UserSession.Film。后面的代码是加入电影播放界面,当打开页面时播放 Iflie所指定的 AVI文件。 function PlayAvi(Iflie: string): string; var hint: string; begin if UserSession.PlayFilmNum <> 0 then hint := '<p>' + GetSpace(18) + '当前播放电影片为 <font color=red>【' + UserSession.Film + '】

Page 143: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 143页/共 376页

</font> 的第<font color=red>' + inttostr(UserSession.PlayFilmNum) + '</font>集</p>' else hint := '<p>' + GetSpace(18) + '当前播放电影片为 <font color=red>【' + UserSession.Film + '】 </font> </p>'; result := hint + '<p><OBJECT id=MediaPlayer1 height=400 width=450 classid=clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95>' + '<PARAM NAME="AudioStream" VALUE="-1"> ' + '<PARAM NAME="AutoSize" VALUE="0"> ' + '<PARAM NAME="AutoStart" VALUE="-1"> ' + '<PARAM NAME="AnimationAtStart" VALUE="-1">' + '<PARAM NAME="AllowScan" VALUE="-1"> ' + '<PARAM NAME="AllowChangeDisplaySize" VALUE="-1">' + '<PARAM NAME="AutoRewind" VALUE="0"> ' + '<PARAM NAME="Balance" VALUE="0"> ' + '<PARAM NAME="BaseURL" VALUE=""> ' + '<PARAM NAME="BufferingTime" VALUE="5"> ' + '<PARAM NAME="CaptioningID" VALUE=""> ' + '<PARAM NAME="ClickToPlay" VALUE="-1"> ' + '<PARAM NAME="CursorType" VALUE="0"> ' + '<PARAM NAME="CurrentPosition" VALUE="-1"> ' + '<PARAM NAME="CurrentMarker" VALUE="0"> ' + '<PARAM NAME="DefaultFrame" VALUE=""> ' + '<PARAM NAME="DisplayBackColor" VALUE="0"> ' + '<PARAM NAME="DisplayForeColor" VALUE="16777215"> ' + '<PARAM NAME="DisplayMode" VALUE="0"> ' + '<PARAM NAME="DisplaySize" VALUE="2"> ' + '<PARAM NAME="Enabled" VALUE="-1"> ' + '<PARAM NAME="EnableContextMenu" VALUE="-1"> ' + '<PARAM NAME="EnablePositionControls" VALUE="-1"> ' + '<PARAM NAME="EnableFullScreenControls" VALUE="0">' + '<PARAM NAME="EnableTracker" VALUE="-1"> ' + '<PARAM NAME="Filename" VALUE="' + midStr(trim(Iflie),2,Length(trim(Iflie))) + '"> ' + '<PARAM NAME="InvokeURLs" VALUE="-1"><PARAM NAME="Language" VALUE="-1">' + '<PARAM NAME="Mute" VALUE="0"> ' + '<PARAM NAME="PlayCount" VALUE="1"> ' + '<PARAM NAME="PreviewMode" VALUE="0"> ' + '<PARAM NAME="Rate" VALUE="1"> ' + '<PARAM NAME="SAMILang" VALUE=""> ' + '<PARAM NAME="SAMIStyle" VALUE=""> ' + '<PARAM NAME="SAMIFileName" VALUE=""> ' + '<PARAM NAME="SelectionStart" VALUE="-1"> ' + '<PARAM NAME="SelectionEnd" VALUE="-1"> ' + '<PARAM NAME="SendOpenStateChangeEvents" VALUE="-1"> ' + '<PARAM NAME="SendWarningEvents" VALUE="-1"> ' +

Page 144: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 144页/共 376页

'<PARAM NAME="SendErrorEvents" VALUE="-1"> ' + '<PARAM NAME="SendKeyboardEvents" VALUE="0"> ' + '<PARAM NAME="SendMouseClickEvents" VALUE="0"> ' + '<PARAM NAME="SendMouseMoveEvents" VALUE="0"> ' + '<PARAM NAME="SendPlayStateChangeEvents" VALUE="-1"> ' + '<PARAM NAME="ShowCaptioning" VALUE="0">' + '<PARAM NAME="ShowControls" VALUE="-1"> ' + '<PARAM NAME="ShowAudioControls" VALUE="-1">' + '<PARAM NAME="ShowDisplay" VALUE="0"> ' + '<PARAM NAME="ShowGotoBar" VALUE="0"> ' + '<PARAM NAME="ShowPositionControls" VALUE="-1"> ' + '<PARAM NAME="ShowStatusBar" VALUE="-1">' + '<PARAM NAME="ShowTracker" VALUE="-1">' + '<PARAM NAME="TransparentAtStart" VALUE="0">' + '<PARAM NAME="VideoBorderWidth" VALUE="0">' + '<PARAM NAME="VideoBorderColor" VALUE="0">' + '<PARAM NAME="VideoBorder3D" VALUE="0">' + '<PARAM NAME="Volume" VALUE="-40"> ' + '<PARAM NAME="WindowlessVideo" VALUE="0"></OBJECT><P>'; end; //在网页中生成播放 rm文件的代码(嵌入 realplayer的播放器),打开网页即可播放 Iflie所指定的 rm文件。Hint字符串为自己定义的,可以参考修改,但它以下的代码不需要更改。GetSpace(18)为在网页中加入 18 个空格,数字是几就加入几个空格。UserSession.PlayFilmNum 为电影的集数,如果不为 0,则显示电影名 UserSession.Film 和集数 UserSession.PlayFilmNum,否则只显示电影名UserSession.Film。后面的代码是加入电影播放界面,当打开页面时播放 Iflie所指定的 rm文件。 function PlayRM(Iflie: string): string; var hint: string; begin if UserSession.PlayFilmNum <> 0 then hint := '<p>' + GetSpace(18) + '当前播放电影片为 <font color=red>【' + UserSession.Film + '】</font> 的第<font color=red>' + inttostr(UserSession.PlayFilmNum) + '</font>集</p>' else hint := '<p>' + GetSpace(18) + '当前播放电影片为 <font color=red>【' + UserSession.Film + '】</font></p>'; result := hint + '<P><object ID="video2" CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" name="playfull" WIDTH="412" HEIGHT="320" >' + '<param name="_ExtentX" value="10901" />' + '<param name="_ExtentY" value="8467" />' + '<param name="AUTOSTART" value="-1" />' + '<param name="SHUFFLE" value="0" />' + '<param name="PREFETCH" value="0" />' + '<param name="NOLABELS" value="0" />' +

Page 145: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 145页/共 376页

'<param name="SRC" value="' + midStr(trim(Iflie),2,Length(trim(Iflie))) + ' "/>' + '<param name="CONTROLS" value="ImageWindow" />' + '<param name="CONSOLE" value="Clip1" />' + '<param name="LOOP" value="0" /> ' + '<param name="NUMLOOP" value="0" />' + '<param name="CENTER" value="0" /> ' + '<param name="MAINTAINASPECT" value="0" />' + '<param name="BACKGROUNDCOLOR" value="#000000" />' + '<embed SRC="4.rpm" type="audio/x-pn-realaudio-plugin" CONSOLE="Clip1" CONTROLS="ImageWindow" HEIGHT="240" WIDTH="352" AUTOSTART="false" /></object>' + '<object ID="video1" CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" WIDTH="412" HEIGHT="60" >' + '<param name="_ExtentX" value="10901" />' + '<param name="_ExtentY" value="1588" />' + '<param name="AUTOSTART" value="-1" />' + '<param name="SHUFFLE" value="0" />' + '<param name="PREFETCH" value="0" /> ' + '<param name="NOLABELS" value="0" /> ' + '<param name="CONTROLS" value="ControlPanel,StatusBar" /> ' + '<param name="CONSOLE" value="Clip1" /> ' + '<param name="LOOP" value="0" /> ' + '<param name="NUMLOOP" value="0" /> ' + '<param name="CENTER" value="0" /> ' + '<param name="MAINTAINASPECT" value="0" />' + '<param name="BACKGROUNDCOLOR" value="#000000" /> ' + '<embed type="audio/x-pn-realaudio-plugin" CONSOLE="Clip1" CONTROLS="ControlPanel,StatusBar" HEIGHT="60" WIDTH="275" AUTOSTART="false" /></object><p>'; end; //此函数的目的是当点击列表页面最下方的分页导航条的第几页或者 Go链接时,跳到相应的页面。总的来说就是实现数据分页。Grid为要分页的 TIWDBGrid表格 name,Avalue为传递的一个参数,这个不用操心,当调用这个函数时自然会有这个值供你使用。在应用这个函数之前,要先调用下一个函

数 GetToolStr来生成导航条。 procedure SetPage(Grid: TIWDBGrid; AValue: string); var n1, n2: Integer; begin try//如果输入的是字母则退出,因为字母不能被转换成数字 n1 := Strtoint(Copy(AValue, 1, 1)); if Copy(AValue, 3, 20) = '' then Exit; n2 := Strtoint(Copy(AValue, 3, 20)); except Exit;

Page 146: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 146页/共 376页

end; case n1 of 0: begin case n2 of 1: Grid.DataSource.DataSet.First; 2: Grid.DataSource.DataSet.MoveBy(-Grid.RowLimit); 3: Grid.DataSource.DataSet.MoveBy(Grid.RowLimit); 4: Grid.DataSource.DataSet.Last; end; end; 1: begin if n2<1 then n2:=1; if Grid.DataSource.DataSet.RecordCount=0 then exit; G := inttostr((n2 - 1) * Grid.RowLimit + 1); Grid.DataSource.DataSet.RecNo := (n2 - 1) * Grid.RowLimit + 1; end; end; end; //这个函数就是用来生成相应数据表格的分页导航条的,RecNo 为表格所用数据集的当前记录,RecordCount 为表格所用数据集的整个记录个数,RowLimit 为表格显示的每页记录数,GridID 为ComGrid的执行跳页的相应的函数所在的 ComGrid的行号,Captions为统计时的字符提示,Grid为在窗口中响应导航链接的 TIWDBGrid 控件的 name.。给出一个调用它的例子: Page.Text := GetToolStr(ListGrid.DataSource.DataSet.RecNo,ListGrid.DataSource.DataSet.RecordCount, ListGrid.RowLimit, 0, 6, '部电影'),ListGrid 为一个 TIWDBGrid 控件,0 为 ComGrid 第一行的ComGridColumns0Click(ASender: TObject; const AValue: string)来执行导航条的链接。6为导航条显

示 6 个数字,'部电影'为后面的总计提示,如 97 2 3 4 5 6 7 8:去 页 Go 共 143 部电影 每页 4

部电影 共 36页。 {这里有必要说明一下,这是一个很重要的概念: 请看以下代码: <a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_爱情片', true, '');">爱情片</a>,在网 页 上 这 将 显 示 为 爱 情 片 , 并 有 超 级 链 接 , 当 单 击 爱 情 片 这 个 链 接 时 会 执 行

SubmitClickConfirm('ComGrid','1_爱情片', true, '')这个函数。这个函数会调用窗口中的名为第一个参数 ComGrid的 TIWDBGrid控件的 ComGridColumns1Click(ASender: TObject; const AValue: string)函数。SubmitClickConfirm('ComGrid','1_爱情片', true, '')中第二个参数下划线前的 1为 Columns的索引,函数 ComGridColumns1Click(ASender: TObject; const AValue: string)即为 ComGrid表格的第二行的 onclick 事件(第一行的索引为 0)。第二个参数下划线后的爱情片即为从网页传递到窗口ComGridColumns1Click(ASender: TObject; const AValue: string)函数的Avalue的值。即Avalue:=’ 爱情片’;第 4 个参数如果不为空,则会跳出一个对话框,如果选择是则继续执行,否则不执行窗口函数代码。} function GetToolStr(RecNo, RecordCount, RowLimit: Integer; GridID: Integer; Nums: Integer = 10; Captions: string = '条记录'; Grid: string = 'ComGrid'): string; var

Page 147: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 147页/共 376页

P: real; n, n1, n2, P1, P2: Integer; S: string; begin P := RecNo / RowLimit; P1 := Trunc(P); if Frac(P) > 0 then Inc(P1); P := RecordCount / RowLimit; P2 := Trunc(P); if Frac(P) > 0 then Inc(P2); result := '&nbsp;&nbsp;'; if P1 > 1 then begin result := result + GetLinkStringEx(GridID, '0_1', '<font face="Webdings" title="首页">9</font>', '', Grid) + GetLinkStringEx(GridID, '0_2', '<font face="Webdings" title="上一页">7</font>', '', Grid) + '%S'; end else begin result := result + '<font face="Webdings" color=gray title="首页">9</font>' + '<font face="Webdings" color=gray title="上一页">7</font>%S'; end; if P1 <> P2 then begin result := result + GetLinkStringEx(GridID, '0_3', '<font face="Webdings" title="下一页">8</font>', '', Grid) + GetLinkStringEx(GridID, '0_4', '<font face="Webdings" title="尾页">:</font>', '', Grid); end else begin result := result + '<font face="Webdings" color=gray title="下一页">8</font>' + '<font face="Webdings" color=gray title="尾页">:</font>'; end; Nums := Trunc(Nums / 2); n1 := P1 - Nums; if n1 < 1 then n1 := 1; n2 := P1 + Nums + ABS(P1 - Nums - n1) - 1; if n2 > P2 then n2 := P2; S := '&nbsp;'; for n := n1 to n2 do begin if n = P1 then S := S + Format('<font color=red><b>%D</b></font>&nbsp;', [n]) else S := S + GetLinkStringEx(GridID, '1_' + inttostr(n), inttostr(n), '', Grid) + '&nbsp;'; end;

Page 148: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 148页/共 376页

result := Format(result, [S]); result := result +'去<input id=page name="textfield" type="text" size="3">页'+ '<a href="#none" onclick="ss=''0_1_''+page.value;return SubmitClickConfirm(''ComGrid'',ss, true, '''');">&nbsp;Go</a>'+ Format('&nbsp;&nbsp;共<b>%D</b>' + Captions + ' 每页<b>%D</b>' + Captions + ' 共<b>%D</b>页&nbsp;&nbsp;', [RecordCount, RowLimit, P2]); end; //得到在网页中显示图片的代码 IPath为图片文件例如:/files/temp.jpg ISize为图片的小,中,大选项:small,med,larg。函数目的是为了显示电影图片 function pictureString(IPath, ISize: string): string; begin result := ''; IPath:=midStr(trim(IPath),2,Length(trim(IPath))); if ISize = 'small' then begin result := '<IMG height=85 src="' + IPath + '" width=85 border=0>'; exit; end; if ISize = 'med' then result := '<IMG height=150 src="' + IPath + '" width=110 border=0>' else result := '<IMG height=500 src="' + IPath + '" width=520 border=0>'; end; //显示 AFormName窗口所代表的网页,通用 function ShowForm(AFormName: string): Boolean; type TIWFormClass = class of TIWForm; var LForm: TIWForm; begin result := True; if WebApplication.FindComponent(AFormName) <> nil then begin WebApplication.SetActiveForm(WebApplication.FindComponent(AFormName) as TIWContainer); end else begin try LForm := TIWFormClass(FindClass('T' + AFormName)).Create(WebApplication); WebApplication.SetActiveForm(LForm); except result := False; end;

Page 149: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 149页/共 376页

end; end; //在网页中生成一个超级链接,该链接可以传递 ID参数到窗口的 GridName的 Row行的 onclick事件的 Avalue中,同时执行该事件 function GetLinkString(Row, ID: string; Link: string; Cof: string = ''; GridName: string = 'ComGrid'): string; begin result := Format('<a href="#none" onclick="return SubmitClickConfirm(''%S'',''%s_%s'', true, ''%S'');">%S</a>', [GridName, Row, ID, Cof, Link ]); //GetLinkString('0',t,temp,cof,ComGrid) 0是对应的 ComGrid的 0行的 ComGridColumns0Click命令, temp超级连接的内容 ,t,传送到数据表格处理的数据 ,cof为确认对话框的提示内容,ComGrid为窗口内的名为 ComGrid的 TIWDBGrid控件。 end; function GetLinkStringEx(Row: Integer; ID, Link: string; Cof: string = ''; GridName: string = 'ComGrid'): string; begin result := Format('<a href="#none" onclick="return SubmitClickConfirm(''%S'',''%D_%S'', true, ''%S'');">%S</a>', [GridName, Row, ID, Cof, Link]); end; function GetSpace(Count: Integer): string;//在 HTML代码中增加 Count个空格 var n: Integer; begin result := ''; for n := 0 to Count do result := result + '&nbsp;'; end; //此函数的目的是通过 Iquery查询到点击最多的 Icount部电影,将其显示在首页的点播排行榜的表格内。这里实现的方法是:加入每一部电影时先载入一个事先设计好的网页,即一开始我们提到的这个

表格的皮肤 files\Skin\1\HotFilm.Html,这里 Gskin 为字符 1。皮肤如图 4-1-19:(代码可以打开HotFilm.Html查看)

图 4-1-19 HotFilm.Html在 IE中的视图

再将字符 Film替换成一个超级链接,这个链接就是前面讲过的可以传递参数到窗口并调用窗口中相应函数的那种链接,这里将会调用 ComGridColumns0Click(ASender: TObject;const AValue: string),传

Page 150: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 150页/共 376页

递的参数和链接都是电影名称,例如“期待 8”。从程序运行后首页查看源代码知道,实际生成的链接为:<a href="#none" onclick="return SubmitClickConfirm('ComGrid','0_ 期 待 8', true, '');">&nbsp;&nbsp;&nbsp;期待 8</a></A>。图 4-1-20为运行时的效果。

图 4-1-20 实际输出的效果

请记住,这种方式是这个程序中超级链接有服务器端事件响应的主要实现形式。 function HotFilms(IQuery: Tadoquery; ICount: Integer = 14): string; var Temp: TStringList; i: Integer; begin result := ''; Temp := TStringList.Create; IQuery.Close; IQuery.SQL.Clear; IQuery.SQL.Add('select articleid,title from Movie ORDER BY Movie.hits DESC'); IQuery.Open; if IQuery.RecordCount < ICount then ICount := IQuery.RecordCount; try for i := 1 to ICount do begin Temp.Clear; Temp.LoadFromFile(WebApplication.ApplicationPath + '\files\Skin\' + GSkin + '\HotFilm.Html'); Temp.Text := StringReplace(Temp.Text, 'Film', GetLinkString('0', IQuery.FieldByname('title').AsString, GetSpace(2) + IQuery.FieldByname('title').AsString), [rfReplaceAll]); IQuery.Next; result := result + Temp.Text; end; except result := Temp.Text; end; Temp.Free; end; //此函数的目的是通过 Iquery查询到时间最新的 Icount部电影,将其显示在首页的最新电影的表格内。这里实现的方法是:加入每一部电影时先载入一个事先设计好的网页,即一开始我们提到的这个表格

的皮肤 files\Skin\1\NewFilm.Html,这里 Gskin 为字符 1。皮肤如下图 4-1-21:(代码可以打开

Page 151: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 151页/共 376页

NewFilm.Html查看)

图 4-1-21 NewFilm.Html在 IE中的视图

再将字符 Picture ,Film,Author,Type,Search替换成相应内容,有的有链接,有的没有,手法与HotFilms函数类似,这里不再详述。运行界面如图 4-1-22:

图 4-1-22 实际输出的效果

function NewFilms(IQuery: Tadoquery; ICount: Integer = 6): string; var Temp: TStringList; i: Integer; Pic: string; begin result := ''; Temp := TStringList.Create; IQuery.Close; IQuery.SQL.Clear; IQuery.SQL.Add('select * from Movie where IsDate(Movie.dateandtime) ORDER BY

Page 152: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 152页/共 376页

datevalue(Movie.dateandtime) DESC'); IQuery.Open; try if IQuery.RecordCount < ICount then ICount := IQuery.RecordCount; for i := 1 to ICount do begin Temp.Clear; Temp.LoadFromFile(WebApplication.ApplicationPath + '\files\Skin\' + GSkin + '\NewFilm.Html'); Pic := pictureString(IQuery.FieldByname('url').AsString, 'small'); Temp.Text := StringReplace(Temp.Text, 'Picture', GetLinkString('0', IQuery.FieldByname('title').AsString, Pic), [rfReplaceAll]);//有超级链接,传递的参数是 title字段内容,网页上显示的是 Pic所表示的图片 Temp.Text := StringReplace(Temp.Text, 'Film', GetLinkString('0', IQuery.FieldByname('title').AsString, IQuery.FieldByname('title').AsString), [rfReplaceAll]); //有超级链接,传递的参数是 title字段内容,网页上显示的也是 title字段内容 Temp.Text := StringReplace(Temp.Text, 'Author', IQuery.FieldByname('name').AsString, [rfReplaceAll]);//没有超级链接,仅仅将 Author替换成 name字段内容 Temp.Text := StringReplace(Temp.Text, 'Type', IQuery.FieldByname('TypeID').AsString, [rfReplaceAll]); //没有超级链接,仅仅将 Type替换成 TypeID字段内容 Temp.Text := StringReplace(Temp.Text, 'Search', GetLinkString('0', IQuery.FieldByname('title').AsString, '查看详情->>'), [rfReplaceAll]); //有超级链接,传递的参数是 title字段内容,网页上显示的是“查看详情->>” IQuery.Next;//下一条记录 result := result + Temp.Text;//代码累加 end; except result := Temp.Text; end; Temp.Free; end; //播放电影 function PlayFilms(IQuery: Tadoquery; Search: string; PlayFilmNum: Integer = 0): string; var Temp: TStringList; i, j: Integer; PlayFilm, Download, FilmNumLink, PlayNumUrl: string; MovieList: Tadoquery; begin result := ''; Temp := TStringList.Create; IQuery.Close; IQuery.SQL.Clear; IQuery.SQL.Add('select * from Movie where title =' + QuotedStr(Search));

Page 153: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 153页/共 376页

IQuery.Open; IQuery.Edit; //添加单击次数 IQuery.FieldByname('hits').AsInteger := IQuery.FieldByname('hits').AsInteger + 1; IQuery.Post; try begin Temp.Clear; Temp.LoadFromFile(WebApplication.ApplicationPath + '\files\Skin\' + GSkin + '\PlayFilm.Html'); /////////////////////////////////////////////////////////////////////////////// if IQuery.FieldByname('IsFilmNum').AsBoolean = True then begin //生成播放集数 MovieList := Tadoquery.Create(WebApplication); MovieList.Connection := UserSession.cn; MovieList.SQL.Add('select * from MovieList where title=' + QuotedStr(IQuery.FieldByname('title').AsString) + ' ORDER BY FilmNum'); MovieList.Open; i := -1; j := 2; while not MovieList.Eof do begin Inc(i); if (i = 6) or (i = 12) or (i = 18) or (i = 24) or (i = 30) or (i = 36) or (i = 42) then FilmNumLink := FilmNumLink + '<p></p>' + GetSpace(2) + GetLinkString('0', MovieList.FieldByname('FilmNum').AsString, '第' + MovieList.FieldByname('FilmNum').AsString + '集') + GetSpace(2) else begin if i = 10 then j := 1; FilmNumLink := FilmNumLink + GetSpace(2) + GetLinkString('0', MovieList.FieldByname('FilmNum').AsString, '第' + MovieList.FieldByname('FilmNum').AsString + '集') + GetSpace(j); end; MovieList.Next; end; FilmNumLink := FilmNumLink + '<p></p>'; ///////////////////////////////////////////////////////////////////////////////// with MovieList do begin //得到用户传来的播放集数.并获取超连接 Locate('title;FilmNum', VarArrayOf([IQuery.FieldByname('title').AsString, PlayFilmNum]), []); PlayNumUrl := FieldByname('playurl').AsString; //是播放连续剧 end; end; //if if Trim(UpperCase(IQuery.FieldByname('movietype').AsString)) = 'AVI' then begin if PlayNumUrl <> '' then begin PlayFilm := PlayAvi(PlayNumUrl); // 是播放连续剧 //电影类型判断以区分以何种播放

Page 154: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 154页/共 376页

器播放电影 PlayFilm := PlayFilm + '<p>' + FilmNumLink + '</p>'; end else begin PlayFilm := PlayAvi(IQuery.FieldByname('domurl').AsString); PlayFilm := PlayFilm + '<p>' + FilmNumLink + '</p>'; end; end else begin if PlayNumUrl <> '' then begin //RM PlayFilm := PlayRM(PlayNumUrl); // 是播放连续剧 PlayFilm := PlayFilm + GetSpace(28) + '<a href="javascript:setFull()" >【全屏】</a>'; PlayFilm := PlayFilm + '<p>' + FilmNumLink + '</p>'; end else begin PlayFilm := PlayRM(IQuery.FieldByname('domurl').AsString); PlayFilm := PlayFilm + GetSpace(28) + '<a href="javascript:setFull()" >【全屏】</a>'; PlayFilm := PlayFilm + '<p>' + FilmNumLink + '</p>'; end; end; Temp.Text := StringReplace(Temp.Text, 'PlayFilm', PlayFilm, [rfReplaceAll]); Temp.Text := StringReplace(Temp.Text, 'title', IQuery.FieldByname('title').AsString, [rfReplaceAll]); Temp.Text := StringReplace(Temp.Text, 'author', IQuery.FieldByname('name').AsString, [rfReplaceAll]); Temp.Text := StringReplace(Temp.Text, 'type', IQuery.FieldByname('TypeId').AsString, [rfReplaceAll]); Temp.Text := StringReplace(Temp.Text, 'where', IQuery.FieldByname('where').AsString, [rfReplaceAll]); Temp.Text := StringReplace(Temp.Text, 'howlong', IQuery.FieldByname('howlong').AsString, [rfReplaceAll]); Temp.Text := StringReplace(Temp.Text, 'hit', IQuery.FieldByname('hits').AsString, [rfReplaceAll]); Temp.Text := StringReplace(Temp.Text, 'datetime', IQuery.FieldByname('dateandtime').AsString, [rfReplaceAll]); Temp.Text := StringReplace(Temp.Text, 'memo', IQuery.FieldByname('content').AsString, [rfReplaceAll]); Download := '本站暂不提供下载!'; Temp.Text := StringReplace(Temp.Text, 'download', Download, [rfReplaceAll]); result := Temp.Text; end; except result := Temp.Text;

Page 155: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 155页/共 376页

end; MovieList.Free; Temp.Free; end; function IWServerController: TIWServerController;//系统自动生成 begin result := TIWServerController(GServerController); end; function UserSession: TIWUserSession; //系统自动生成 begin result := TIWUserSession(WebApplication.Data); end; procedure TIWServerController.IWServerControllerBaseNewSession(ASession: TIWApplication; var VMainForm: TIWBaseForm);//当有一个新的 Session生成时执行此函数。 begin ASession.Data := TIWUserSession.Create(nil); with UserSession do begin Skin := ASession.Request.CookieFields.Values['Skin']; //载入旧风格 if (Skin = '') or (not DirectoryExists(ASession.ApplicationPath + 'Files\Skin\' + Skin)) then Skin := '1'; //设置默认风格 GSkin := Skin;//将皮肤文件夹名赋值给全局变量GSkin end; end; procedure TIWServerController.IWServerControllerBaseBackButton( ASubmittedSequence, ACurrentSequence: Integer; AFormName: string; var VHandled, VExecute: Boolean);//使 IE的后退按钮有效,通过代码 const DefaultFormName = 'MainForm'; type TIWFormClass = class of TIWForm; var LForm: TIWForm; begin VHandled := True; VExecute := True; if AFormName = '' then AFormName := DefaultFormName; if WebApplication.FindComponent(AFormName) <> nil then begin WebApplication.SetActiveForm(WebApplication.FindComponent(AFormName) as

Page 156: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 156页/共 376页

TIWContainer); end else begin try LForm := TIWFormClass(FindClass('T' + AFormName)).Create(WebApplication); WebApplication.SetActiveForm(LForm); except VHandled := False; end; end; end; //当 ServerController生成时执行此函数,这是程序最先运行的函数。 procedure TIWServerController.IWServerControllerBaseCreate(Sender: TObject); var VLIst: TStringList; begin if not FileExists(GServerController.AppPath + 'files\FilmSystem.ini') then//如果FilmSystem.ini文件不存在则创建该文件并向其中写入 4组数据作为系统默认数据 begin VLIst := TStringList.Create; with VLIst do begin Values['Port'] := '8080'; Values['New'] := '4'; Values['Hot'] := '14'; Values['effect'] := 'false'; end; VLIst.SaveToFile(GServerController.AppPath + 'files\FilmSystem.ini'); VLIst.Free; end; VLIst := TStringList.Create; VLIst.LoadFromFile(GServerController.AppPath + 'files\FilmSystem.ini');//读出该文件内容 self.Port := Strtoint(IIF(VLIst.ValueFromIndex[0], '8080'));//给程序绑定的端口赋值,如果VLIst.ValueFromIndex[0]为空,则赋值为 8080 VLIst.Free; self.CacheDir := self.GetAppPath + 'cache';//设定程序的 CacheDir目录 self.BoundIP:=GetLocalIP;//自动绑定本机 IP,GetLocalIP函数将得到本机 IP,如果没有网络环境,IP为 127.0.0.1 end; //当 Session结束时,释放 UserSession.cn,即该 UserSession创建的数据库连接 procedure TIWServerController.IWServerControllerBaseCloseSession( ASession: TIWApplication); begin UserSession.cn.Free;

Page 157: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 157页/共 376页

end; initialization TIWServerController.SetServerControllerClass; end.

4.1.2.2 UserSessionUnit单元 这个单元很特别。每个用户都拥有这样一个独立的单元,保存在其内的数据不会被别的用户浏览。

所以我们把数据组件放在这里,以保证各用户数据的私有性。各页面要传递的参数我们也事先在这里

设定,要传递的窗口给它赋值,接收的窗口从它取值即可。图 4-1-23为编程时的窗口界面。

图 4-1-23 UserSessionUnit单元编程时的窗口界面

unit UserSessionUnit; interface uses IWUserSessionBase, IWApplication, SysUtils, Classes, DB, ADODB, IWContainer; type TIWUserSession = class(TIWUserSessionBase) NewFilm: Tadoquery; HotFilm: Tadoquery; ListFilm: Tadoquery; ListFilmSource: TDataSource; PlayFlim: Tadoquery; qryUserTable: Tadoquery; dsUserTable: TDataSource; procedure IWUserSessionBaseCreate(Sender: TObject); private { Private declarations } public //以下就是用来传递参数的变量,换种说法:也就是这个程序中只对当前拥有该 Session 用户有效的全局变量 Skin, isEditAppendFilm: string; //是否添加电影 Film: string; //电影名 PlayFilmNum: Integer; //电影连续剧的集数,第 PlayFilmNum集 FilmType: string;//电影分类 FilmSearch: string;//电影搜索字串 FromEdt, ToEdt: Integer; UpFilm: string;

Page 158: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 158页/共 376页

IsFresh: Boolean; isEditAppendUser: string; //是否添加用户 IsRegUser, IsAdmin: Boolean;//是否是注册用户,是否是管理员 UserLoginName: string;//用户登录名 cn: TADOConnection;//共用数据库连接 procedure closesessoion; //响应 IE的关闭事件,关闭所有窗口 { Public declarations} end; implementation uses IWInit,ServerController; {$R *.dfm} //当 Session创建时执行 procedure TIWUserSession.IWUserSessionBaseCreate(Sender: TObject); var i: Integer; begin //创建全局数据连接,关闭 Session时将释放 cn := TADOConnection.Create(self); cn.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + IWServerController.AppPath + 'database\imovie.mdb;Persist Security Info=False';//连接数据库imovie.mdb的连接字串 cn.Open;//打开连接 for i := 0 to self.ComponentCount - 1 do begin//给这个窗口中的所有 Tadoquery控件指定数据库连接为 cn if (self.Components[i] is Tadoquery) then begin (self.Components[i] as Tadoquery).Connection := cn; end; end; end; //关闭所有的窗口,如果它们被创建了的话 procedure TIWUserSession.closesessoion; begin try//按窗口名查找,如果不为空则关闭它 if (WebApplication.FindComponent('AdminForm') as TIWContainer) <> nil then (WebApplication.FindComponent('AdminForm') as TIWContainer).free; if (WebApplication.FindComponent('ListForm') as TIWContainer) <> nil then (WebApplication.FindComponent('ListForm') as TIWContainer).free; if (WebApplication.FindComponent('ModiforAddForm') as TIWContainer) <> nil then (WebApplication.FindComponent('ModiforAddForm') as TIWContainer).free; if (WebApplication.FindComponent('PlayForm') as TIWContainer) <> nil then

Page 159: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 159页/共 376页

(WebApplication.FindComponent('PlayForm') as TIWContainer).free; if (WebApplication.FindComponent('RegForm') as TIWContainer) <> nil then (WebApplication.FindComponent('RegForm') as TIWContainer).free; if (WebApplication.FindComponent('SystemForm') as TIWContainer) <> nil then (WebApplication.FindComponent('SystemForm') as TIWContainer).free; if (WebApplication.FindComponent('UserForm') as TIWContainer) <> nil then (WebApplication.FindComponent('UserForm') as TIWContainer).free; if (WebApplication.FindComponent('MainForm') as TIWContainer) <> nil then (WebApplication.FindComponent('MainForm') as TIWContainer).free; except Exit; end; end; end.

4.1.2.3 FBaseform单元 这个窗口是用来被继承的。所有继承它的窗口都有这个窗口中的元素。所以运行时每个窗口对应

生成的网页都会有这些元素,如果它们的 visible属性不为 false的话。这个窗口有如下功能: 1、供用户输入用户名和密码后登录,如果是普通用户则正常登录,如果是管理员则登录后显示用

于管理的超级链接。点击该超级链接将调用站内管理按钮的 onclick事件代码。 2、点击注册按钮后进入注册页面。 3、可以输入电影名的关键词,点击搜索按钮来进行搜索。 4、为每一继承它的窗口设定 IWTemplateProcessorHTML1 内的 HTML 模板,图 4-1-24 为

Baseform窗口界面。

图 4-1-24 Baseform窗口界面

在窗口的 javascript属性中加入如下代码:(让超级链接在鼠标放上去时自动改变颜色)

var rate = 30; var obj; var act = 0; var elmH = 0; var elmS = 128; var elmV = 255; var clrOrg;

Page 160: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 160页/共 376页

var TimerID; if (navigator.appName.indexOf("Microsoft",0) != -1 && parseInt(navigator.appVersion) >= 4) { Browser = true; } else { Browser = false; } if (Browser) { document.onmouseover = doRainbowAnchor; document.onmouseout = stopRainbowAnchor; } function doRainbow() { if (Browser && act != 1) { act = 1; obj = event.srcElement; clrOrg = obj.style.color; TimerID = setInterval("ChangeColor()",100); } } function stopRainbow() { if (Browser && act != 0) { obj.style.color = clrOrg; clearInterval(TimerID); act = 0; } } function doRainbowAnchor() { if (Browser && act != 1) { obj = event.srcElement; while (obj.tagName != 'A' && obj.tagName != 'BODY') { obj = obj.parentElement; if (obj.tagName == 'A' || obj.tagName == 'BODY') break; } if (obj.tagName == 'A' && obj.href != '') { act = 1; clrOrg = obj.style.color; TimerID = setInterval("ChangeColor()",100); }

Page 161: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 161页/共 376页

} } function stopRainbowAnchor() { if (Browser && act != 0) { if (obj.tagName == 'A') { obj.style.color = clrOrg; clearInterval(TimerID); act = 0; } } } function ChangeColor() { obj.style.color = makeColor(); } function makeColor() { if (elmS == 0) { elmR = elmV; elmG = elmV; elmB = elmV; } else { t1 = elmV; t2 = (255 - elmS) * elmV / 255; t3 = elmH % 60; t3 = (t1 - t2) * t3 / 60; if (elmH < 60) { elmR = t1; elmB = t2; elmG = t2 + t3; } else if (elmH < 120) { elmG = t1; elmB = t2; elmR = t1 - t3; } else if (elmH < 180) { elmG = t1; elmR = t2; elmB = t2 + t3; } else if (elmH < 240) { elmB = t1; elmR = t2; elmG = t1 - t3; } else if (elmH < 300) { elmB = t1; elmG = t2; elmR = t2 + t3; } else if (elmH < 360) { elmR = t1; elmG = t2; elmB = t1 - t3;

Page 162: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 162页/共 376页

} else { elmR = 0; elmG = 0; elmB = 0; } } elmR = Math.floor(elmR); elmG = Math.floor(elmG); elmB = Math.floor(elmB); clrRGB = '#' + elmR.toString(16) + elmG.toString(16) + elmB.toString(16); elmH = elmH + rate; if (elmH >= 360) elmH = 0; return clrRGB; } function Check_Search() { if (SEARCHEDITIWCL.value=="") { alert("请输入查询条件!"); SEARCHEDITIWCL.focus(); return false; } SubmitClickConfirm('SEARCH','', true, ''); } function Check_Users() { var obj = USERIDIWCL; if (obj.value== "") { alert("用户名不能空!"); obj.focus(); return false; } var obj = PASSIWCL; if (obj.value== "") { alert("密码不能空!"); obj.focus(); return false; } SubmitClickConfirm('LOGIN','', true, ''); }

Page 163: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 163页/共 376页

在登录按钮中的 scriptevents属性的 onclick事件中加入如下代码:(Check_Users函数在上面的javascript代码中实现)

Check_Users(); 在搜索按钮中的 scriptevents属性的 onclick事件中加入如下代码:(Check_Search函数在上面的

javascript代码中实现) Check_Search();

unit FBaseform; {页面进入和退出的特效 进入页面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)"> 退出页面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)"> 这个是页面被载入和调出时的一些特效。duration表示特效的持续时间,以秒为单位。transition表示使用哪种特效,取值为 1-23: 0 矩形缩小 1 矩形扩大 2 圆形缩小 3 圆形扩大 4 下到上刷新 5 上到下刷新 6 左到右刷新 7 右到左刷新 8 竖百叶窗 9 横百叶窗 10 错位横百叶窗 11 错位竖百叶窗 12 点扩散 13 左右到中间刷新 14 中间到左右刷新 15 中间到上下 16 上下到中间 17 右下到左上 18 右上到左下 19 左上到右下 20 左下到右上 21 横条 22 竖条 23 以上 22种随机选择一种} interface uses Classes, SysUtils, IWAppForm, IWApplication, IWColor, IWTypes, Controls, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompEdit, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout, IWTemplateProcessorHTML, IWCompLabel, IWCompButton, IWCompRectangle, IWGrids, IWDBGrids, ADODB, DB; type TBaseForm = class(TIWAppForm) UserID: TIWEdit; PASS: TIWEdit; IWTemplateProcessorHTML1: TIWTemplateProcessorHTML; Login: TIWButton; Reg: TIWButton; Label1: TIWRectangle; Label2: TIWRectangle; Search: TIWButton; Searchedit: TIWEdit; Sysbtn: TIWButton; ComGrid0: TIWDBGrid; procedure IWAppFormRender(Sender: TObject); procedure LoginClick(Sender: TObject); procedure RegClick(Sender: TObject);

Page 164: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 164页/共 376页

procedure SearchClick(Sender: TObject); procedure SysbtnClick(Sender: TObject); procedure ComGrid0Columns0Click(ASender: TObject; const AValue: string); public end; implementation uses ServerController, Fadminform, FControl, FRegForm, FSystem, FlistForm, UserSessionUnit; {$R *.dfm} //在页面输出前执行。 procedure TBaseForm.IWAppFormRender(Sender: TObject); procedure changeface;//这个函数的子函数,如果登录已成功,则改变一些控件的属性 var closestr: string; begin closestr := '<script FOR=window EVENT=onunload>if (window.event.clientY <0) ' + '{SubmitClickConfirm(''ComGrid0'',''0_close'', true, '''');window.alert('' 欢 迎 下 次 再 来 !'');}</script>'; // closestr字符串将会被组装到这个窗口要生成的 HTML文件中,由于是 script代码,所以不可见。目的是捕获 IE的关闭事件,将通过 SubmitClickConfirm(''ComGrid0'',''0_close'', true, '''')函数调用窗口中的 ComGrid0控件的索引为 0行的 onclick事件来执行 UserSession.closesessoion函数,以此关闭所有生成的窗口。 Login.Visible := False; Reg.Visible := False; UserID.Visible := False; PASS.Visible := False; Label2.Visible := False; Label1.Text := '' + GetHourStr + '好,<strong>' + UserSession.UserLoginName + '</strong>' + closestr;//在此出现问候代码并组装 closestr字符串 if UserSession.IsAdmin then begin//如果是管理员 Label2.Visible := True; Label2.Text := '<a href="#none" onclick="return SubmitClickConfirm(''SYSBTN'','''', true, '''');">【站内管理】</a>';//显示站内管理超级链接,通过 SubmitClickConfirm(''SYSBTN'','''', true, '''')将调用SYSBTN按钮的 onclick事件代码。 end; end; var VLIst: TStringList; closestr: string; begin closestr := '<script FOR=window EVENT=onunload>if (window.event.clientY <0) ' + '{SubmitClickConfirm(''ComGrid0'',''0_close'', true, '''');window.alert(''欢迎下次再来!'');}</script>'; Label1.Text := '用户' + closestr; VLIst := TStringList.Create;

Page 165: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 165页/共 376页

VLIst.LoadFromFile(WebApplication.ApplicationPath + 'files\FilmSystem.ini'); //导入系统的相关信息 StyleSheet.Filename := 'Files\Skin\' + UserSession.Skin + '\style.css'; IWTemplateProcessorHTML1.Templates.Default := UserSession.Skin + '\' + WebApplication.ActiveForm.Name + '.Html';//指定本窗口的HTML模板文件,默认目录已为 templates if StrToBoolDef(VLIst.ValueFromIndex[3], False) then //是否支持页面特效 ExtraHeader.Text := '<meta HTTP-EQUIV="Page-Enter" CONTENT="revealtrans(duration=0.5, transition=23)">';//在网页的 Header中嵌入网页特效代码 VLIst.Free; if UserSession.IsRegUser then changeface; //如果是注册会员的话改变页面 end; //点击登录按钮 procedure TBaseForm.LoginClick(Sender: TObject); begin with UserSession.qryUserTable do begin//调用 UserSession.qryUserTable进行查询处理 Close; SQL.Clear; SQL.Add('select * from usertables where userid=:1 and passwords=:2'); Parameters[0].Value := UserID.Text; Parameters[1].Value := PASS.Text; Open; if not IsEmpty then begin if FieldByname('admin').AsBoolean = True then begin //如果是管理员,给 UserSession中的共用参数赋值 UserSession.IsAdmin := True; UserSession.IsRegUser := True; UserSession.UserLoginName := UserID.Text; if not ShowForm('SystemForm') then TSystemForm.Create(WebApplication).Show;//显示管理界面 end else begin //如果是普通用户,给 UserSession中的共用参数赋值 UserSession.IsRegUser := True; UserSession.UserLoginName := UserID.Text; end; Edit; // 编辑数据库改变登录次数 FieldByname('LoginCount').AsInteger := FieldByname('LoginCount').AsInteger + 1; Post; end else begin//如果数据查询为 0条记录则给出提示信息 WebApplication.ShowMessage('系统无此用户名,请确定用户名,和密码输入是否正确!'); end; end;

Page 166: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 166页/共 376页

//以下清空三个转入框 UserID.Text := ''; PASS.Text := ''; Searchedit.Text := ''; end; //点击注册按钮后进入注册页面 procedure TBaseForm.RegClick(Sender: TObject); begin if not ShowForm('RegForm') then TRegForm.Create(WebApplication).Show; end; procedure TBaseForm.SearchClick(Sender: TObject);//点击搜索按钮来进行搜索 begin UserSession.FilmSearch := Searchedit.Text;//给 UserSession中的 FilmSearch参数赋值 Searchedit.Text := '';//清空输入 if not ShowForm('ListForm') then TListForm.Create(WebApplication).Show;//显示电影列表页面,这个窗口将自动提取 UserSession.FilmSearch的值进行数据查询后显示结果。 end; //点击站内管理按钮打开管理页面 procedure TBaseForm.SysbtnClick(Sender: TObject); begin if not ShowForm('SystemForm') then TSystemForm.Create(WebApplication).Show; end; //被页面的 SubmitClickConfirm(''ComGrid0'',''0_close'', true, '''')调用 procedure TBaseForm.ComGrid0Columns0Click(ASender: TObject;const AValue: string); begin UserSession.closesessoion;//关闭所有生成的窗口,并结束这个 Session end; end.

4.1.2.4 FMainForm单元 这是主页面,程序运行时显示的第一个页面。这是从窗口 BaseForm 继承的。在这个窗口中新加

了三个控件:NewFilm: TIWRectangle, HotFilm: TIWRectangle, ComGrid: TIWDBGrid。我们将在 NewFilm 中输出最新电影列表,在 HotFilm 中输出点击排行榜电影列表。ComGrid 是用来编写页面超级链接所要引用的窗口函数的。窗口界面如图 4-1-25:

Page 167: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 167页/共 376页

图 4-1-25 MainForm窗口界面

unit FMainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FBaseform, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompEdit, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout, IWTemplateProcessorHTML, IWCompLabel, IWCompButton, IWCompRectangle, IWGrids, IWDBGrids, IWCompListbox; type TMainForm = class(TBaseForm) NewFilm: TIWRectangle; ComGrid: TIWDBGrid; HotFilm: TIWRectangle; procedure IWAppFormRender(Sender: TObject); procedure ComGridColumns0Click(ASender: TObject; const AValue: string); procedure ComGridColumns1Click(ASender: TObject; const AValue: string); procedure IWAppFormCreate(Sender: TObject); procedure ComGrid0Columns0Click(ASender: TObject; const AValue: String); private { Private declarations } public

NewFilm: TIWRectangle

HotFilm: TIWRectangle

ComGrid: TIWDBGrid

Page 168: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 168页/共 376页

{ Public declarations } end; var MainForm: TMainForm; implementation uses ServerController, FlistForm, FplayForm, FSystem; {$R *.dfm} procedure TMainForm.IWAppFormRender(Sender: TObject); var VLIst: TStringList; New, Hot: Integer; begin inherited; VLIst := TStringList.Create; VLIst.LoadFromFile(WebApplication.ApplicationPath + 'files\FilmSystem.ini');// 读 取

FilmSystem.ini文件中我们设置的显示新电影的部数和显示点击排行榜的电影部数。 New := Strtoint(IIF(VLIst.ValueFromIndex[1], '4')); Hot := Strtoint(IIF(VLIst.ValueFromIndex[2], '14')); VLIst.Free; NewFilm.Text := NewFilms(UserSession.NewFilm, New);//调用在 ServerController 单元中的NewFilms函数生成最新电影列表的 HTML代码,大家可以查看原函数。 HotFilm.Text := HotFilms(UserSession.HotFilm, Hot); //调用在 ServerController单元中的 HotFilms函数,生成点击排行榜电影列表的 HTML代码,大家可以查看原函数。 end; //页面上实现播放功能的超级链接所调用的函数。 procedure TMainForm.ComGridColumns0Click(ASender: TObject; const AValue: string); begin inherited; UserSession.Film := AValue;//给 UserSession中的 Film参数赋值,Avalue是从页面传递来的电影名,页面中的函数为 SubmitClickConfirm('ComGrid','0_舞街,绝对经典', true, ''),第二个参数下划线后的字串将会赋值给 Avalue。从这里可以看出,这个窗口要传递电影名给 PlayForm 窗口是通过

UserSession中的 Film参数来实现的。 if not ShowForm('PlayForm') then TPlayForm.Create(WebApplication).Show;//显示播放页面,自动播放电影名为 UserSession.Film的电影。 end; //这个函数是用来响应页面的电影分类超级链接的。页面代码为<a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_爱情片', true, '');">爱情片</a>,此处 Avalue将被赋值为爱情片 procedure TMainForm.ComGridColumns1Click(ASender: TObject; const AValue: string); begin

Page 169: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 169页/共 376页

inherited; if AValue = 'MainForm' then begin if not ShowForm('MainForm') then TMainForm.Create(WebApplication).Show; end else begin UserSession.FilmType := AValue;// 给 UserSession中的 FilmType参数赋值 if not ShowForm('ListForm') then TListForm.Create(WebApplication).Show; //显示电影列表页面,按以下电影分类 UserSession.FilmType查询电影。 end; end; //这是一个可以不要的函数,当 IE中输入 http://IP:端口/?admin=administrator时,页面打开后是管理员的身份。这相当于一个后门吧。 procedure TMainForm.IWAppFormCreate(Sender: TObject); var IsAdmin: string; begin inherited; IsAdmin := WebApplication.RunParams.Values['admin'];//取得从 IE地址栏传递过来的 admin参数的值 if IsAdmin = 'administrator' then begin UserSession.IsAdmin := True; UserSession.IsRegUser := True; UserSession.UserLoginName := '管理员'; end; end; initialization TMainForm.SetAsMainForm; RegisterClass(TMainForm); end.

4.1.2.5 FlistForm单元 这个页面用来显示查询(点击查询按钮或点击分类超级链接)到的电影列表。这是从窗口BaseForm

继承的。在这个窗口中新加了三个控件:ListGrid: TIWDBGrid, Page: TIWRectangle,ComGrid: TIWDBGrid。ListGrid 中将显示电影列表,Page 中将显示分页导航条,ComGrid 用来响应页面的中的相应超级链接。窗口界面如图 4-1-26:

Page 170: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 170页/共 376页

图 4-1-26 ListForm窗口界面

unit FlistForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FBaseform, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout, IWTemplateProcessorHTML, IWCompRectangle, IWCompButton, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompEdit, IWGrids, IWDBGrids; type TListForm = class(TBaseForm) ListGrid: TIWDBGrid; Page: TIWRectangle; ComGrid: TIWDBGrid; procedure IWAppFormRender(Sender: TObject); procedure ListGridRenderCell(ACell: TIWGridCell; const ARow, AColumn: Integer); procedure ComGridColumns0Click(ASender: TObject; const AValue: string); procedure ComGridColumns1Click(ASender: TObject; const AValue: string); procedure ComGridColumns2Click(ASender: TObject; const AValue: string); procedure ComGrid0Columns0Click(ASender: TObject; const AValue: String); private { Private declarations }

ListGrid: TIWDBGrid

Page: TIWRectangle

ComGrid: TIWDBGrid

Page 171: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 171页/共 376页

public FilmType: string; { Public declarations } end; var ListForm: TListForm; implementation uses ServerController, FplayForm, FMainForm; {$R *.dfm} //页面输出前执行,分三种情况进行查找 procedure TListForm.IWAppFormRender(Sender: TObject); begin inherited; if UserSession.FilmSearch <> '' then begin //查找 1,如果搜索字符串不为空,按电影名称查找 with UserSession.ListFilm do begin Close; SQL.Clear; SQL.Add('select * from movie where title like' + QuotedStr('%' + UserSession.FilmSearch + '%')); Open; end; UserSession.FilmSearch := ''; end; if (UserSession.FilmType <> '') and (UserSession.FilmType <> 'All') then begin//查找 2,如果电影类型不为空且不为 All,则按电影类型查找 with UserSession.ListFilm do begin Close; SQL.Clear; SQL.Text := 'select * from movie where typeid=''' + UserSession.FilmType + ''' and IsDate(Movie.dateandtime) ORDER BY datevalue(Movie.dateandtime) DESC'; Open; end; end; if UserSession.FilmType = 'All' then begin//查找 3,如果电影类型为 All,则显示所有电影 with UserSession.ListFilm do begin Close; SQL.Clear; SQL.Text := 'select * from movie '; Open; end; end;

Page 172: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 172页/共 376页

UserSession.FilmType := '';//清空给电影类型的赋值 ListGrid.DataSource := UserSession.ListFilmSource;//给 ListGrid.DataSource赋值,下面这个函数ListGridRenderCell执行才有意义 Page.Text := GetToolStr(ListGrid.DataSource.DataSet.RecNo, ListGrid.DataSource.DataSet.RecordCount, ListGrid.RowLimit, 0, 6, ' 部 电 影 ');// 调 用 在ServerController单元中的 GetToolStr函数,在 Page框中生成分页导航条,请查看 ServerController单元内的原函数说明。 end; //当 ListGrid 在页面中输出前执行,在 IWAppFormRender 执行之后执行。目的是给表格手工赋值,请仔细研究学会使用。ListGrid已经被设定成只有一列,在其 columns属性中可以看到。 procedure TListForm.ListGridRenderCell(ACell: TIWGridCell; const ARow, AColumn: Integer); var Temp: TStringList; Pic: string; Memo: string; begin inherited; Temp := TStringList.Create; try if ListGrid.DataSource.DataSet.IsEmpty then//如果查询到的电影数量为 0,则退出 exit; if (AColumn = 0) and (ARow > 0) then//确保是在 ListGrid第一列,从第三行开始 begin with ListGrid.DataSource.DataSet do begin Temp.Clear; Temp.LoadFromFile(WebApplication.ApplicationPath + '\files\Skin\' + GSkin + '\ListFilm.Html');//导入模板 ListFilm.Html,显示效果如图 4-1-27(相当于 ListGrid的每一个 cell 中输入一个表格)。格式化显示 ListGrid.DataSource.DataSet的一条记录。

图 4-1-27 ListFilm.Html在 IE中的视图 Pic := ''; Memo := Pic; Pic := pictureString(FieldByname('url').AsString, 'med');//生成显示图片的 HTML代码 if Length(FieldByname('content').AsString) >= 250 then//电影介绍如果超过 250个则用....代

Page 173: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 173页/共 376页

替 Memo := Copy(FieldByname('content').AsString, 0, 250) + '....' else Memo := FieldByname('content').AsString; Temp.Text := StringReplace(Temp.Text, 'Pic', GetLinkString('2', FieldByname('title').AsString, Pic), [rfReplaceAll]);// 有超级链接,传递的参数是 title字段内容,网页上显示的是 Pic所表示的图片 Temp.Text := StringReplace(Temp.Text, 'title', GetLinkString('2', FieldByname('title').AsString, FieldByname('title').AsString), [rfReplaceAll]); //有超级链接,传递的参数是 title字段内容,网页上显示的是 title字段内容 Temp.Text := StringReplace(Temp.Text, 'Author', FieldByname('name').AsString, [rfReplaceAll]);// 没有超级链接,仅将 Author替换成 Author字段内容 Temp.Text := StringReplace(Temp.Text, 'Memo', Memo, [rfReplaceAll]); // 没有超级链接,仅将 Memo替换成Memo所代表的 content字段内容 ACell.Text := Temp.Text;//给当前 cell赋值 end; end; except ACell.Text := Temp.Text; end; Temp.Free; end; procedure TListForm.ComGridColumns0Click(ASender: TObject; const AValue: string); begin inherited; SetPage(ListGrid, AValue); // 调用在 ServerController单元中的 SetPage函数,响应在 Page框中生成的分页导航条链接,跳到相应页面。请查看 ServerController单元内的原函数说明。 end; //这个函数是用来响应页面的电影分类超级链接的。页面代码为<a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_爱情片', true, '');">爱情片</a>,此处 Avalue将被赋值为爱情片 procedure TListForm.ComGridColumns1Click(ASender: TObject; const AValue: string); begin inherited; if AValue = 'MainForm' then//点击首页时 begin if not ShowForm('MainForm') then TMainForm.Create(WebApplication).Show; end else begin UserSession.FilmType := AValue;//点击其它分类链接时 end; end;

Page 174: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 174页/共 376页

//当点击图片和电影标题的链接时执行播放电影界面 procedure TListForm.ComGridColumns2Click(ASender: TObject;const AValue: string); begin inherited; if not ShowForm('PlayForm') then TPlayForm.Create(WebApplication).Show; UserSession.Film := AValue;//给 PlayForm窗口传递电影名 end; initialization RegisterClass(TListForm); end.

4.1.2.6 FRegForm单元 这个页面用来进行新用户注册和修改注册信息。这是从窗口 BaseForm 继承的。在这个窗口中新

加了 8 个控件:RegBtn: TIWButton,ResetBtn: TIWButton, Boy: TIWRadioButton,Girl: TIWRadioButton, CheckPass: TIWEdit,UserName: TIWEdit,PassWord: TIWEdit,Email: TIWEdit,ComGrid: TIWDBGrid。RegBtn是添加按钮,ResetBtn是返回按钮,ComGrid用来响应页面的中的相应超级链接,其余的就不用介绍了。窗口界面如图 4-1-28:

图 4-1-28 RegForm窗口界面

unit FRegForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FBaseform, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout, IWTemplateProcessorHTML, IWCompRectangle, IWCompButton, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompEdit, IWCompRadioButton, IWDBStdCtrls,

ComGrid: TIWDBGrid

Page 175: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 175页/共 376页

DB, ADODB, IWGrids, IWDBGrids; type TRegForm = class(TBaseForm) RegBtn: TIWButton; ResetBtn: TIWButton; Boy: TIWRadioButton; Girl: TIWRadioButton; CheckPass: TIWEdit; UserName: TIWEdit; PassWord: TIWEdit; Email: TIWEdit; ComGrid: TIWDBGrid; procedure RegBtnClick(Sender: TObject); procedure IWAppFormRender(Sender: TObject); procedure ComGridColumns1Click(ASender: TObject; const AValue: string); procedure ResetBtnClick(Sender: TObject); procedure ComGrid0Columns0Click(ASender: TObject; const AValue: String); private { Private declarations } public procedure Textclear; { Public declarations } end; var RegForm: TRegForm; implementation uses ServerController, FMainForm, FlistForm, FSystem; {$R *.dfm} //清除所有输入框中的字符 procedure TRegForm.Textclear; var i: Integer; begin for i := 0 to self.ComponentCount - 1 do begin if (self.Components[i] is TIWEdit) then (self.Components[i] as TIWEdit).Text := ''; end; end; //按下添加按钮后执行 procedure TRegForm.RegBtnClick(Sender: TObject); function GetSex: string;//得到用户所选择的性别,这是一个子函数 begin

Page 176: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 176页/共 376页

if Boy.Checked = True then result := '男' else result := '女'; end; var TemUserTable: Tadoquery; begin inherited; TemUserTable := Tadoquery.Create(self);//创建临时查询表 TemUserTable.Connection :=UserSession.cn; if RegBtn.Caption = '添加' then begin//如果 RegBtn按钮显示为添加时,则执行插入一个新记录 try with TemUserTable do begin Close; SQL.Clear; SQL.Add('insert into Usertables(userid,passwords,sex,email,Regtime) values(:1,:2,:3,:4,:5)'); Parameters[0].Value := Trim(UserName.Text); Parameters[1].Value := Trim(PassWord.Text); Parameters[2].Value := GetSex; Parameters[3].Value := Trim(Email.Text); Parameters[4].Value := DateToStr(Date); ExecSQL; WebApplication.ShowMessage('恭喜注册成功'); end; except UserName.Text := UserSession.qryUserTable.SQL.Text;//如果插入不成功,则表示有重名了 WebApplication.ShowMessage('用户名重复,请重新输入!'); end; end else begin//如果 RegBtn按钮不显示为添加时(显示为修改),则执行修改用户记录 try with TemUserTable do begin Close; SQL.Clear; SQL.Add('Update Usertables set Passwords=:1,Sex=:2,email=:3 where userid=:4'); Parameters[0].Value := Trim(PassWord.Text); Parameters[1].Value := GetSex; Parameters[2].Value := Trim(Email.Text); Parameters[3].Value := Trim(UserName.Text); ExecSQL; WebApplication.ShowMessage('恭喜修改成功'); end;

Page 177: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 177页/共 376页

except end; end; TemUserTable.Free; end; //输出该网页时执行 procedure TRegForm.IWAppFormRender(Sender: TObject); procedure SetSex(Istring: string);//得到用户所选择的性别 begin if Istring = '男' then Boy.Checked := True else Girl.Checked := True; end; begin inherited; if UserSession.isEditAppendUser <> '' then begin//如果是修改用户时 RegBtn.Caption := '修改'; with UserSession.qryUserTable do begin UserName.Text := FieldByname('userid').AsString; PassWord.Text := FieldByname('Passwords').AsString; CheckPass.Text := FieldByname('Passwords').AsString; Email.Text := FieldByname('email').AsString; SetSex(FieldByname('Sex').AsString); end; UserName.ReadOnly := True;//用户名不让改 UserSession.isEditAppendUser := ''; end else begin//如果是添加用户 RegBtn.Caption := '添加'; Textclear;//清除所有输入框中的字符 UserName.ReadOnly := False; //用户名输入框可以编辑 end; end; //这个函数是用来响应页面的电影分类超级链接的。例如爱情片的页面代码为<a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_爱情片', true, '');">爱情片</a>,此处 Avalue将被赋值为爱情片 procedure TRegForm.ComGridColumns1Click(ASender: TObject; const AValue: string); begin inherited; if AValue = 'MainForm' then//点击首页时 begin

Page 178: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 178页/共 376页

if not ShowForm('MainForm') then TMainForm.Create(WebApplication).Show; end else begin UserSession.FilmType := AValue; if not ShowForm('ListForm') then TListForm.Create(WebApplication).Show; end; end; procedure TRegForm.ResetBtnClick(Sender: TObject);//回到首页 begin inherited; if not ShowForm('MainForm') then TSystemForm.Create(WebApplication).Show; end; end; initialization RegisterClass(TRegForm); end.

4.1.2.7 FplayForm单元 这个页面用来进行播放电影的界面。这是从窗口 BaseForm继承的。在这个窗口中新加了 2个控

件:PlayFilm: TIWRectangle,ComGrid: TIWDBGrid,PlayFilm 中将输出播放电影的播放器和相关的电影信息,将调用 ServerController单元中的 PlayFilms函数来生成 HTML代码,ComGrid用来响应页面的中的相应超级链接。窗口界面如图 4-1-29:

图 4-1-29 playForm窗口界面

unit FplayForm;

ComGrid: TIWDBGrid

PlayFilm: TIWRectangle

Page 179: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 179页/共 376页

interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FBaseform, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout, IWTemplateProcessorHTML, IWCompRectangle, IWCompButton, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompEdit, IWGrids, IWDBGrids; type TPlayForm = class(TBaseForm) PlayFilm: TIWRectangle; ComGrid: TIWDBGrid; procedure IWAppFormRender(Sender: TObject); procedure ComGridColumns1Click(ASender: TObject; const AValue: string); procedure ComGridColumns0Click(ASender: TObject; const AValue: string); procedure ComGrid0Columns0Click(ASender: TObject; const AValue: String); private { Private declarations } public { Public declarations } end; var PlayForm: TPlayForm; implementation uses ServerController, FMainForm, FlistForm; {$R *.dfm} procedure TPlayForm.IWAppFormRender(Sender: TObject); begin inherited; if UserSession.IsRegUser then//如果是注册用户,则调用 ServerController单元中的 PlayFilms函数来生成 HTML代码,请参考 ServerController单元相应代码 PlayFilm.Text := PlayFilms(UserSession.PlayFlim, UserSession.Film, UserSession.PlayFilmNum) else PlayFilm.Text := '请注册后才可以观看电影!'; UserSession.PlayFilmNum := 0;//将播放集数设为 0 end; //请参考前一单元 procedure TPlayForm.ComGridColumns1Click(ASender: TObject; const AValue: string); begin inherited;

Page 180: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 180页/共 376页

if AValue = 'MainForm' then begin if not ShowForm('MainForm') then TMainForm.Create(WebApplication).Show; end else begin UserSession.FilmType := AValue; if not ShowForm('ListForm') then TListForm.Create(WebApplication).Show; end; end; //响应此页中播放集数的超级链接 procedure TPlayForm.ComGridColumns0Click(ASender: TObject; const AValue: string); begin inherited; UserSession.PlayFilmNum := Strtoint(AValue);//给播放集数赋值 end; initialization RegisterClass(TPlayForm); end.

4.1.2.8 FSystem单元 这个页面用来设定 files\FilmSystem.ini 文件内容的,也是系统的一些设定参数。这是从窗口

BaseForm 继承的。在这个窗口中新加了 9 个控件:EdtPort: TIWEdit,EdtNewFilm: TIWEdit,EdtHotFilm: TIWEdit, FilmControl: TIWRectangle,UserControl: TIWRectangle,IWCheckBox1: TIWCheckBox,AffirmBtn: TIWButton,ReturnBtn: TIWButton,ComGrid: TIWDBGrid;,EdtPort为输入端口,EdtNewFilm 为首页最新电影列表记录数,EdtHotFilm 为首页万里排行榜电影列表的记录数,FilmControl 输出电影控制的超级链接:【添加】【修改,删除】,UserControl 输出用户控制的超级链接:【添加】【修改,删除】,IWCheckBox1设定是否使用页面特效,AffirmBtn 保存信息,ReturnBtn 返回显示首页,ComGrid用来响应页面的中的相应超级链接。窗口界面如图 4-1-30:

Page 181: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 181页/共 376页

图 4-1-30 SystemForm窗口界面

unit FSystem; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FBaseform, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout, IWTemplateProcessorHTML, IWCompRectangle, IWCompButton, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompEdit, IWCompCheckbox, IniFiles, IWGrids, IWDBGrids, Iwhtmltag; type TSystemForm = class(TBaseForm) EdtPort: TIWEdit; EdtNewFilm: TIWEdit; EdtHotFilm: TIWEdit; FilmControl: TIWRectangle; UserControl: TIWRectangle; IWCheckBox1: TIWCheckBox; AffirmBtn: TIWButton; ReturnBtn: TIWButton; ComGrid: TIWDBGrid; procedure IWAppFormRender(Sender: TObject); procedure AffirmBtnClick(Sender: TObject); procedure IWAppFormCreate(Sender: TObject); procedure ComGridColumns2Click(ASender: TObject; const AValue: string); procedure ComGridColumns1Click(ASender: TObject; const AValue: string); procedure ComGridColumns3Click(ASender: TObject; const AValue: string); procedure EdtPortHTMLTag(ASender: TObject; ATag: TIWHTMLTag); procedure ReturnBtnClick(Sender: TObject); procedure ComGrid0Columns0Click(ASender: TObject; const AValue: String); private { Private declarations } public myinifile: TInifile; { Public declarations } end; var SystemForm: TSystemForm; implementation uses FRegForm, ServerController, FplayForm, FMainForm, FlistForm, FControl, Fadminform, FUserForm;

Page 182: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 182页/共 376页

{$R *.dfm} procedure TSystemForm.IWAppFormRender(Sender: TObject); var VLIst: TStringList; begin inherited; VLIst := TStringList.Create; VLIst.LoadFromFile(WebApplication.ApplicationPath + 'files\FilmSystem.ini'); //导入 files\FilmSystem.ini文件内容,分别填入以下 4个输入框中,如果值为空,则雨填入默认值。 EdtPort.Text := IIF(VLIst.ValueFromIndex[0], '8080'); EdtNewFilm.Text := IIF(VLIst.ValueFromIndex[1], '4'); EdtHotFilm.Text := IIF(VLIst.ValueFromIndex[2], '14'); IWCheckBox1.Checked := StrToBoolDef(VLIst.ValueFromIndex[3], False); VLIst.Free; FilmControl.Text := GetSpace(1) + GetLinkString('2', 'append', '【添加】 ') + GetSpace(1) + GetLinkString('2', 'appendOrDelete', '【修改 ,删除】 ');//生成对电影操作的链接,函数ComGridColumns2Click 将响应此链接,根据传递的参数不同 append 或者 appendOrDelete 执行不同的代码 UserControl.Text := GetSpace(1) + GetLinkString('3', 'append', '【添加】 ') + GetSpace(1) + GetLinkString('3', 'appendOrDelete', '【修改 ,删除】 '); //生成对用户操作的链接,函数ComGridColumns3Click 将响应此链接,根据传递的参数不同 append 或者 appendOrDelete 执行不同的代码 end; //点击保存按钮后 procedure TSystemForm.AffirmBtnClick(Sender: TObject); var VLIst: TStringList; begin inherited; VLIst := TStringList.Create; with VLIst do begin Values['Port'] := IIF(EdtPort.Text, '8080'); Values['New'] := IIF(EdtNewFilm.Text, '4'); Values['Hot'] := IIF(EdtHotFilm.Text, '14'); Values['effect'] := BoolToStr(IWCheckBox1.Checked); end; VLIst.SaveToFile(WebApplication.ApplicationPath + 'files\FilmSystem.ini');

//将 4组数据存成文件:files\FilmSystem.ini,如图 4-1-31:

Page 183: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 183页/共 376页

图 4-1-31 文件 FilmSystem.ini显示内容

VLIst.Free; end; //当窗口生成时,在这页中这个最先执行 procedure TSystemForm.IWAppFormCreate(Sender: TObject); var VLIst: TStringList; begin inherited; if not FileExists(WebApplication.ApplicationPath + 'files\FilmSystem.ini') then//如果文件不存在则初始化并生成该文件 begin VLIst := TStringList.Create; with VLIst do begin Values['Port'] := '8080'; Values['New'] := '4'; Values['Hot'] := '14'; Values['effect'] := 'false'; end; VLIst.SaveToFile(WebApplication.ApplicationPath + 'files\FilmSystem.ini'); VLIst.Free; end; end; // 响应添加 ,删除电影超级链接 procedure TSystemForm.ComGridColumns2Click(ASender: TObject;const AValue: string); begin inherited; if AValue = 'append' then begin//如果是增加电影,打开电影文件管理窗口 if not ShowForm('ModiforAddForm') then TModiforAddForm.Create(WebApplication).Show; UserSession.isEditAppendFilm := Avalue;//将 append值赋值给 UserSession.isEditAppendFilm end

Page 184: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 184页/共 376页

else begin//如果是编辑电影,将 UserSession.FilmType赋值为 All,再打开 adminForm 窗口,这里将显示所有的电影文件,每一条记录都有编辑和删除按钮 UserSession.FilmType := 'All'; if not ShowForm('adminForm') then TAdminForm.Create(WebApplication).Show; end; end; //参考前面单元 procedure TSystemForm.ComGridColumns1Click(ASender: TObject; const AValue: string); begin inherited; if AValue = 'MainForm' then begin if not ShowForm('MainForm') then TMainForm.Create(WebApplication).Show; end else begin UserSession.FilmType := AValue; if not ShowForm('ListForm') then TListForm.Create(WebApplication).Show; end; end; // 响应添加,删除用户超级链接 procedure TSystemForm.ComGridColumns3Click(ASender: TObject;const AValue: string); begin inherited; if AValue = 'append' then begin//如果是增加用户,打开 RegForm窗口 if not ShowForm('RegForm') then TRegForm.Create(WebApplication).Show; UserSession.isEditAppendUser := ''; end else begin//如果是编辑用户,将 UserSession.isEditAppendUser赋值为 All,再打开 UserForm窗口,这里将显示所有的用户,每一条记录都有编辑和删除按钮 UserSession.isEditAppendUser := 'all'; if not ShowForm('UserForm') then TUserform.Create(WebApplication).Show; end; end; // EdtPort的 HTML代码中加入 javascropt代码 procedure TSystemForm.EdtPortHTMLTag(ASender: TObject; ATag: TIWHTMLTag); begin inherited; ATag.AddStringParam('onpaste', 'return false;');//当粘贴时,不让执行 end;

Page 185: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 185页/共 376页

procedure TSystemForm.ReturnBtnClick(Sender: TObject);//显示主页面 begin inherited; if not ShowForm('MainForm') then TMainForm.Create(WebApplication).Show; end; initialization RegisterClass(TSystemForm); end.

Page 186: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 186页/共 376页

4.1.2.9 FUserForm单元 这个页面用来所有用户列表,在点击管理页面的用户【修改,删除】按钮后出现,每一条记录都有

编辑和删除的超级链接。这也是从窗口 BaseForm继承的。在这个窗口中新加了 3个控件: ListUser: TIWDBGrid,Page: TIWRectangle ,ComGrid: TIWDBGrid。ListUser 用来显示注册用户列表,Page 用来显示 ListUser 列表的分页导航条,ComGrid 用来响应页面的中的相应超级链接。窗口界面如图4-1-32:

图 4-1-32 Userform窗口界面

unit FUserForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FBaseform, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout, IWTemplateProcessorHTML, IWCompRectangle, IWCompButton, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompEdit, IWGrids, IWDBGrids; type TUserform = class(TBaseForm) Page: TIWRectangle; ComGrid: TIWDBGrid;

ComGrid: TIWDBGrid

ListUser: TIWRectangle

Page: TIWRectangle

Page 187: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 187页/共 376页

ListUser: TIWDBGrid; procedure ComGridColumns0Click(ASender: TObject; const AValue: string); procedure ComGridColumns1Click(ASender: TObject; const AValue: string); procedure ComGridColumns2Click(ASender: TObject; const AValue: string); procedure ComGridColumns3Click(ASender: TObject; const AValue: string); procedure ListUserRenderCell(ACell: TIWGridCell; const ARow, AColumn: Integer); procedure IWAppFormRender(Sender: TObject); procedure ComGrid0Columns0Click(ASender: TObject; const AValue: String); private { Private declarations } public { Public declarations } end; var UserForm: TUserform; implementation uses ServerController, FRegForm, FMainForm, FlistForm; {$R *.dfm} procedure TUserform.ComGridColumns0Click(ASender: TObject; const AValue: string); begin inherited; SetPage(ListUser, AValue); // 调用在 ServerController单元中的 SetPage函数,响应在 Page框中生成的分页导航条链接,跳到相应页面。请查看 ServerController单元内的原函数说明。 end; //这个函数是用来响应页面的电影分类超级链接的。例如爱情片的页面代码为<a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_爱情片', true, '');">爱情片</a>,此处 Avalue将被赋值为爱情片 procedure TUserform.ComGridColumns1Click(ASender: TObject;const AValue: string); begin inherited; if AValue = 'MainForm' then begin if not ShowForm('MainForm') then TMainForm.Create(WebApplication).Show; end else begin UserSession.FilmType := AValue; if not ShowForm('ListForm') then TListForm.Create(WebApplication).Show; end; end;

Page 188: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 188页/共 376页

//响应页面中的“修改”超级链接,从链接代码可以看出,此处 AValue 为 Modify。 procedure TUserform.ComGridColumns2Click(ASender: TObject;const AValue: string); begin inherited; if not ShowForm('RegForm') then TRegForm.Create(WebApplication).Show;//打开用户注册窗口页面 UserSession.isEditAppendUser := AValue;//将 UserSession.isEditAppendUser赋值为Modify,这样用户注册窗口 RegForm打开时就会在页面中事先显示用户已注册的信息,以便修改。 end; procedure TUserform.ComGridColumns3Click(ASender: TObject;const AValue: string); begin inherited; //响应删除超级链接,超级链接将用户名传递给 AValue UserSession.qryUserTable.Locate('userid', AValue, []);//在数据库中找到该用户 UserSession.qryUserTable.Delete;//删除该用户 end; // ListUser只有一列,当给单元格赋值时执行 procedure TUserform.ListUserRenderCell(ACell: TIWGridCell; const ARow, AColumn: Integer); var Temp: TStringList; begin inherited; Temp := TStringList.Create; if ListUser.DataSource.DataSet.IsEmpty then//如果 ListUser查询的注册用户数为 0则退出此函数的执行 exit; if (AColumn = 0) and (ARow > 0) then//如果当前单元格是第一列,且不是第一行 begin with ListUser.DataSource.DataSet do begin Temp.Clear; Temp.LoadFromFile(WebApplication.ApplicationPath + '\files\Skin\' + GSkin + '\UserFilm.html');//导入\files\Skin\1\UserFilm.html皮肤模板文件,显示效果如图 4-1-33:

图 4-1-33 UserFilm.html在 IE中的视图

以下代码为替换相应的字符为我们所需要的代码 Temp.Text := StringReplace(Temp.Text, 'User', FieldByname('Userid').AsString, [rfReplaceAll]);//将 User替换成 Userid字段内容 Temp.Text := StringReplace(Temp.Text, 'Sex', FieldByname('Sex').AsString, [rfReplaceAll]); //

Page 189: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 189页/共 376页

将 Sex替换成 Sex字段内容 Temp.Text := StringReplace(Temp.Text, 'LoginCount', FieldByname('LoginCount').AsString, [rfReplaceAll]); //将 LoginCount替换成 LoginCount字段内容 Temp.Text := StringReplace(Temp.Text, 'DateTime', FieldByname('RegTime').AsString, [rfReplaceAll]); //将 DateTime替换成 DateTime字段内容 Temp.Text := StringReplace(Temp.Text, 'Modify', GetLinkString('2', FieldByname('userid').AsString, '修改'), [rfReplaceAll]); //将 Modify替换成“修改”链接,传递要删除的用户名 userid Temp.Text := StringReplace(Temp.Text, 'Del', Format('<a href="#none" onclick="deleteUser(' + QuotedStr(FieldByname('userid').AsString) + ')";>%S</a>',['删除']), [rfReplaceAll]); //显示在浏览器的“删除”超级链接,在窗口的 javascript属性中的最下面加入以下三行 javascript代码: function deleteUser(del) { if(confirm("你确定要删除 "+del+" 用户吗?")) {return SubmitClickConfirm('ComGrid','3_'+del+'', true, '');}} ACell.Text := Temp.Text;//将得到的 HTML代码赋值给这个单元格 end; end; Temp.Free; end; procedure TUserform.IWAppFormRender(Sender: TObject); begin inherited; if UserSession.isEditAppendUser = 'all' then begin//如果条件成立 with UserSession.qryUserTable do begin//查询所有用户 Close; SQL.Clear; SQL.Text := 'select * from usertables '; Open; end; end; UserSession.isEditAppendUser := '';//赋为空值 ListUser.DataSource := UserSession.dsUserTable;//给 ListUser.DataSource赋值 Page.Text := GetToolStr(ListUser.DataSource.DataSet.RecNo, ListUser.DataSource.DataSet.RecordCount, ListUser.RowLimit, 0, 10, ' 人 '); // 调 用 在

ServerController单元中的 GetToolStr函数,在 Page框中生成分页导航条,请查看 ServerController单元内的原函数说明。 end; initialization RegisterClass(TUserform); end.

Page 190: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 190页/共 376页

4.1.2.10 Fadminform单元 这个页面用来所有电影列表,在点击管理页面的电影【修改,删除】按钮后出现,每一条记录都有

编辑和删除的超级链接。这也是从窗口 BaseForm继承的。在这个窗口中新加了 3个控件: ListFilm: TIWDBGrid,Page: TIWRectangle ,ComGrid: TIWDBGrid。ListUser 用来显示注册用户列表,Page 用来显示 ListFilm 列表的分页导航条,ComGrid 用来响应页面的中的相应超级链接。窗口界面如图4-1-34:

图 4-1-34 AdminForm窗口界面

unit Fadminform; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FBaseform, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout, IWTemplateProcessorHTML, IWCompRectangle, IWCompButton, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompEdit, IWGrids, IWDBGrids; type TAdminForm = class(TBaseForm) Page: TIWRectangle; ListFilm: TIWDBGrid; ComGrid: TIWDBGrid;

ComGrid: TIWDBGrid

ListFilm: TIWRectangle

Page: TIWRectangle

Page 191: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 191页/共 376页

procedure ListFilmRenderCell(ACell: TIWGridCell; const ARow, AColumn: Integer); procedure IWAppFormRender(Sender: TObject); procedure ComGridColumns0Click(ASender: TObject; const AValue: string); procedure ComGridColumns1Click(ASender: TObject; const AValue: string); procedure ComGridColumns2Click(ASender: TObject; const AValue: string); procedure ComGridColumns3Click(ASender: TObject; const AValue: string); procedure ComGrid0Columns0Click(ASender: TObject; const AValue: String); private { Private declarations } public FilmType: string; { Public declarations } end; var AdminForm: TAdminForm; implementation uses ServerController, FplayForm, FMainForm, FlistForm, FControl; {$R *.dfm} // ListFilm只有一列,当给单元格赋值时执行 procedure TAdminForm.ListFilmRenderCell(ACell: TIWGridCell; const ARow, AColumn: Integer); var Temp: TStringList; begin inherited; Temp := TStringList.Create; if ListFilm.DataSource.DataSet.IsEmpty then//如果 ListFilm查询的注册用户数为 0则退出此函数的执行 exit; if (AColumn = 0) and (ARow > 0) then//如果当前单元格是第一列,且不是第一行 begin with ListFilm.DataSource.DataSet do begin Temp.Clear; Temp.LoadFromFile(WebApplication.ApplicationPath + '\files\Skin\' + GSkin + '\adminList.html'); //导入\files\Skin\1\ adminList.html皮肤模板文件,在 IE中的显示效果如图 4-1-35:

图 4-1-35 adminList.html在 IE中的视图

以下代码为替换相应的字符为我们所需要的代码

Page 192: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 192页/共 376页

Temp.Text := StringReplace(Temp.Text, 'Type', FieldByname('typeid').AsString, [rfReplaceAll]); //将 Type替换成 typeid字段内容 Temp.Text := StringReplace(Temp.Text, 'Title', GetLinkString('2', FieldByname('title').AsString, FieldByname('title').AsString), [rfReplaceAll]); //将 Title替换成 Title的链接字段内容,传递的参数也是Title字段的内容 Temp.Text := StringReplace(Temp.Text, 'Hit', FieldByname('hits').AsString, [rfReplaceAll]); //将 Hit替换成 Hits字段内容 Temp.Text := StringReplace(Temp.Text, 'DateTime', FieldByname('dateandTime').AsString, [rfReplaceAll]); //将 DateTime替换成 dateandTime字段内容 Temp.Text := StringReplace(Temp.Text, 'Modify', GetLinkString('2', FieldByname('title').AsString, '修改'), [rfReplaceAll]); //将 Modify替换成“修改”链接,传递要删除的电影名 title Temp.Text := StringReplace(Temp.Text, 'Del', Format('<a href="#none" onclick="deletefilms(' + QuotedStr(FieldByname('title').AsString) + ')";>%S</a>',['删除']), [rfReplaceAll]); //显示在浏览器的“删除”超级链接,在窗口的 javascript属性中的最下面加入以下三行 javascript代码: function deleteUser(del) { if(confirm("你确定要删除 "+del+" 用户吗?")) {return SubmitClickConfirm('ComGrid','3_'+del+'', true, '');}} ACell.Text := Temp.Text; //将得到的 HTML代码赋值给这个单元格 end; end; Temp.Free; end; procedure TAdminForm.IWAppFormRender(Sender: TObject); begin inherited; if (UserSession.FilmType <> '') and (UserSession.FilmType <> 'All') then begin//如果条件成立 with UserSession.ListFilm do begin//查询相关类型的电影 Close; SQL.Clear; SQL.Text := 'select * from movie where typeid=''' + UserSession.FilmType + ''' and IsDate(Movie.dateandtime) ORDER BY datevalue(Movie.dateandtime) DESC'; Open; end; end; if UserSession.FilmType = 'All' then begin//查询所有类型的电影 with UserSession.ListFilm do begin Close; SQL.Clear; SQL.Text := 'select * from movie '; Open; end;

Page 193: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 193页/共 376页

end; UserSession.FilmType := ''; //赋为空值 ListFilm.DataSource := UserSession.ListFilmSource;// 给 ListFilm.DataSource赋值 Page.Text := GetToolStr(ListFilm.DataSource.DataSet.RecNo, ListFilm.DataSource.DataSet.RecordCount, ListFilm.RowLimit, 0); // 调用在ServerController单元中的 GetToolStr函数,在 Page框中生成分页导航条,请查看 ServerController单元内的原函数说明。 end; procedure TAdminForm.ComGridColumns0Click(ASender: TObject;const AValue: string); begin inherited; SetPage(ListFilm, AValue); // 调用在 ServerController单元中的 SetPage函数,响应在 Page框中生成的分页导航条链接,跳到相应页面。请查看 ServerController单元内的原函数说明。 end; //这个函数是用来响应页面的电影分类超级链接的。例如爱情片的页面代码为<a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_爱情片', true, '');">爱情片</a>,此处 Avalue将被赋值为爱情片 procedure TAdminForm.ComGridColumns1Click(ASender: TObject;const AValue: string); begin inherited; if AValue = 'MainForm' then begin if not ShowForm('MainForm') then TMainForm.Create(WebApplication).Show; end else begin UserSession.FilmType := AValue; end; end; //响应页面中的“修改”超级链接,从链接代码可以看出,此处 AValue 为 Modify。 procedure TAdminForm.ComGridColumns2Click(ASender: TObject; const AValue: string); begin inherited; if not ShowForm('ModiforAddForm') then TModiforAddForm.Create(WebApplication).Show; //打开电影修改窗口页面 UserSession.isEditAppendFilm := AValue; //将 UserSession.isEditAppendFilm赋值为 Modify,这样电影修改窗口 RegForm打开时就会在页面中事先显示该电影的相关信息,以便修改。 end; procedure TAdminForm.ComGridColumns3Click(ASender: TObject;const AValue: string); //响应“删除”超级链接,超级链接将用户名传递给 AValue begin

Page 194: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 194页/共 376页

inherited; UserSession.ListFilm.Locate('title', AValue, []);//在数据库中找到该用户 UserSession.ListFilm.Delete; //删除该用户 end; initialization RegisterClass(TAdminForm); end.

4.1.2.11 FControl单元 这个页面用来编辑电影记录的,在点击管理页面的电影【添加】或电影列表中的修改按钮后出现。

这也是从窗口 BaseForm 继承的。在这个窗口中新加了很多控件:IWLabel1: TIWLabel,TitleEdt: TIWEdit,IWLabel2: TIWLabel,IWLabel3: TIWLabel,IWLabel4: TIWLabel,IWLabel5: TIWLabel,IWLabel7: TIWLabel,MainNameEdt: TIWEdit,UpTimEdt: TIWEdit,TypeIdCbb: TIWComboBox,Memo: TIWMemo,IWLabel8: TIWLabel,IWLabel9: TIWLabel,IWLabel11: TIWLabel,IWLabel10: TIWLabel,IWLabel12: TIWLabel,FilmLong: TIWComboBox,whereEdt: TIWEdit,IWLabel13: TIWLabel,UpFilms: TIWButton,UpFilelist: TIWMemo,FilmNumEdt: TIWCheckBox,IWLabel6: TIWLabel, BackBtn: TIWButton, SearchFilm: TIWButton, LookBtn: TIWButton, ComGrid: TIWDBGrid, EdtNumTo: TIWEdit, SaveFilmCbb: TIWComboBox, SaveFilmEdt: TIWEdit,SavePictureEdt: TIWEdit,UpFilm: TIWEdit,UpPictrueEdt: TIWEdit,EdtNumFrom: TIWEdit。同样ComGrid用来响应页面的中的相应超级链接。窗口界面如图 4-1-36:

Page 195: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 195页/共 376页

图 4-1-36 ModiforAddForm窗口界面

首先请在本窗口 javascript属性的最后面加上如下 javascript代码: function Getdates() { var day=""; var month=""; var ampm=""; var ampmhour=""; var myweekday=""; var year=""; mydate=new Date(); myweekday=mydate.getDay(); mymonth=mydate.getMonth()+1; myday= mydate.getDate(); myyear= mydate.getYear(); year=(myyear > 200) ? myyear : 1900 + myyear; return year+"-"+mymonth+"-"+myday } function CBB_onchange() { tempObj = SAVEFILMCBBIWCL; i = tempObj.selectedIndex; if(tempObj.options[i].innerHTML==" 喜 剧 片 ") {SAVEFILMEDTIWCL.value = "/files/Movies/comedy/";SAVEPICTUREEDTIWCL.value ="/files/Movies/comedy/";} if(tempObj.options[i].innerHTML==" 动 作 片 ") {SAVEFILMEDTIWCL.value = "/files/Movies/action/";SAVEPICTUREEDTIWCL.value = "/files/Movies/action/";} if(tempObj.options[i].innerHTML==" 恐 怖 片 ") {SAVEFILMEDTIWCL.value = "/files/Movies/dracula/";SAVEPICTUREEDTIWCL.value ="/files/Movies/dracula/";} if(tempObj.options[i].innerHTML==" 爱 情 片 ") {SAVEFILMEDTIWCL.value = "/files/Movies/love/";SAVEPICTUREEDTIWCL.value ="/files/Movies/love/";} if(tempObj.options[i].innerHTML==" 战 争 片 ") {SAVEFILMEDTIWCL.value = "/files/Movies/war/";SAVEPICTUREEDTIWCL.value ="/files/Movies/war/";} if(tempObj.options[i].innerHTML==" 动 画 片 ") {SAVEFILMEDTIWCL.value = "/files/Movies/cartoon/";SAVEPICTUREEDTIWCL.value ="/files/Movies/cartoon/";} if(tempObj.options[i].innerHTML=="科幻片") {SAVEFILMEDTIWCL.value = "/files/Movies/science fiction/";SAVEPICTUREEDTIWCL.value ="/files/Movies/science fiction/";}

Page 196: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 196页/共 376页

if(tempObj.options[i].innerHTML==" 惊 险 片 ") {SAVEFILMEDTIWCL.value = "/files/Movies/adventruous/";SAVEPICTUREEDTIWCL.value ="/files/Movies/adventruous/";} if(tempObj.options[i].innerHTML==" 伦 理 片 ") {SAVEFILMEDTIWCL.value = "/files/Movies/ethical/";SAVEPICTUREEDTIWCL.value ="/files/Movies/ethical/";} if(tempObj.options[i].innerHTML==" 故 事 片 ") {SAVEFILMEDTIWCL.value = "/files/Movies/story/";SAVEPICTUREEDTIWCL.value ="/files/Movies/story/";} if(tempObj.options[i].innerHTML==" 成 人 片 ") {SAVEFILMEDTIWCL.value = "/files/Movies/adult/";SAVEPICTUREEDTIWCL.value ="/files/Movies/adult/";} if(tempObj.options[i].innerHTML==" 电 视 剧 ") {SAVEFILMEDTIWCL.value = "/files/Movies/teleplay/";SAVEPICTUREEDTIWCL.value ="/files/Movies/teleplay/";} if(tempObj.options[i].innerHTML==" 其 它 ") {SAVEFILMEDTIWCL.value = "/files/Movies/other/";SAVEPICTUREEDTIWCL.value ="/files/Movies/other/";} } function Check_Edit(btn){ UPTIMEDTIWCL.value=Getdates(); var obj = TITLEEDTIWCL; if(obj.value == "") { alert("影片标题不能为空!"); obj.focus(); return false; } tempObj = TYPEIDCBBIWCL; i = tempObj.selectedIndex; if(tempObj.options[i].innerHTML=="-- No Selection --") { alert("请选择影片分类!"); return false; } var obj = UPPICTRUEEDTIWCL; if(obj.value == "") { alert("上传图片不能为空!"); obj.focus(); return false; }

Page 197: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 197页/共 376页

var obj = WHEREEDTIWCL; if(obj.value == "") { alert("影片地区不能为空!"); obj.focus(); return false; } tempObj = FILMLONGIWCL; i = tempObj.selectedIndex; if(tempObj.options[i].innerHTML=="-- No Selection --") { alert("请选择影片长度!"); return false; } var obj = UPFILMIWCL; if(obj.value == "") { alert("上传影片不能为空!"); obj.focus(); return false; } if (FindElem('FILMNUMEDT_CHECKBOX').checked == true) { if (EDTNUMTOIWCL.value=""){alert("电影集数不能为空!");} } if (FindElem('FILMNUMEDT_CHECKBOX').checked == true) { var str1 = UPFILMIWCL.value; var str2 = str1.indexOf("1"); if(str2<0) { alert("上传影片缺少关键字 1 ,例如 D:\我的电影\仙女传奇 1"); return false; } } tempObj = SAVEFILMCBBIWCL; i = tempObj.selectedIndex; if(tempObj.options[i].innerHTML=="-- No Selection --") { alert("请选择影片保存类型!"); return false; } SubmitClickConfirm(''+btn+'','', true, ''); }

Page 198: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 198页/共 376页

请在 SearchFilm按钮(初始化配置)的 scriptevents的 onclick中加入如下 javascript代码: Check_Edit("SEARCHFILM"); 以上目的是检查输入数据的完整性。 请在 UpFilms按钮(添加)的 scriptevents的 onclick中加入如下 javascript代码: if (SEARCHFILMIWCL.value=="初始化成功") { Check_Edit("UPFILMS"); } else { alert("请先按初始化配置!以便能为所需要的电影分配空间!") ; } 以上目的是检查输入数据的完整性。

unit FControl; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FBaseform, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout, IWTemplateProcessorHTML, IWCompRectangle, IWCompButton, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompEdit, IWHTMLControls, IWCompMemo, IWCompListbox, IWCompLabel, DB, ADODB, IWLayoutMgrHTML, IWLayoutMgrForm, IWCompCheckbox, IWGrids, IWDBGrids, Iwhtmltag; type TModiforAddForm = class(TBaseForm) IWLabel1: TIWLabel; TitleEdt: TIWEdit; IWLabel2: TIWLabel; IWLabel3: TIWLabel; IWLabel4: TIWLabel; IWLabel5: TIWLabel; IWLabel7: TIWLabel; MainNameEdt: TIWEdit; UpTimEdt: TIWEdit; TypeIdCbb: TIWComboBox; Memo: TIWMemo; IWLabel8: TIWLabel; IWLabel9: TIWLabel; IWLabel11: TIWLabel; IWLabel10: TIWLabel;

Page 199: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 199页/共 376页

IWLabel12: TIWLabel; FilmLong: TIWComboBox; whereEdt: TIWEdit; IWLabel13: TIWLabel; UpFilms: TIWButton; UpFilelist: TIWMemo; FilmNumEdt: TIWCheckBox; IWLabel6: TIWLabel; BackBtn: TIWButton; SearchFilm: TIWButton; LookBtn: TIWButton; ComGrid: TIWDBGrid; EdtNumTo: TIWEdit; SaveFilmCbb: TIWComboBox; SaveFilmEdt: TIWEdit; SavePictureEdt: TIWEdit; UpFilm: TIWEdit; UpPictrueEdt: TIWEdit; EdtNumFrom: TIWEdit; procedure IWAppFormRender(Sender: TObject); procedure UpFilmsClick(Sender: TObject); procedure IWAppFormCreate(Sender: TObject); procedure BackBtnClick(Sender: TObject); procedure ComGridColumns1Click(ASender: TObject; const AValue: string); procedure LookBtnClick(Sender: TObject); procedure SearchFilmClick(Sender: TObject); procedure SaveFilmCbbHTMLTag(ASender: TObject; ATag: TIWHTMLTag); procedure ComGrid0Columns0Click(ASender: TObject; const AValue: String); private { Private declarations } public procedure GetField(IQuery: Tadoquery); procedure SetField(IQuery: Tadoquery); procedure Textclear; { Public declarations } end; var ModiforAddForm: TModiforAddForm; implementation uses ServerController, Fadminform, FMainForm, FplayForm, UserSessionUnit; {$R *.dfm}

Page 200: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 200页/共 376页

//目的是清空当前页面内的所有输入框中的字符 procedure TModiforAddForm.Textclear; var i: Integer; begin for i := 0 to self.ComponentCount - 1 do begin if (self.Components[i] is TIWEdit) then begin if (self.Components[i] as TIWEdit).Name <> 'EdtNumFrom' then// 输入框 EdtNumFrom除外 (self.Components[i] as TIWEdit).Text := ''; end; if (self.Components[i] is TIWComboBox) then//下拉框回复默认值 begin (self.Components[i] as TIWComboBox).ItemIndex := -1; end; Memo.Lines.Clear;//清空 Memo输入 UpFilelist.Lines.Clear;// 清空 UpFilelist输入 end; end; //在修改该电影记录时,在页面上显示数据库中该电影记录的相关数据,也就是将数据库中的当前记录的字段值取出来放在相应的页面显示控件中 procedure TModiforAddForm.GetField(IQuery: Tadoquery); var AdoTempMovieList: Tadoquery; begin Textclear; with IQuery do begin TitleEdt.Text := FieldByname('title').AsString; SavePictureEdt.Text := FieldByname('url').AsString; TypeIdCbb.ItemIndex := TypeIdCbb.Items.IndexOf(FieldByname('Typeid').AsString); MainNameEdt.Text := FieldByname('name').AsString; UpTimEdt.Text := FieldByname('dateandtime').AsString; whereEdt.Text := FieldByname('where').AsString; FilmLong.ItemIndex := FilmLong.Items.IndexOf(FieldByname('howlong').AsString); Memo.Text := FieldByname('content').AsString; FilmNumEdt.Checked := FieldByname('IsFilmNum').AsBoolean; UpFilelist.Lines.Add(FieldByname('domurl').AsString); SaveFilmEdt.Text := FieldByname('domurl').AsString; UpFilm.Text := Copy(WebApplication.ApplicationPath, 0, Length(WebApplication.ApplicationPath) - 1) + RenString(SaveFilmEdt.Text);

Page 201: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 201页/共 376页

UpPictrueEdt.Text := Copy(WebApplication.ApplicationPath, 0, Length(WebApplication.ApplicationPath) - 1) + RenString(SavePictureEdt.Text); end; if IQuery.FieldByname('IsFilmNum').AsBoolean = True then begin//如果是多集电影 AdoTempMovieList := Tadoquery.Create(self); AdoTempMovieList.Connection := UserSession.cn; with AdoTempMovieList do begin Close; SQL.Clear; SQL.Add('select * from movieList where title=' + QuotedStr(IQuery.FieldByname('title').AsString)); Open; UpFilelist.Lines.Clear; while not Eof do begin UpFilelist.Lines.Add(FieldByname('playurl').AsString); Next; end; end; AdoTempMovieList.Close; AdoTempMovieList.Free; end; end; //与上一个函数刚好相反,这是将页面的输入信息存入数据库中 procedure TModiforAddForm.SetField(IQuery: Tadoquery); var AdoTempMovieList: Tadoquery; i: Integer; begin with IQuery do begin FieldByname('title').AsString := TitleEdt.Text; FieldByname('url').AsString := trim(SavePictureEdt.Text); FieldByname('Typeid').AsString := TypeIdCbb.Items[TypeIdCbb.ItemIndex]; FieldByname('name').AsString := MainNameEdt.Text; if UpTimEdt.Text <> '' then UpTimEdt.Text := DateToStr(Now); FieldByname('dateandtime').AsString := UpTimEdt.Text; FieldByname('where').AsString := whereEdt.Text; FieldByname('howlong').AsString := FilmLong.Items[FilmLong.ItemIndex]; FieldByname('content').AsString := Memo.Text; FieldByname('IsFilmNum').AsBoolean := FilmNumEdt.Checked; FieldByname('domurl').AsString :=trim(UpFilelist.Lines.Strings[0]); end;

Page 202: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 202页/共 376页

if (FilmNumEdt.Checked = True) and (UpFilelist.Lines.Text <> '') then begin//如果是多集电影 AdoTempMovieList := Tadoquery.Create(self); AdoTempMovieList.Connection := UserSession.cn; with AdoTempMovieList do begin Close; SQL.Clear; SQL.Add('delete from movieList where title=' + QuotedStr(TitleEdt.Text)); ExecSQL; end; with AdoTempMovieList do begin Close; SQL.Clear; SQL.Add('select * from movieList where 1=2 '); Open; for i := 0 to UpFilelist.Lines.Count - 1 do begin Append; FieldByname('title').AsString := IQuery.FieldByname('title').AsString; FieldByname('playurl').AsString :=trim(UpFilelist.Lines.Strings[i]); FieldByname('Filmnum').AsInteger := i + 1; Post; end; IQuery.FieldByname('domurl').AsString := ''; end; AdoTempMovieList.Close; AdoTempMovieList.Free; end; end; //生成该页面的 HTML文件时执行 procedure TModiforAddForm.IWAppFormRender(Sender: TObject); begin inherited; if UserSession.isEditAppendFilm = 'append' then begin//如果是增加电影 UpFilms.Caption := '添加';// UpFilms显示为添加 if not UserSession.IsFresh then//如果不在编辑状态 Textclear;//清空所有输入 UserSession.IsFresh := False; //标示为没有更新 end else begin UpFilms.Caption := '修改';//如果不是添加则是修改 UserSession.ListFilm.Locate('title', UserSession.isEditAppendFilm, []);//在 ListFilm 数据集中找到当前修改的电影记录,UserSession.isEditAppendFilm被事先赋值为要修改的电影名,从上一节的TAdminForm.ComGridColumns2Click函数可以看出来

Page 203: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 203页/共 376页

if not UserSession.IsFresh then//如果不是刚刚更新 GetField(UserSession.ListFilm);//在页面上显示人修改的记录 UserSession.isEditAppendFilm := '';//清空,以防再次执行 UserSession.IsFresh := False; //标示为没有更新 end; end; //点击 UpFilms按钮时执行 procedure TModiforAddForm.UpFilmsClick(Sender: TObject); begin inherited; if UpFilms.Caption = '添加' then begin//如果是添加电影 with UserSession.ListFilm do begin Close; SQL.Clear; SQL.Add('select * from movie where 1=2 '); Open; Append;//新增加一条记录 SetField(UserSession.ListFilm);//将页面数据存入数据库中 Post; end; UserSession.IsFresh := True;//标示为刚刚更新 end else begin //如果是修改 with UserSession.ListFilm do begin Locate('title', UserSession.isEditAppendFilm, []);//找到当前记录 Edit;//设定到编辑状态 SetField(UserSession.ListFilm);// 将页面数据存入数据库中 Post; end; UserSession.IsFresh := True; //标示为刚刚更新 end; SearchFilm.Caption := '初始化配置'; end; //页面生成时最先执行的代码,给两个下拉框赋值 procedure TModiforAddForm.IWAppFormCreate(Sender: TObject); var AdoTempType: Tadoquery;//设定一个临时查询用的 Tadoquery控件,在本函数中用完就释放 begin inherited; AdoTempType := Tadoquery.Create(self); AdoTempType.Connection := UserSession.cn;

Page 204: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 204页/共 376页

with AdoTempType do begin Close; SQL.Clear; SQL.Text := 'select * from type';//查询出所有的电影类型 Open; while not Eof do begin TypeIdCbb.Items.Add(FieldByname('type').AsString);//给 TypeIdCbb赋值,所有预定义的电影类型 SaveFilmCbb.Items.Add(FieldByname('type').AsString);// 给 SaveFilmCbb赋值,所有预定义的电影保存类型 Next; end; Close; AdoTempType.Free;//释放 end; end; //点击返回按钮后执行 procedure TModiforAddForm.BackBtnClick(Sender: TObject); begin inherited; if not ShowForm('AdminForm') then TAdminForm.Create(WebApplication).Show;//显示电影列表页面 end; //这个函数是用来响应页面的电影分类超级链接的。例如爱情片的页面代码为<a href="#none" onclick="return SubmitClickConfirm('ComGrid','1_爱情片', true, '');">爱情片</a>,此处 Avalue将被赋值为爱情片 procedure TModiforAddForm.ComGridColumns1Click(ASender: TObject; const AValue: string); begin inherited; if AValue = 'MainForm' then begin if not ShowForm('MainForm') then TMainForm.Create(WebApplication).Show; end else begin UserSession.FilmType := AValue; if not ShowForm('AdminForm') then TAdminForm.Create(WebApplication).Show; end; end;

Page 205: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 205页/共 376页

//点击预览按钮后执行 procedure TModiforAddForm.LookBtnClick(Sender: TObject); begin inherited; if not ShowForm('PlayForm') then TPlayForm.Create(WebApplication).Show;//显示播放页面 UserSession.Film := TitleEdt.Text;//指定要播放的电影名 end; // 点击初始化配置按钮后执行 procedure TModiforAddForm.SearchFilmClick(Sender: TObject); var GetPicName, GetFilmExt, GetFilename, GetHz: string; i, FromNum, toNum: Integer; function GetLastDir(Istring: string): string;//得到字串中最后一个\符号后的字串 var Count: Integer; Fstring: string; begin Fstring := Istring; Count := LastDelimiter('\', Fstring);//字符\最后出现的位置 result := Copy(Fstring, Count + 1, Length(Fstring) - Count); end; procedure CopyOneFilm; var NewFilms: string; begin NewFilms := Copy(WebApplication.ApplicationPath, 0, Length(WebApplication.ApplicationPath) - 1) + RenString(SaveFilmEdt.Text) + gethzPy(TitleEdt.Text) + '\'; if not DirectoryExists(NewFilms) then ForceDirectories(PChar(NewFilms));//保证有此文件夹,没有就创建 CopyFile(PChar(UpFilm.Text), PChar(NewFilms + GetFilename), False); //拷贝电影 CopyFile(PChar(UpPictrueEdt.Text), PChar(NewFilms + GetPicName), False); //拷贝图片 end; procedure CopyDirFilm; var Dir, DestDir: string; HZ, LastDir: string; begin HZ := gethzPy(TitleEdt.Text) + '\'; DestDir := Copy(WebApplication.ApplicationPath, 0, Length(WebApplication.ApplicationPath) - 1) + RenString(SaveFilmEdt.Text); Dir := ExtractFileDir(UpFilm.Text);

Page 206: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 206页/共 376页

if not DirectoryExists(DestDir) then ForceDirectories(PChar(DestDir)); CopyDirectory(Dir, DestDir); //gethzPy(TitleEdt.Text) LastDir := GetLastDir(Dir); RenDirectory(DestDir + LastDir, DestDir + HZ); CopyFile(PChar(UpPictrueEdt.Text), PChar(DestDir + HZ + GetPicName), False); //图片 end; begin inherited; try GetFilmExt := extractfileext(UpFilm.Text); GetFilename := ExtractFileName(UpFilm.Text); GetPicName := ExtractFileName(UpPictrueEdt.Text); UserSession.IsFresh := True; if FilmNumEdt.Checked = True then begin//如果是多集电影 UpFilelist.Lines.Clear; FromNum := StrToIntDef(EdtNumFrom.Text, 1); toNum := StrToIntDef(EdtNumTo.Text, 0); GetFilename := Copy(GetFilename, 0, Length(GetFilename) - (Length(GetFilmExt) + 1)); for i := FromNum to toNum do begin UpFilelist.Lines.Add(SaveFilmEdt.Text + GetFilename + inttostr(i) + GetFilmExt); end; GetHz := SaveFilmEdt.Text + gethzPy(TitleEdt.Text) + '/'; SavePictureEdt.Text := GetHz + GetPicName; CopyDirFilm; EdtNumFrom.Text := '0'; EdtNumTo.Text := '0'; end else//如果是单集电影 begin GetHz := SaveFilmEdt.Text + gethzPy(TitleEdt.Text) + '/'; SavePictureEdt.Text := GetHz + GetPicName; UpFilelist.Lines.Clear; UpFilelist.Lines.Add(GetHz + GetFilename); CopyOneFilm; end; SearchFilm.Caption := '初始化成功'; except SearchFilm.Caption := '初始化失败'; end; end; //在 SaveFilmCbb 控件的 HTML 代码中加入 javascript 代码,本控件的 HTML 代码为:<select

Page 207: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.1 一个电影网站的出生之旅 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 207页/共 376页

name="SAVEFILMCBB" size="1" width="153" title="一旦资料改变必须按生成电影按钮初始化配置 否 则 保 存 资 料 将 会 失 败 !" class="fmtxtra" style="z-index:100;width:153;height:21;" id="SAVEFILMCBB" onchange="CBB_onchange()" tabindex="22"> procedure TModiforAddForm.SaveFilmCbbHTMLTag(ASender: TObject; ATag: TIWHTMLTag); begin inherited; ATag.AddStringParam('onchange', 'CBB_onchange()'); end; initialization RegisterClass(TModiforAddForm); end. 补充说明: 本程序想用最少的控件来完成程序的编写,所以代码显得较多,但只要明白了其中的原理,开发

一个比这个更复杂的程序将会很简单。本程序中有很多的函数可以直接拷贝使用。大部分只作相应局

部修改即可扩充功能。这是一个很好的编程资源,这种方法在 delphi7以后的版本中也可应用。 所有模板文件用 dreamweaverMX 编辑,如有不明白的地方,请打开源代码自己细看。请注意模

板的图片文件的相对路径。直接放在 templates 目录下是可以的。放在 templates\1 目录下就看不到了。

FilmServerdll_gy.dpr 为生成 dll 版本的工程文件。要用 IIS 发布生才能查看。所有代码在WinXPSP2+Dlphi7.0 +IntraWeb7.2.41下调试通过。IWServerController的属性 ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal。

Page 208: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 208页/共 376页

4.2 一个英语教学网站的综合编程 4.2.1 网站整体设计简要说明 在第一章时,我们提到过一个英语教学网站。这里,我们对它进行完整讲解。 这个程序基本上是使用 intraweb自带的控件来实现的,通过程序的相关控件自己直接组装的代码

比较少(这是与 4.1最大的区别)。程序中除了用到 intraweb控件外还用到了 intraweb的第三方控件:TMS,这个控件组是对 intrweb 是一个非常实用的功能扩充,有对 intraweb对应控件的升级也有具有全新功能的自己的控件,总之你也把它看成 intraweb组件的一部分就行了,它要单独购买,这是它唯一的缺点,在 intraweb的每一安装版本中都已经集成了。(本程序源代码在文件夹 4.2中) 闲话少述,先说一下整个程序的总体思路: 1、网站一般都有一个每页都有的导航条之类的东西,例如菜单等,就是每页都出现的一些公共界

面,我们在一个 TFrame窗口中实现,它可以被注册成为控件面版上的一个控件(在其上点击右键即有选项 add to pallete,点击它,这时会出现一个对话框,选择一控件面版即可),其它页面要拥有这些公共界面,将注册的 TFrame窗口控件拖到窗口中即可。

2、所有窗口要调用的共用函数我们都写在 IWUserSession 窗口中,其它窗口只要 uses UserSessionUnit单元,就可以通过 UserSession调用这些函数(如 UserSession.closesessoion;)。

3、各单元之间要传递的参数我们都事先在 IWUserSession 窗口中定义,传递时先给相应的参数赋值,接收时从这个参数取值。这样就可以实现各网页之间的参数传递。

4、界面布局我们依然采用模板的方法,用 HTML文件作为模板,相应的窗口调用相应的模板将我们的 IntraWeb控件自动嵌入到相应的位置中。不同的模板可以实现不同的网页风格。

5、每一个窗口基本上完成一个比较独立的功能,因为 intraweb 的窗口一般对应一个页面,我们在同一个窗口中放上很多个 TIWRegion控件,每一个 TIWRegion控件中放入相应的可视控件完成相对独立的功能,改变 IWRegionA的 visible属性就实现了不同界面的切换。在本程序中我们一般用到了两个放了很多其它控件的 TIWRegion控件,一个用来完成程序功能显示,一个用来完成后台程序维护。也就是说一个窗口可以通过改变 TIWRegion控件的显示属性来显示成不同的页面,完成不同的功能。 我们的模板放在 templates\目录下,改变 IWServerController里 TemplateDir属性可以更换模板风

格,本程序中提供两套精美的模板。这里共有 9个页面,它们的文件名小数点前的部分都和相应的窗口名称(name属性)是一样的。 数据文件为 datas\data.mdb,没有密码,这是 Access 数据库,大家打开看即可。字段名如果不

是汉字则大多为拼音,应该很好理解。我们的讲解和学习重点在程序编写而不在数据库应用,所以这

里不再详述。 4.2.2 unit ServerController导读 ServerController这是程序的控制中心,是一个比较重要的单元。其重要属性简介如下: AllowSubFolders:请选择 true。这将允许程序使用下级文件夹。有利于我们的编程。 AppName:这个属性为 Web 应用指定一个名称,请尽量保证此名称的唯一性,如果两个应用的

名称相同则它们不能同时运行在一个系统中。这里为Graduate English for the 21st Century。 BoundIP:(发布成 exe 形式时有效)填写将要发布的服务器的 IP,如果空着,则自动被设为

127.0.0.1,这样就只能本机访问了,其它用户通过 internet 不能访问。如果 IntraWeb 是体验版本的话,这个值会被固定为 127.0.0.1,不管你改为多少,如果服务器没有网络,则用指定的 IP打开时会出错。它出现在 IE地址里(加黑部分)http://127.0.0.1:8899。

ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal。否则会出错,这是经验,如果用到数据库,是不能选择 ciNone的,运行会有错。

Page 209: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 209页/共 376页

ExeCmd:可以任意指定,默认为“exec”。这里为 exe,它出现在 IE 地址里 exe(加黑部分):http://127.0.0.1:8899/ exe。

Port:指定端口,只要是当前计算机没有使用的端口都可以。如果 IntraWeb是体验版本的话,则修改无效。它出现在 IE地址的 IP加冒号的后面,如下所示 8899(加黑部分)http://127.0.0.1:8899。

SessionTimeout:设置一个等待时间,单位为分钟。因为要为每个用户创建一个 Session,如果永远保留,那服务器的内存开支就太大了。因此设置一个时间,如果在这时间之内用户没有与服务器

进行交互,则认为用户已经离开了,程序就会关闭他的 Session。这个时间如果太少,则可能导致用户不能正常使用,太长了又浪费资源,120分钟较为合适。

SessionTrackingMethod:如果不想 IE地址太长的话,请选择 tmHidden,这样 Session的 ID就不会出现在 IE地址里了,它被隐藏在网页里(网址最后的那一串经常变动的字符就没有了)。 其它的属性取默认值就行了。 下面解读一下程序代码: function GetLocalIP: string;//为取得本机 IP地址。如果本机不在网络上,则为 127.0.0.1。 procedure TIWServerController.IWServerControllerBaseCreate(Sender: TObject); var ip: string; begin self.CacheDir := self.AppPath + 'cache';//将临时生成的 cache目录放在网站根目录下 ip := GetLocalIP;// 网络版本,如果要限定 IP的话请使用下一句,ip为自定义的一个变量 //ip:='127.0.0.1';//单机版本 self.BoundIP:=ip;//设定程序要绑定的 IP self.Port:=8899;//指定端口 self.TemplateDir:='Templates\'; //设定模板文件夹 end; 4.2.3 unit UserSessionUnit导读 UserSessionUnit 是一个很有意思的单元。这里的变量和函数每一用户(这里的用户是指你用 IE

打开一下这个程序,你就是一个用户了,不管你登不登录都已经是了)都是独立的。也就是说只要你

用 IE 打开一下这个程序,服务器就会通过 UserSessionUnit 产生一个 Session,这个 Session 是独一无二的,只有刚才打开的 IE界面能够使用它,当 SessionTimeout所设置的时间到时,这个 Session才会自动销毁。这样就保证了每一个使用这个程序的人都有自己私有的状态数据。要不然多人同时使

用时就会乱套了。 下面解读一下程序代码: 在 public中我们声明了一些编程要用到的变量和函数,之所以在这个单元是声明这些变量和函数,

是因为其它的页面随时都可以调用它们。我们声明了如下变量和函数: public a, b, c, d, e,f, XingMing, mm, KaHao, mima, ip: string; flag, YiDengLu: Boolean; yuyinid: Integer; DengLuShiJian: string; //登录时间 XiaWangShiJian: string; //下网时间 LeiJiShangWangShiJian: string; //累积上网时间 JinRiShangWangShiJian: string; //今日上网时间 GuanLi_News: Boolean; //管理新闻系统

Page 210: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 210页/共 376页

GuanLi_YuYin: Boolean; //管理语音天地系统 procedure closesessoion; //响应 IE的关闭事件,关闭当前活动窗口 procedure Move(AFormClass: TIWAppFormClass); function showBanQuan: string; //查询版权 function ReplaceStrs(str, SearchStr, ReplaceStr: string): string; { Public declarations } 窗口中有如图 4-2-1所示控件:

图 4-2-1 UserSession窗口中的控件

每一个单元中请 uses ServerController, UserSessionUnit。 这个自定义函数用来销毁当前活动窗口,打开参数 AFormClass指定的,要 use IWAppForm单

元 procedure TIWUserSession.Move(AFormClass: TIWAppFormClass); begin TIWAppForm(WebApplication.ActiveForm).Free; AFormClass.Create(WebApplication).Show; end; 当新生成一个 Session时执行以下程序。给一些变量赋初值,指定数据库连接并打开 procedure TIWUserSession.IWUserSessionBaseCreate(Sender: TObject); begin mm := '~!@#$%^&*()_+|`1234567890-=\';//设定的一个密码 b := '1'; c := '1'; a := '101'; d := '1'; e := '1'; f := '1'; //全局数据连接 ADOConnection1.Close; ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +

IWServerController.AppPath + 'datas\data.mdb;Persist Security Info=False'; ADOConnection1.Open; end; 这个自定义函数用来替换指定字符的,通用的,不用详细查看,打开源代码自己看。 function TIWUserSession.ReplaceStrs(str, SearchStr, ReplaceStr: string): string; 响应 IE的关闭事件,关闭当前活动窗口,我们始终只使程序有一个窗口,关闭当前活动窗口就相

当于关闭了所有窗口,从而主动销毁当前 Session。 procedure TIWUserSession.closesessoion;

Page 211: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 211页/共 376页

begin try TIWAppForm(WebApplication.ActiveForm).Free; except Exit; end; end; 这个自定义函数用来得到版权信息,并在其中加入了响应 IE 关闭事件的代码。

SubmitClickConfirm(''ComGrid'',''0_close'', true, '''')用来通知 intraweb执行窗口中的类似如下函数: procedure TIWindex.ComGridColumns0Click(ASender: TObject;const AValue: string); begin UserSession.closesessoion; end; 用来关闭当前活动窗口,从而主动销毁当前 Session,减少服务器的内存开支。当程序运行时点

击 IE的关闭按钮就会看到一个提示信息:“欢迎下次再来!”,就是在这里设定的。在每个有输出页面的窗口中我都放了一个 ComGrid控件,它的第一行 Columns0的 onclick事件都是如上,用来响应 IE的关闭事件。

function TIWUserSession.showBanQuan: string; begin ADOQuerylogin.Close; ADOQuerylogin.SQL.Clear; ADOQuerylogin.SQL.Add('select 版权信息 from G00网站管理员 '); ADOQuerylogin.Open; if ADOQuerylogin.RecordCount > 0 then begin Result := Trim(ADOQuerylogin.FieldByname('版权信息').Value); end; Result := Result + '<script FOR=window EVENT=onunload>if (window.event.clientY <0) ' + '{SubmitClickConfirm(''ComGrid'',''0_close'', true, '''');window.alert('' 欢 迎 下 次 再 来 !

'');}</script>'; ADOQuerylogin.Close; end; 4.2.4 unit MainMenu1导读 这是一个 Tframe窗口。按如图 4-2-2示可以生成这种窗口:

图 4-2-2 生成 Frame窗口的菜单

Page 212: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 212页/共 376页

其窗口界面如图 4-2-3所示:

图 4-2-3 Frame窗口内的控件布局

这是每页都出现的一些公共界面,我们在这个 TFrame 窗口中实现,它可以被注册成为控件面版

上的一个控件(在其上点击右键即有选项 add to pallete,点击它,这时会出现一个对话框,如图 4-2-4所示,选择一控件面版即可),其它页面要拥有这些公共界面,将注册的 TFrame窗口控件拖到窗口中即可。

图 4-2-4 Frame窗口注册对话框

左边是选择教材课程的册和章节,右边是菜单。 下面解读一下程序代码: 这个单元主要是响应菜单的点击。执行 UserSession.Move 函数,一般都是销毁当前窗口,打开

指定窗口。函数的参数是在窗口名前加 T即可。 procedure TMainMenu1.N5Click(Sender: TObject); begin UserSession.Move(TIWFormYongHuGuanLi);//打开用户管理窗口 IWFormYongHuGuanLi end; procedure TMainMenu1.MenuItem2Click(Sender: TObject); begin UserSession.Move(TIWFormShenQingZhuCe); //打开用户注册窗口 IWFormShenQingZhuCe end; procedure TMainMenu1.N15Click(Sender: TObject); begin if not UserSession.YiDengLu then//如果没有登录就不执行了 begin WebApplication.ShowMessage('请你先登录。'); Exit; end;

Page 213: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 213页/共 376页

UserSession.Move(TIWFormYongHuXinXiChaXun);// 打 开 用 户 信 息 查 询 窗 口

IWFormYongHuXinXiChaXun end; procedure TMainMenu1.N24Click(Sender: TObject); begin if not UserSession.YiDengLu then begin WebApplication.ShowMessage('请你先登录。'); Exit; end; UserSession.Move(TIWFormxiazaiYuYin); //打开音像剪接窗口 IWFormxiazaiYuYin,又名下载

语音 end; procedure TMainMenu1.N10Click(Sender: TObject); begin WebApplication.TerminateAndRedirect('files/exit.htm');//退出程序销毁 Session并打开 exit.htm

页面 end; 这个函数在点击确定链接时执行。主要是根据用户所选择的册和章节来显示相应的页面。 procedure TMainMenu1.IWLink1Click(Sender: TObject); begin UserSession.b := Trim(eIWComboBox1.Text); if IWRadioButton1.Checked then begin UserSession.a := '1'; UserSession.f :=

'1';UserSession.c := '1'; end; if IWRadioButton2.Checked then begin UserSession.a := '2'; UserSession.f :=

'2';UserSession.c := '2'; end; if Length(Trim(eIWComboBox1.Text)) = 1 then UserSession.a := UserSession.a + '0' + Trim(eIWComboBox1.Text) //学习的单元 else UserSession.a := UserSession.a + Trim(eIWComboBox1.Text); UserSession.d := Trim(eIWComboBox1.Text); UserSession.e := Trim(eIWComboBox2.Text); if Trim(eIWComboBox2.Text) = '1' then //显示 part1 的试题内容 begin UserSession.Move(TIWindex); Exit; end; if Trim(eIWComboBox2.Text) = '2' then //显示 part2 的试题内容 begin UserSession.Move(TIWFormpart2); Exit;

Page 214: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 214页/共 376页

end; if Trim(eIWComboBox2.Text) = '3' then //显示 part3 的试题内容 begin UserSession.Move(TIWFormpart3); Exit; end; if Trim(eIWComboBox2.Text) = '4' then //显示 part4 的试题内容 begin UserSession.Move(TIWFormpart4); Exit; end; end; 每当生成时检查上一次的对册和章节的选择情况,使页面上的选择保持不变。 procedure TMainMenu1.IWFrameRegionCreate(Sender: TObject); begin if UserSession.f = '2' then IWRadioButton2.Checked:=true else IWRadioButton1.Checked:=true;//显示上次选择的册 eIWComboBox1.ItemIndex:=strtoint(UserSession.d)-1;// 显示上次选择的章 eIWComboBox2.ItemIndex:=strtoint(UserSession.e)-1;// 显示上次选择的节 end; 如果你在编程时有错误,请对应查阅本单元中 uses中的内容: uses {$IFDEF Linux}QForms, {$ELSE}Forms, {$ENDIF} {$IFDEF Linux}QControls, {$ELSE}Controls, {$ENDIF} {$IFDEF Linux}QGraphics, {$ELSE}Graphics, {$ENDIF} {$IFDEF Linux}QDialogs, {$ELSE}Dialogs, {$ENDIF} {$IFNDEF Linux} Windows, Messages, {$ENDIF} SysUtils, Classes, IWControl, IWHTMLControls, IWCompButton, IWCompLabel, IWAppForm, IWContainer, IWRegion, IWBaseControl, IWCompMenu, Menus, ImgList, IWImageList, IWVCLBaseControl, IWBaseHTMLControl, IWVCLBaseContainer, IWHTMLContainer, IWTMSMenus, IWCompListbox, IWCompRadioButton; 4.2.5 unit Uindex导读 此窗口的模板文件为 IWindex.html,图 4-2-5是这个模板文件的视图: 请大家用 dreamweaver打开查看即可。{%%}之间是窗口中的控件的 name。请用 delphi打开 unit

Uindex查看。IWRegionA和 IWRegion2控件内的所有控件不要在模板中出现。其内的所有控件会按照在 delphi中设计时的布局出现在网页中。当设置 IWRegionA的 visible属性为 false时,IWRegionA和

Page 215: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 215页/共 376页

其内的所有控件都不会出现在网页中。Intraweb 不会生成它。这种方式很有用。例如:如果你是普通用户,只让你看到 IWRegionA内的内容,如果你是管理员,你可以通过一个按钮将 IWRegionA的 visible的属性改为 false,同时把 IWRegion2的 visible的属性改为 true,这样就进入管理页面了。是不是很简单?

图 4-2-5 IWindex.html模板文件视图

此页面是本程序的首页。主要完成登录和显示每一课的 part1的内容。IWRegionA内为学习功能模块,IWRegion2为管理功能模块。这个程序的权限控制是这样的。任何人都可以学习 32个英语课程,但只有注册过并登录的人才可以使用音像剪接和测试园地。登录的人如果是管理员的,则可以维护各

个模块。 图 4-2-6为普通用户显示界面,图 4-2-7为管理员点击右下角的管理员维护后的界面:

Page 216: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 216页/共 376页

图 4-2-6 普通用户显示界面

图 4-2-7 管理员维护后的界面

对应以上两个界面的窗口控件布局如图 4-2-8(各控件类型请打开源代码自己查看:将鼠标放在窗

口控件上即可显示):TIWRegion内的控件运行时与设计时是一样的。在模板中只需要指定 TIWRegion控件出现的位置即可。

Page 217: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 217页/共 376页

图 4-2-8 IWindexl窗口控件布局

各控件的使用方法与 delphi 中数据库编程时应用的控件使用方法类似。下面我说一下我的编程思

Page 218: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 218页/共 376页

路。当窗口生成时,从数据库中取出版权信息,判断是否已经登录,是否显示欢迎信息,是否显示管

理员维护按钮,清除所填答案,根据 UserSession里的册和章节参数来查询 Part1的两种题型,将相应的字段取出来放在对应的显示控件里。答案也放在相应的控件中,当点击查看全部答案按钮时将这个

控件的 visible属性改为 true即可。当点击管理员维护按钮时将对应的信息显示在维护界面,修改完后点击确认修改向数据库提交数据。上传按钮是用来上传文件的。 每个窗口中都放了一个控件:IWTemplateProcessorHTML1,并请指定每个窗口的 layoutmgr 属性

为 IWTemplateProcessorHTML1。使该页面可以使用 html模板。此处不用写任何代码。 下面对一些代码进行讲解。 Procedure TIWindex.IWAppFormCreate(Sender: Tobject); begin BanQuan.Width := 750; BanQuan.HTMLText := ‘<div align=”center”><font size=”3”>’ + UserSession.showBanQuan +

‘</font></div>’; //设置版权信息 if UserSession.YiDengLu then//如果已经登录 begin DengLuRuKo.Visible := False;//不再显示登录输入界面,DengLuRuKo是一个 TIWRegion控件,

它不可见,其内的所有控件都不可见。 IWRectangle1.Visible := true;//用来显示欢迎信息 IWRectangle1.Text := ‘&nbsp;&nbsp;&nbsp; 欢 迎 <font color=”#FF0000”>’ +

UserSession.XingMing + ‘</font> 成功登录!关闭 IE 前请点击&quot;<font color=”#FF0000”>退出程序</font>&quot;菜单。’;//欢迎信息内容,是 html代码。

If UserSession.GuanLi_News then//如果是管理员 IWLink8.Visible := true//显示管理员维护按钮 else IWLink8.Visible := False; end; IWRegion2.Visible := False;//不显示维护界面 IWLink1Click(Sender);//执行一段代码(如下一个函数)。 End; 以下函数从数据库中取出 Part1 的试题信息给界面控件赋值。这段代码如果不用 html 代码来格式

化显就会很简洁,代码虽多,但借助于 dreamweaver等网页编辑软件来实现还是很简单的。请参阅 html相关参考书。

procedure TIWindex.IWLink1Click(Sender: TObject); var luyinfile: string; begin IWEdit1.Text := ''; IWEdit2.Text := ''; IWEdit3.Text := ''; IWEdit4.Text := '';

Page 219: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 219页/共 376页

IWEdit5.Text := ''; IWEdit6.Text := ''; IWEdit7.Text := ''; IWEdit8.Text := ''; IWEdit9.Text := ''; IWEdit10.Text := ''; IWMemo6.Text := ''; IWMemo7.Text := ''; IWMemo8.Text := ''; IWMemo9.Text := ''; IWMemo10.Text := ''; TIWHTMLLabeldaan.HTMLText := ''; //以上清空所填答案 //以下组装 TIWHTMLLabel1.HTMLText的 html代码(html代码可以借助 dreamweaver完成): UserSession.ADOQuerytemp.Close; UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Iunitname where unit =''' + UserSession.a + ''''); UserSession.ADOQuerytemp.Open; if UserSession.ADOQuerytemp.RecordCount > 0 then TIWHTMLLabel1.HTMLText := '<strong><font size="5" face="Verdana, Arial, Helvetica,

sans-serif">Unit &nbsp;' + UserSession.d + ':</font></strong>&nbsp;&nbsp;<strong><font size="5" face="Verdana, Arial, Helvetica, sans-serif">' + Trim(UserSession.ADOQuerytemp.FieldByname('name').AsString) + ' </font></strong>' + //显示课程名称

'<br><table width="100%" border="0" cellspacing="0">' + '<tr>' + '<td><div align="center"><strong><font color="#CC00CC" size="4" face="Arial, Helvetica,

sans-serif">Part ' + '1 &nbsp;&nbsp;&nbsp;&nbsp; Listening</font></strong></div></td>' + '</tr>' + '<tr>' + '<td><div align="center"><strong><font size="4" face="Arial, Helvetica,

sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#FF0000">---------<font color="#CC6633">Section' + 'A</font></font> &nbsp;&nbsp;<font color="#0099FF"><em>Spot' + '&nbsp;&nbsp;Dictation</em></font><font

color="#FF0000">---------</font></font></strong></div></td>' + '</tr>' + '<tr>' + '<td><font color="#6600FF" size="3" face="Courier New, Courier,

mono"><strong>Lexical&nbsp;' + 'Items:</strong></font></td>' + '</tr>' + '</table>'; UserSession.ADOQuerytemp.Close; //------------------------------------------- if true then //以下显示 part1 的试题内容

Page 220: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 220页/共 376页

begin UserSession.ADOQuerytemp.Close; //第一种题型 UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Asd where unit =''' + UserSession.a + ''''); UserSession.ADOQuerytemp.Open; //给页面可视控件赋值(有很多值用 html代码来格式化显示): if UserSession.ADOQuerytemp.RecordCount > 0 then begin IWMemo1.Lines.Text := Trim(UserSession.ADOQuerytemp.FieldByname('shengci').AsString); TIWHTMLLabel2.Text := '<table width="100%" border="0">' + '<tr>' + '<td><font color="#6600FF" size="3" face="Courier New, Courier,

mono"><strong>Directions:</strong></font>'; luyinfile := Trim(UserSession.ADOQuerytemp.FieldByname('directions').AsString); //如果录音

文件存在,就显示 if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\luyin\' + luyinfile) then TIWHTMLLabel2.Text := TIWHTMLLabel2.Text + ' <span id="spanSpk1"

language=javascript onClick="run(''' + 'files/luyin/' + luyinfile + ''')" >' + '<a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img

border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音"></a></span>';//请注意这一句的组装技巧,应用此句的前提是要使用本程序对应的模板,切记。

TIWHTMLLabel2.Text := TIWHTMLLabel2.Text + '</td>' + '</tr>' + '</table>' + '&nbsp;&nbsp;&nbsp;&nbsp;In this section you will hear a passage.&nbsp;&nbsp;While

listening,&nbsp;&nbsp;fill in the &nbsp; blanks with &nbsp;' + 'the words or phrases you hear.'; IWMemo2.Lines.Text := '

'+Trim(UserSession.ADOQuerytemp.FieldByname('timu').AsString); IWMemo2.Lines.Text := UserSession.ReplaceStrs(IWMemo2.Lines.Text, ')', ')____'); luyinfile := Trim(UserSession.ADOQuerytemp.FieldByname('luyin').AsString); if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\luyin\' + luyinfile) then TIWHTMLLabel3.HTMLText := ' 题 目 : <span id="spanSpk1" language=javascript

onClick="run(''' + 'files/luyin/' + luyinfile + ''')" >' + '<a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img

border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音"></a></span>';//如何调用 rm播放器播放事先设定好的视频文件

//----------------------------------- 当鼠标移动到题号上时显示单个答案 IWLabel4.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan1').AsString); IWLabel5.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan2').AsString);

Page 221: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 221页/共 376页

IWLabel6.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan3').AsString); IWLabel7.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan4').AsString); IWLabel8.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan5').AsString); IWLabel9.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan6').AsString); IWLabel10.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan7').AsString); IWLabel11.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan8').AsString); IWLabel12.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan9').AsString); IWLabel13.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan10').AsString); end; UserSession.ADOQuerytemp.Close; UserSession.ADOQuerytemp.Close; //第二种题型 UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Bsd where unit =''' + UserSession.a + ''''); UserSession.ADOQuerytemp.Open; //给页面可视控件赋值(有很多值用 html代码来格式化显示): if UserSession.ADOQuerytemp.RecordCount > 0 then begin TIWHTMLLabel4.Text := '<table width="100%" border="0"> ' + '<tr> ' + '<td><div align="center"><font color="#6600FF" size="3" face="Courier New, Courier,

mono"><strong><font size="4" face="Arial, Helvetica, sans-serif">&nbsp;&nbsp;&nbsp;<font color="#FF0000"></font><font color="#FF0000">---------<font color="#CC6633">Section' +

'B</font></font> &nbsp;&nbsp;<font color="#0099FF"><em>Sentence&nbsp;&nbsp;' + 'Dictation</em></font><font

color="#FF0000">---------</font></font></strong></font></div></td>' + '</tr>' + '<tr> ' + '<td><font color="#6600FF" size="3" face="Courier New, Courier,

mono"><strong>Directions:</strong></font>'; luyinfile := Trim(UserSession.ADOQuerytemp.FieldByname('directions').AsString); //如果录音

文件存在,就显示 if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\luyin\' + luyinfile) then TIWHTMLLabel4.Text := TIWHTMLLabel4.Text + ' <span id="spanSpk1"

language=javascript onClick="run(''' + 'files/luyin/' + luyinfile + ''')" >' + '<a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img

border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音"></a></span>'; TIWHTMLLabel4.Text := TIWHTMLLabel4.Text + '</td>' + '</tr>' + '</table>' + '&nbsp;&nbsp;&nbsp;&nbsp;In this section you will hear five sentenes.&nbsp;&nbsp;' + 'Write them down exactly as you hear them.';

Page 222: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 222页/共 376页

luyinfile := Trim(UserSession.ADOQuerytemp.FieldByname('luyin1').AsString); if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\luyin\' + luyinfile) then TIWHTMLLabel5.HTMLText := ' <span id="spanSpk1" language=javascript onClick="run('''

+ 'files/luyin/' + luyinfile + ''')" ><a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音"></a></span>';

luyinfile := Trim(UserSession.ADOQuerytemp.FieldByname('luyin2').AsString); if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\luyin\' + luyinfile) then TIWHTMLLabel6.HTMLText := ' <span id="spanSpk1" language=javascript onClick="run('''

+ 'files/luyin/' + luyinfile + ''')" ><a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音"></a></span>';

luyinfile := Trim(UserSession.ADOQuerytemp.FieldByname('luyin3').AsString); if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\luyin\' + luyinfile) then TIWHTMLLabel7.HTMLText := ' <span id="spanSpk1" language=javascript onClick="run('''

+ 'files/luyin/' + luyinfile + ''')" ><a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音"></a></span>';

luyinfile := Trim(UserSession.ADOQuerytemp.FieldByname('luyin4').AsString); if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\luyin\' + luyinfile) then TIWHTMLLabel8.HTMLText := ' <span id="spanSpk1" language=javascript onClick="run('''

+ 'files/luyin/' + luyinfile + ''')" ><a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音"></a></span>';

luyinfile := Trim(UserSession.ADOQuerytemp.FieldByname('luyin5').AsString); if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\luyin\' + luyinfile) then TIWHTMLLabel9.HTMLText := ' <span id="spanSpk1" language=javascript onClick="run('''

+ 'files/luyin/' + luyinfile + ''')" ><a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音"></a></span>'; //----------------------------------- 当鼠标移动到题号上时显示单个答案

IWLabel14.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan1').AsString); IWLabel15.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan2').AsString); IWLabel16.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan3').AsString); IWLabel17.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan4').AsString); IWLabel18.Hint:=Trim(UserSession.ADOQuerytemp.FieldByname('daan5').AsString); end; UserSession.ADOQuerytemp.Close; end; end;

点击登录按钮后,执行如下代码: procedure TIWindex.IWLink5Click(Sender: Tobject); begin

Page 223: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 223页/共 376页

if IWEdit16.Text = ‘’ then //输入框的验证 begin self.WebApplication.ShowMessage(‘请填入卡号!’); exit; end; if password.Text = ‘’ then //输入框的验证 begin self.WebApplication.ShowMessage(‘请填入密码!’); exit; end; UserSession.ADOQuerytemp.Close;//使用 UserSession内的变量例子 UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add(‘select * from G01网站用户 where 卡号=:username and 密

码=:password’); UserSession.ADOQuerytemp.Parameters.ParamByName(‘username’).Value :=

GY.Encrypt_text(Trim(IWEdit16.Text), UserSession.mm); UserSession.ADOQuerytemp.Parameters.ParamByName(‘password’).Value :=

GY.Encrypt_text(Trim(password.Text), UserSession.mm); UserSession.ADOQuerytemp.Open; if UserSession.ADOQuerytemp.RecordCount = 1 then //从数据库取出登录信息存入 UserSession以

公用,请不要详究数据定义,请关注实现方法即可 begin UserSession.XingMing := UserSession.ADOQuerytemp.FieldByname(‘姓名’).Value; UserSession.KaHao := UserSession.ADOQuerytemp.FieldByname(‘卡号’).Value; UserSession.mima := UserSession.ADOQuerytemp.FieldByname(‘密码’).Value; UserSession.GuanLi_News := UserSession.ADOQuerytemp.FieldByname(‘管理新闻系统’).Value; UserSession.GuanLi_YuYin := UserSession.ADOQuerytemp.FieldByname(‘管理语音天地系

统’).Value; UserSession.DengLuShiJian := UserSession.ADOQuerytemp.FieldByname(‘登录时间’).AsString; UserSession.XiaWangShiJian := UserSession.ADOQuerytemp.FieldByname(‘下网时间’).AsString; UserSession.LeiJiShangWangShiJian := UserSession.ADOQuerytemp.FieldByname(‘累积上网时

间’).Value; UserSession.JinRiShangWangShiJian := UserSession.ADOQuerytemp.FieldByname(‘今日上网时

间’).Value; //在数据库中标记为已经登录,并更新一些字段信息 UserSession.ADOQuerytemp.Edit; UserSession.ADOQuerytemp.FieldByname(‘已登录’).Value := true; UserSession.YiDengLu := true; UserSession.ADOQuerytemp.FieldByname(‘ 登 录 时 间 ’).Value := DateTimeToStr(Now);

UserSession.DengLuShiJian := DateTimeToStr(Now); UserSession.ADOQuerytemp.FieldByname(‘登录 IP’).Value := WebApplication.ip; UserSession.ip := WebApplication.ip;

Page 224: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 224页/共 376页

UserSession.ADOQuerytemp.FieldByname(‘ 登 录 次 数 ’).Value := UserSession.ADOQuerytemp.FieldByname(‘登录次数’).Value + 1;

UserSession.ADOQuerytemp.Post; UserSession.ADOQuerytemp.Close; DengLuRuKo.Visible := False;//不再显示登录输入界面 IWRectangle1.Visible := true;//显示欢迎信息如下 IWRectangle1.Text :=’&nbsp;&nbsp;&nbsp;<font color=”#FF0000”>’+’</font>&nbsp;欢迎 <font

color=”#FF0000”>’ + UserSession.XingMing + ‘</font> 成功登录 !关闭 IE 前请点击&quot;<font color=”#FF0000”>退出程序</font>&quot;菜单。’;

IWEdit16.Text := ‘’; password.Text := ‘’;

if UserSession.GuanLi_News then//如果是管理员 IWLink8.Visible := true//显示管理员维护按钮 else IWLink8.Visible := False; end; end else//如果没有此用户 begin self.WebApplication.ShowMessage(‘用户名或密码错误,请重新输入!’);//显示一个弹出的信息框 IWEdit16.Text := ‘’;//清空用户名输入框 password.Text := ‘’; //清空密码输入框 end;

UserSession.ADOQuerytemp.Close;//关闭查询控件,请每次这样做 end;

点击请先安装 RealPlayer按钮时执行如下代码: procedure TIWindex.IWLinkRMClick(Sender: Tobject); begin self.WebApplication.SendFile(WebApplication.ApplicationPath +

‘files\RealPlayer10.5.rar’,false,’’,’RealPlayer10-5.rar’);//让用户下载 files\RealPlayer10.5.rar 文件,下载保存文件名默认为 RealPlayer10-5.rar

end; 点击管理员维护按钮时执行如下代码: procedure TIWindex.IWLink8Click(Sender: Tobject); begin IWRegionA.Visible := False;//不显示学习界面 TIWHTMLLabeldaan.Visible:=false; //不显示题型一答案界面

TIWHTMLLabeldaan2.Visible:=false; //不显示题型二答案界面 IWRegion2.Visible := true;//显示管理员维护界面 end; procedure TIWindex.IWRegion2Render(Sender: Tobject);//当管理员维护界面 IWRegion2在页面

Page 225: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 225页/共 376页

输出时执行,目的是将数据库的记录取出赋值给相应的控件。 begin UserSession.ADOQuerytemp.Close; //第一种题型 UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Asd where unit =''' + UserSession.a + ''''); UserSession.ADOQuerytemp.Open; //给页面可视控件赋值: if UserSession.ADOQuerytemp.RecordCount > 0 then begin IWMemo3.Text := Trim(UserSession.ADOQuerytemp.FieldByname('shengci').AsString); IWMemo4.Text := Trim(UserSession.ADOQuerytemp.FieldByname('timu').AsString); IWMemo5.Text := Trim(UserSession.ADOQuerytemp.FieldByname('luyintxt').AsString); IWEdit17.Text := Trim(UserSession.ADOQuerytemp.FieldByname('directions').AsString); IWEdit18.Text := Trim(UserSession.ADOQuerytemp.FieldByname('luyin').AsString); IWEdit19.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan1').AsString); IWEdit20.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan2').AsString); IWEdit21.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan3').AsString); IWEdit22.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan4').AsString); IWEdit23.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan5').AsString); IWEdit24.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan6').AsString); IWEdit25.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan7').AsString); IWEdit26.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan8').AsString); IWEdit27.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan9').AsString); IWEdit28.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan10').AsString); end;

UserSession.ADOQuerytemp.Close; //第二种题型 UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Bsd where unit =''' + UserSession.a + ''''); UserSession.ADOQuerytemp.Open; //给页面可视控件赋值: if UserSession.ADOQuerytemp.RecordCount > 0 then begin IWMemo11.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan1').AsString); IWMemo12.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan2').AsString); IWMemo13.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan3').AsString); IWMemo14.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan4').AsString); IWMemo15.Text := Trim(UserSession.ADOQuerytemp.FieldByname('daan5').AsString); IWEdit34.Text := Trim(UserSession.ADOQuerytemp.FieldByname('directions').AsString); IWEdit35.Text := Trim(UserSession.ADOQuerytemp.FieldByname('luyin1').AsString); IWEdit36.Text := Trim(UserSession.ADOQuerytemp.FieldByname('luyin2').AsString); IWEdit37.Text := Trim(UserSession.ADOQuerytemp.FieldByname('luyin3').AsString); IWEdit38.Text := Trim(UserSession.ADOQuerytemp.FieldByname('luyin4').AsString); IWEdit39.Text := Trim(UserSession.ADOQuerytemp.FieldByname('luyin5').AsString);

Page 226: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 226页/共 376页

end; UserSession.ADOQuerytemp.Close; end; 点击第一个查看全部答案链接(即第一种题型答案)时执行如下代码: procedure TIWindex.IWLink2Click(Sender: TObject); begin

TIWHTMLLabeldaan2.HTMLText := '';//清空第二个题型的答案内容 //以下查询答案 UserSession.ADOQuerytemp.Close; UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Asd where unit =''' + UserSession.a + ''''); UserSession.ADOQuerytemp.Open; //以下对答案进行 html处理,也就是用 html代码来格式化显示答案,将答案用特定的颜色标示出

来 if UserSession.ADOQuerytemp.RecordCount > 0 then begin TIWHTMLLabeldaan.HTMLText := '<font color="#FF0000" >Spot Dictation

Tapescript:</font><br>&nbsp;&nbsp;&nbsp' + UserSession.ReplaceStrs(Trim(UserSession.ADOQuerytemp.FieldByname('luyintxt').AsString), '#', '<br>&nbsp;&nbsp;&nbsp');

TIWHTMLLabeldaan.HTMLText := UserSession.ReplaceStrs(TIWHTMLLabeldaan.HTMLText, Trim(UserSession.ADOQuerytemp.FieldByname('daan1').AsString), '<font color="#FF0000" >' + Trim(UserSession.ADOQuerytemp.FieldByname('daan1').AsString) + '</font>');

TIWHTMLLabeldaan.HTMLText := UserSession.ReplaceStrs(TIWHTMLLabeldaan.HTMLText, Trim(UserSession.ADOQuerytemp.FieldByname('daan2').AsString), '<font color="#FF0000" >' + Trim(UserSession.ADOQuerytemp.FieldByname('daan2').AsString) + '</font>');

TIWHTMLLabeldaan.HTMLText := UserSession.ReplaceStrs(TIWHTMLLabeldaan.HTMLText, Trim(UserSession.ADOQuerytemp.FieldByname('daan3').AsString), '<font color="#FF0000" >' + Trim(UserSession.ADOQuerytemp.FieldByname('daan3').AsString) + '</font>');

TIWHTMLLabeldaan.HTMLText := UserSession.ReplaceStrs(TIWHTMLLabeldaan.HTMLText, Trim(UserSession.ADOQuerytemp.FieldByname('daan4').AsString), '<font color="#FF0000" >' + Trim(UserSession.ADOQuerytemp.FieldByname('daan4').AsString) + '</font>');

TIWHTMLLabeldaan.HTMLText := UserSession.ReplaceStrs(TIWHTMLLabeldaan.HTMLText, Trim(UserSession.ADOQuerytemp.FieldByname('daan5').AsString), '<font color="#FF0000" >' + Trim(UserSession.ADOQuerytemp.FieldByname('daan5').AsString) + '</font>');

TIWHTMLLabeldaan.HTMLText := UserSession.ReplaceStrs(TIWHTMLLabeldaan.HTMLText, Trim(UserSession.ADOQuerytemp.FieldByname('daan6').AsString), '<font color="#FF0000" >' + Trim(UserSession.ADOQuerytemp.FieldByname('daan6').AsString) + '</font>');

TIWHTMLLabeldaan.HTMLText := UserSession.ReplaceStrs(TIWHTMLLabeldaan.HTMLText, Trim(UserSession.ADOQuerytemp.FieldByname('daan7').AsString), '<font color="#FF0000" >' + Trim(UserSession.ADOQuerytemp.FieldByname('daan7').AsString) + '</font>');

TIWHTMLLabeldaan.HTMLText := UserSession.ReplaceStrs(TIWHTMLLabeldaan.HTMLText, Trim(UserSession.ADOQuerytemp.FieldByname('daan8').AsString), '<font color="#FF0000" >' +

Page 227: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 227页/共 376页

Trim(UserSession.ADOQuerytemp.FieldByname('daan8').AsString) + '</font>'); TIWHTMLLabeldaan.HTMLText := UserSession.ReplaceStrs(TIWHTMLLabeldaan.HTMLText,

Trim(UserSession.ADOQuerytemp.FieldByname('daan9').AsString), '<font color="#FF0000" >' + Trim(UserSession.ADOQuerytemp.FieldByname('daan9').AsString) + '</font>');

TIWHTMLLabeldaan.HTMLText := UserSession.ReplaceStrs(TIWHTMLLabeldaan.HTMLText, Trim(UserSession.ADOQuerytemp.FieldByname('daan10').AsString), '<font color="#FF0000" >' + Trim(UserSession.ADOQuerytemp.FieldByname('daan10').AsString) + '</font>');

//如果答案正确则标示为红色: if Trim(IWEdit1.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan1').AsString) then

IWEdit1.Font.Color := clRed; if Trim(IWEdit2.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan2').AsString) then

IWEdit2.Font.Color := clRed; if Trim(IWEdit3.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan3').AsString) then

IWEdit3.Font.Color := clRed; if Trim(IWEdit4.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan4').AsString) then

IWEdit4.Font.Color := clRed; if Trim(IWEdit5.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan5').AsString) then

IWEdit5.Font.Color := clRed; if Trim(IWEdit6.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan6').AsString) then

IWEdit6.Font.Color := clRed; if Trim(IWEdit7.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan7').AsString) then

IWEdit7.Font.Color := clRed; if Trim(IWEdit8.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan8').AsString) then

IWEdit8.Font.Color := clRed; if Trim(IWEdit9.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan9').AsString) then

IWEdit9.Font.Color := clRed; if Trim(IWEdit10.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan10').AsString) then

IWEdit10.Font.Color := clRed; end; UserSession.ADOQuerytemp.Close; end; 点击第二个查看全部答案链接(即第二种题型答案)时执行如下代码: procedure TIWindex.IWLink3Click(Sender: TObject); begin TIWHTMLLabeldaan.HTMLText := '';//清空第一种题型答案 //查询答案: UserSession.ADOQuerytemp.Close; UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Bsd where unit =''' + UserSession.a + ''''); UserSession.ADOQuerytemp.Open; //以下对答案进行 html处理,也就是用 html代码来格式化显示答案,将答案用特定的颜色标示出

Page 228: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 228页/共 376页

if UserSession.ADOQuerytemp.RecordCount > 0 then begin TIWHTMLLabeldaan2.HTMLText := '<font color="#FF0000" >Sentenes Dictation

Tapescript:</font>' + '<br>&nbsp;&nbsp;<font color="#FF0000" >1.</font>' +

Trim(UserSession.ADOQuerytemp.FieldByname('daan1').AsString) + '<br>&nbsp;&nbsp;<font color="#FF0000" >2.</font>' +

Trim(UserSession.ADOQuerytemp.FieldByname('daan2').AsString) + '<br>&nbsp;&nbsp;<font color="#FF0000" >3.</font>' +

Trim(UserSession.ADOQuerytemp.FieldByname('daan3').AsString) + '<br>&nbsp;&nbsp;<font color="#FF0000" >4.</font>' +

Trim(UserSession.ADOQuerytemp.FieldByname('daan4').AsString) + '<br>&nbsp;&nbsp;<font color="#FF0000" >5.</font>' +

Trim(UserSession.ADOQuerytemp.FieldByname('daan5').AsString); //如果答案正确则标示为红色: if Trim(IWMemo6.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan1').AsString) then

IWMemo6.Font.Color := clRed; if Trim(IWMemo7.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan2').AsString) then

IWMemo7.Font.Color := clRed; if Trim(IWMemo8.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan3').AsString) then

IWMemo8.Font.Color := clRed; if Trim(IWMemo9.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan4').AsString) then

IWMemo9.Font.Color := clRed; if Trim(IWMemo10.Text) = Trim(UserSession.ADOQuerytemp.FieldByname('daan5').AsString)

then IWMemo10.Font.Color := clRed; end; UserSession.ADOQuerytemp.Close; end; 点击确认修改时执行如下代码: procedure TIWindex.IWLink7Click(Sender: TObject); begin

UserSession.ADOQuerytemp.Close; //第一种题型:找到该记录 UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Asd where unit =''' + UserSession.a + ''''); UserSession.ADOQuerytemp.Open; //给该记录赋值: if UserSession.ADOQuerytemp.RecordCount > 0 then begin UserSession.ADOQuerytemp.Edit; UserSession.ADOQuerytemp.FieldByname('shengci').AsString := IWMemo3.Text; UserSession.ADOQuerytemp.FieldByname('timu').AsString := IWMemo4.Text; UserSession.ADOQuerytemp.FieldByname('luyintxt').AsString := IWMemo5.Text; UserSession.ADOQuerytemp.FieldByname('directions').AsString := IWEdit17.Text;

Page 229: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 229页/共 376页

UserSession.ADOQuerytemp.FieldByname('luyin').AsString := IWEdit18.Text; UserSession.ADOQuerytemp.FieldByname('daan1').AsString := IWEdit19.Text; UserSession.ADOQuerytemp.FieldByname('daan2').AsString := IWEdit20.Text; UserSession.ADOQuerytemp.FieldByname('daan3').AsString := IWEdit21.Text; UserSession.ADOQuerytemp.FieldByname('daan4').AsString := IWEdit22.Text; UserSession.ADOQuerytemp.FieldByname('daan5').AsString := IWEdit23.Text; UserSession.ADOQuerytemp.FieldByname('daan6').AsString := IWEdit24.Text; UserSession.ADOQuerytemp.FieldByname('daan7').AsString := IWEdit25.Text; UserSession.ADOQuerytemp.FieldByname('daan8').AsString := IWEdit26.Text; UserSession.ADOQuerytemp.FieldByname('daan9').AsString := IWEdit27.Text; UserSession.ADOQuerytemp.FieldByname('daan10').AsString := IWEdit28.Text; UserSession.ADOQuerytemp.Post; end;

UserSession.ADOQuerytemp.Close; //第二种题型:找到该记录 UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Bsd where unit =''' + UserSession.a + ''''); UserSession.ADOQuerytemp.Open; //给该记录赋值: if UserSession.ADOQuerytemp.RecordCount > 0 then begin UserSession.ADOQuerytemp.Edit; UserSession.ADOQuerytemp.FieldByname('daan1').AsString := IWMemo11.Text; UserSession.ADOQuerytemp.FieldByname('daan2').AsString := IWMemo12.Text; UserSession.ADOQuerytemp.FieldByname('daan3').AsString := IWMemo13.Text; UserSession.ADOQuerytemp.FieldByname('daan4').AsString := IWMemo14.Text; UserSession.ADOQuerytemp.FieldByname('daan5').AsString := IWMemo15.Text; UserSession.ADOQuerytemp.FieldByname('directions').AsString := IWEdit34.Text; UserSession.ADOQuerytemp.FieldByname('luyin1').AsString := IWEdit35.Text; UserSession.ADOQuerytemp.FieldByname('luyin2').AsString := IWEdit36.Text; UserSession.ADOQuerytemp.FieldByname('luyin3').AsString := IWEdit37.Text; UserSession.ADOQuerytemp.FieldByname('luyin4').AsString := IWEdit38.Text; UserSession.ADOQuerytemp.FieldByname('luyin5').AsString := IWEdit39.Text; UserSession.ADOQuerytemp.Post; end; UserSession.ADOQuerytemp.Close; self.WebApplication.ShowMessage('修改完毕!'); end; 这一节代码虽不少但都是一些给相应的控件的赋值操作,代码可以重复拷贝稍作修改即可,所以,

如果界面设计好后程序编写速度应该很快。这与原 delphi下的编程完全类似。各个控件的使用参考相应的代码即可学会,而且这种编程方法将程序设计与界面设计分开,也有利于编程的分工合作。 最后请在每个窗口的 javascript属性中加入如下代码,目的是让鼠标放在链接上时有彩虹效果。不

用明白代码是怎么实现的,照抄就行:

Page 230: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 230页/共 376页

var rate = 30; var obj; var act = 0; var elmH = 0; var elmS = 128; var elmV = 255; var clrOrg; var TimerID; if (navigator.appName.indexOf(“Microsoft”,0) != -1 && parseInt(navigator.appVersion) >= 4) { Browser = true; } else { Browser = false; } if (Browser) { document.onmouseover = doRainbowAnchor; document.onmouseout = stopRainbowAnchor; } function doRainbow() { if (Browser && act != 1) { act = 1; obj = event.srcElement; clrOrg = obj.style.color; TimerID = setInterval(“ChangeColor()”,100); } } function stopRainbow() { if (Browser && act != 0) { obj.style.color = clrOrg; clearInterval(TimerID); act = 0; } } function doRainbowAnchor() { if (Browser && act != 1) { obj = event.srcElement; while (obj.tagName != ‘A’ && obj.tagName != ‘BODY’) { obj = obj.parentElement; if (obj.tagName == ‘A’ || obj.tagName == ‘BODY’) break;

Page 231: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 231页/共 376页

} if (obj.tagName == ‘A’ && obj.href != ‘’) { act = 1; clrOrg = obj.style.color; TimerID = setInterval(“ChangeColor()”,100); } } } function stopRainbowAnchor() { if (Browser && act != 0) { if (obj.tagName == ‘A’) { obj.style.color = clrOrg; clearInterval(TimerID); act = 0; } } } function ChangeColor() { obj.style.color = makeColor(); } function makeColor() { if (elmS == 0) { elmR = elmV; elmG = elmV; elmB = elmV; } else { t1 = elmV; t2 = (255 – elmS) * elmV / 255; t3 = elmH % 60; t3 = (t1 – t2) * t3 / 60; if (elmH < 60) { elmR = t1; elmB = t2; elmG = t2 + t3; } else if (elmH < 120) { elmG = t1; elmB = t2; elmR = t1 – t3; } else if (elmH < 180) { elmG = t1; elmR = t2; elmB = t2 + t3; } else if (elmH < 240) {

Page 232: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 232页/共 376页

elmB = t1; elmR = t2; elmG = t1 – t3; } else if (elmH < 300) { elmB = t1; elmG = t2; elmR = t2 + t3; } else if (elmH < 360) { elmR = t1; elmG = t2; elmB = t1 – t3; } else { elmR = 0; elmG = 0; elmB = 0; } } elmR = Math.floor(elmR); elmG = Math.floor(elmG); elmB = Math.floor(elmB); clrRGB = ‘#’ + elmR.toString(16) + elmG.toString(16) + elmB.toString(16); elmH = elmH + rate; if (elmH >= 360) elmH = 0; return clrRGB; }

请在每个窗口的 extraheader属性中加入如下代码,目的是让窗口每次输出页面时都有一个特效: <meta HTTP-EQUIV=”Page-Enter” CONTENT=”revealtrans(duration=0.5, transition=23)”>

每个窗口中放了一个 ComGrid控件,是用来响应页面 IE的关闭事件的。在 UserSession中已有相

关说明。以后不再提及。 procedure TIWindex.ComGridColumns0Click(ASender: TObject;const AValue: string); begin UserSession.closesessoion;//用来关闭当前活动窗口 end; 4.2.6 unit Upart2导读 这个单元与 unit Uindex单元很类似,这个单元用来显示一个英语课程的 Part2 的两种题型。此窗

口的模板文件为 IWFormpart2.html,图 4-2-9是这个模板文件的视图。请大家用 dreamweaver打开查看即可。{%%}之间是窗口中的控件的 name。IWRegionA和 IWRegion2控件内的所有控件不要在模板中出现。其内的所有控件会按照在 delphi中设计时的布局出现在网页中。当设置 IWRegionA的 visible属性为 false时,IWRegionA和其内的所有控件都不会出现在网页中。Intraweb不会生成它。这种方式很有用。例如:如果你是普通用户,只让你看到 IWRegionA内的内容,如果你是管理员,你可以通过一个按钮将 IWRegionA的 visible的属性改为 false,同时把 IWRegion2的 visible的属性改为 true,这样就进入管理页面了。

Page 233: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 233页/共 376页

图 4-2-9 IWFormpart2.html模板文件视图

图 4-2-10为普通用户显示界面,图 4-2-11为管理员点击右下角的管理员维护后的界面:

图 4-2-10 普通用户显示界面

图 4-2-11 管理员维护界面 对应以上两个界面的窗口控件布局如图 4-2-12(各控件类型请打开源代码自己查看:将鼠标放在

Page 234: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 234页/共 376页

窗口控件上即可显示):TIWRegion 内的控件运行时与设计时是一样的。在模板中只需要指定TIWRegion控件出现的位置即可。

Page 235: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 235页/共 376页

图 4-2-12 IWFormpart2窗口控件布局

Page 236: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 236页/共 376页

各控件的使用方法与 delphi 中数据库编程时应用的控件使用方法类似。下面我说一下我的编程思

路。当窗口生成时,从数据库中取出版权信息,判断是否已经登录,是否显示欢迎信息,是否显示管

理员维护按钮,清除所填答案,根据 UserSession里的册和章节参数来查询 Part2的两种题型,将相应的字段取出来放在对应的显示控件里。答案也放在相应的控件中,当点击查看全部答案按钮时将这个

控件的 visible属性改为 true即可。当点击管理员维护按钮时将对应的信息显示在维护界面,修改完后点击确认修改向数据库提交数据。上传按钮是用来上传文件的。 此页面代码难度与 unit Uindex单元一样。主要的不同在于可视控件不完全一样,这主要是因为题

型不一样的缘故。如果 unit Uindex单元的代码可以看明白,这个单元当然也没有问题。在此不对代码作进一步的说明。

4.2.7 unit Upart3导读 这个单元与 unit Uindex单元很类似,这个单元用来显示一个英语课程的 Part3 的三种题型。此窗

口的模板文件为 IWFormpart3.html,图 4-2-13 是这个模板文件的视图。请大家用 dreamweaver 打开查看即可。{%%}之间是窗口中的控件的 name。IWRegionA和 IWRegion2控件内的所有控件不要在模板中出现。其内的所有控件会按照在 delphi 中设计时的布局出现在网页中。当设置 IWRegionA 的visible属性为 false时,IWRegionA和其内的所有控件都不会出现在网页中。Intraweb不会生成它。这种方式很有用。例如:如果你是普通用户,只让你看到 IWRegionA内的内容,如果你是管理员,你可以通过一个按钮将 IWRegionA的 visible的属性改为 false,同时把 IWRegion2的 visible的属性改为 true,这样就进入管理页面了。

图 4-2-13 IWFormpart3.html模板文件视图 图 4-2-14为普通用户显示界面,图 4-2-15为管理员点击右下角的管理员维护后的界面:

Page 237: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 237页/共 376页

图 4-2-14 普通用户显示界面

图 4-2-15 管理员维护界面 对应以上两个界面的窗口控件布局如图 4-2-16(各控件类型请打开源代码自己查看:将鼠标放在

窗口控件上即可显示):TIWRegion 内的控件运行时与设计时是一样的。在模板中只需要指定TIWRegion控件出现的位置即可。

Page 238: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 238页/共 376页

图 4-2-16 IWFormpart3窗口控件布局

各控件的使用方法与 delphi 中数据库编程时应用的控件使用方法类似。下面我说一下我的编程思

路。当窗口生成时,从数据库中取出版权信息,判断是否已经登录,是否显示欢迎信息,是否显示管

理员维护按钮,清除所填答案,根据 UserSession里的册和章节参数来查询 Part3的两种题型,将相应的字段取出来放在对应的显示控件里。答案也放在相应的控件中,当点击查看全部答案按钮时将这个

控件的 visible属性改为 true即可。当点击管理员维护按钮时将对应的信息显示在维护界面,修改完后点击确认修改向数据库提交数据。上传按钮是用来上传文件的。 此页面代码难度与 unit Uindex单元一样。主要的不同在于可视控件不完全一样,这主要是因为题

型不一样的缘故。如果 unit Uindex单元的代码可以看明白,这个单元当然也没有问题。在此不对代码作进一步的说明。

4.2.8 unit Upart4导读 这个单元与 unit Uindex单元很类似,这个单元用来显示一个英语课程的 Part4 的一种题型。此窗

口的模板文件为 IWFormpart4.html,图 4-2-17 是这个模板文件的视图。请大家用 dreamweaver 打开查看即可。{%%}之间是窗口中的控件的 name。IWRegionA和 IWRegion2控件内的所有控件不要在模板中出现。其内的所有控件会按照在 delphi 中设计时的布局出现在网页中。当设置 IWRegionA 的

Page 239: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 239页/共 376页

visible属性为 false时,IWRegionA和其内的所有控件都不会出现在网页中。Intraweb不会生成它。这种方式很有用。例如:如果你是普通用户,只让你看到 IWRegionA内的内容,如果你是管理员,你可以通过一个按钮将 IWRegionA的 visible的属性改为 false,同时把 IWRegion2的 visible的属性改为 true,这样就进入管理页面了。

图 4-2-17 IWFormpart4.html模板文件视图

图 4-2-18为普通用户显示界面,图 4-2-19为管理员点击右下角的管理员维护后的界面:

图 4-2-18 普通用户显示界面

图 4-2-19 管理员维护界面 对应以上两个界面的窗口控件布局如图 4-2-20(各控件类型请打开源代码自己查看:将鼠标放在

窗口控件上即可显示):TIWRegion 内的控件运行时与设计时是一样的。在模板中只需要指定TIWRegion控件出现的位置即可。

Page 240: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 240页/共 376页

图 4-2-20 IWFormpart4窗口控件布局

各控件的使用方法与 delphi 中数据库编程时应用的控件使用方法类似。下面我说一下我的编程思

路。当窗口生成时,从数据库中取出版权信息,判断是否已经登录,是否显示欢迎信息,是否显示管

理员维护按钮,清除所填答案,根据 UserSession里的册和章节参数来查询 Part4的题型,将相应的字段取出来放在对应的显示控件里。答案也放在相应的控件中,当点击查看全部答案按钮时将这个控件

的 visible属性改为 true即可。当点击管理员维护按钮时将对应的信息显示在维护界面,修改完后点击确认修改向数据库提交数据。上传按钮是用来上传文件的。

Page 241: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 241页/共 376页

此页面代码难度比 unit Uindex单元简单。主要的不同在于可视控件不完全一样,这主要是因为题型不一样的缘故。如果 unit Uindex单元的代码可以看明白,这个单元当然也没有问题。在此不对代码作进一步的说明。 到这里为止,大家可以看出,这与原来的用 delphi 编程没有什么区别,只是换了几个控件而已。

而且这些控件的使用都是很简单的。属性几乎一看就明白,方法也基本上一看就知道是什么意思。而

且这 4个单元极其相似,真正编程时有大部分代码是可以拷贝重用的。所以编程效率是很高的。

4.2.9 unit Unitcsyd(测试园地)导读 这个单元与 unit Uindex单元很类似,这个单元用来显示一个英语测试的两种题型。此窗口的模板

文件为 IWFormcsyd.html,图 4-2-21是这个模板文件的视图。请大家用 dreamweaver打开查看即可。{%%}之间是窗口中的控件的 name。IWRegionA和 IWRegion2控件内的所有控件不要在模板中出现。其内的所有控件会按照在 delphi 中设计时的布局出现在网页中。当设置 IWRegionA 的 visible 属性为false时,IWRegionA和其内的所有控件都不会出现在网页中。Intraweb不会生成它。这种方式很有用。例如:如果你是普通用户,只让你看到 IWRegionA内的内容,如果你是管理员,你可以通过一个按钮将 IWRegionA的 visible的属性改为 false,同时把 IWRegion2的 visible的属性改为 true,这样就进入管理页面了。

图 4-2-21 IWFormcsyd.html模板文件视图

图 4-2-22为普通用户显示界面,图 4-2-23为管理员点击右下角的管理员维护后的界面:

Page 242: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 242页/共 376页

图 4-2-22 普通用户显示界面

图 4-2-23 管理员维护界面 对应以上两个界面的窗口控件布局如图 4-2-24(各控件类型请打开源代码自己查看:将鼠标放在

窗口控件上即可显示):TIWRegion 内的控件运行时与设计时是一样的。在模板中只需要指定TIWRegion控件出现的位置即可。

Page 243: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 243页/共 376页

图 4-2-24 IWFormcsyd窗口控件布局

下面对一些代码进行讲解。 procedure TIWFormcsyd.IWComboBox1Change(Sender: TObject);//根据选择的单元进行出题 var luyinfile, a, script, key, key2: string; begin

Page 244: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 244页/共 376页

//清空答案 IWEdit1.Text := ''; IWEdit2.Text := ''; IWEdit3.Text := ''; IWEdit4.Text := ''; IWEdit5.Text := ''; IWEdit6.Text := ''; IWEdit7.Text := ''; IWEdit8.Text := ''; IWEdit9.Text := ''; IWEdit10.Text := ''; IWEdit11.Text := ''; IWEdit12.Text := ''; IWEdit13.Text := ''; IWEdit14.Text := ''; IWEdit15.Text := ''; //清空答案 a := rightstr(trim(IWComboBox1.Text), 2);//得出是哪个单元 UserSession.ADOQuerytemp.Close; UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Jcsyd where uint =''' + a + '''');//查询该单元题目 UserSession.ADOQuerytemp.Open; if UserSession.ADOQuerytemp.RecordCount = 1 then //如果此单元有题目 begin TIWHTMLLabel0.HTMLText := '<table width="100%" border="0">' + '<tr> ' + '<td><strong>测试' + a + ': LISTENING COMPREHENSION (15 minutes, 15 points)'; luyinfile := trim(UserSession.ADOQuerytemp.FieldByname('luyin').AsString); if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\luyin\' + luyinfile) then //如果录音文件存在,就显示 TIWHTMLLabel0.Text := TIWHTMLLabel0.Text + '&nbsp;Directions:<span id="spanSpk1" language=javascript onClick="run(''' + 'files/luyin/' + luyinfile + ''')" >' + '<a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音"></a></span>'; //以上两句为在页面上生成播放该录音文件的链接,前提是使用本程序自带的模板,因为它调用了模板内的相应代码。请大家好好研究一下模板,该模板可以用来制作播放影音文件的相关程序。 TIWHTMLLabel0.Text := TIWHTMLLabel0.Text + '<br></strong></td> ' + '</tr> ' + '<tr> ' + '<td><strong>Section A (1 point each)<br> ' + '</strong></td>' +

Page 245: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 245页/共 376页

'</tr>' + '<tr> ' + '<td><strong>Directions:</strong> In this section, you will hear nine short ' + 'conversations between two speakers. At the end of each conversation, a third ' + 'voice will ask a question about what was said. The question will be spoken ' + 'only once. Choose the best answer from the four choices given by marking ' + 'the corresponding letter with a single bar across the square brackets on ' + 'your Machine-scoring Answer Sheet.</td>' + '</tr>' + '</table> '; //以上为用 html代码格式化显示题干内容,显示效果如图 4-2-22最上面所示。 //以下显示试题内容和答案,在点击“查看答案”按钮前,所有显示答案的控件的 visible属性都是 false。 TIWHTMLLabel1.Text := '1.' + trim(UserSession.ADOQuerytemp.FieldByname('A1').AsString);//在TIWHTMLLabel1中显示 A1字段的内容(第一小题) TIWHTMLLabel1.Text := UserSession.ReplaceStrs(TIWHTMLLabel1.Text, '[B', '<br>&nbsp;&nbsp;[B');//对该题目的字串进行 html 改造:将[B替换成<br>&nbsp;&nbsp;[B,目的是换行且留下两个空格。以下两句相似。 TIWHTMLLabel1.Text := UserSession.ReplaceStrs(TIWHTMLLabel1.Text, '[C', '<br>&nbsp;&nbsp;[C'); TIWHTMLLabel1.Text := UserSession.ReplaceStrs(TIWHTMLLabel1.Text, '[D', '<br>&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Ascript1').AsString);//取出录音文字材料 key := trim(UserSession.ADOQuerytemp.FieldByname('Akey1').AsString);//取出该题目的答案 TIWSmartPanel1.Lines.Text := '<font color="#FF0000">1.Tape Script:</font><br>' + script + '<br>[Key]:<font color="#FF0000">' + key + '</font>';//将录音文字材料和答案放在TIWSmartPanel1控件中。 //************************************以下每个题目都是使用了类似的方法: TIWHTMLLabel2.Text := '2.' + trim(UserSession.ADOQuerytemp.FieldByname('A2').AsString); TIWHTMLLabel2.Text := UserSession.ReplaceStrs(TIWHTMLLabel2.Text, '[B', '<br>&nbsp;&nbsp;[B'); TIWHTMLLabel2.Text := UserSession.ReplaceStrs(TIWHTMLLabel2.Text, '[C', '<br>&nbsp;&nbsp;[C'); TIWHTMLLabel2.Text := UserSession.ReplaceStrs(TIWHTMLLabel2.Text, '[D', '<br>&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Ascript2').AsString); key := trim(UserSession.ADOQuerytemp.FieldByname('Akey2').AsString); TIWSmartPanel2.Lines.Text := '<font color="#FF0000">2.Tape Script:</font><br>' + script + '<br>[Key]:<font color="#FF0000">' + key + '</font>'; //************************************ TIWHTMLLabel3.Text := '3.' + trim(UserSession.ADOQuerytemp.FieldByname('A3').AsString); TIWHTMLLabel3.Text := UserSession.ReplaceStrs(TIWHTMLLabel3.Text, '[B', '<br>&nbsp;&nbsp;[B');

Page 246: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 246页/共 376页

TIWHTMLLabel3.Text := UserSession.ReplaceStrs(TIWHTMLLabel3.Text, '[C', '<br>&nbsp;&nbsp;[C'); TIWHTMLLabel3.Text := UserSession.ReplaceStrs(TIWHTMLLabel3.Text, '[D', '<br>&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Ascript3').AsString); key := trim(UserSession.ADOQuerytemp.FieldByname('Akey3').AsString); TIWSmartPanel3.Lines.Text := '<font color="#FF0000">3.Tape Script:</font><br>' + script + '<br>[Key]:<font color="#FF0000">' + key + '</font>'; //************************************ TIWHTMLLabel4.Text := '4.' + trim(UserSession.ADOQuerytemp.FieldByname('A4').AsString); TIWHTMLLabel4.Text := UserSession.ReplaceStrs(TIWHTMLLabel4.Text, '[B', '<br>&nbsp;&nbsp;[B'); TIWHTMLLabel4.Text := UserSession.ReplaceStrs(TIWHTMLLabel4.Text, '[C', '<br>&nbsp;&nbsp;[C'); TIWHTMLLabel4.Text := UserSession.ReplaceStrs(TIWHTMLLabel4.Text, '[D', '<br>&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Ascript4').AsString); key := trim(UserSession.ADOQuerytemp.FieldByname('Akey4').AsString); TIWSmartPanel4.Lines.Text := '<font color="#FF0000">4.Tape Script:</font><br>' + script + '<br>[Key]:<font color="#FF0000">' + key + '</font>'; //************************************ TIWHTMLLabel5.Text := '5.' + trim(UserSession.ADOQuerytemp.FieldByname('A5').AsString); TIWHTMLLabel5.Text := UserSession.ReplaceStrs(TIWHTMLLabel5.Text, '[B', '<br>&nbsp;&nbsp;[B'); TIWHTMLLabel5.Text := UserSession.ReplaceStrs(TIWHTMLLabel5.Text, '[C', '<br>&nbsp;&nbsp;[C'); TIWHTMLLabel5.Text := UserSession.ReplaceStrs(TIWHTMLLabel5.Text, '[D', '<br>&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Ascript5').AsString); key := trim(UserSession.ADOQuerytemp.FieldByname('Akey5').AsString); TIWSmartPanel5.Lines.Text := '<font color="#FF0000">5.Tape Script:</font><br>' + script + '<br>[Key]:<font color="#FF0000">' + key + '</font>'; //************************************ TIWHTMLLabel6.Text := '6.' + trim(UserSession.ADOQuerytemp.FieldByname('A6').AsString); TIWHTMLLabel6.Text := UserSession.ReplaceStrs(TIWHTMLLabel6.Text, '[B', '<br>&nbsp;&nbsp;[B'); TIWHTMLLabel6.Text := UserSession.ReplaceStrs(TIWHTMLLabel6.Text, '[C', '<br>&nbsp;&nbsp;[C'); TIWHTMLLabel6.Text := UserSession.ReplaceStrs(TIWHTMLLabel6.Text, '[D', '<br>&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Ascript6').AsString);

Page 247: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 247页/共 376页

key := trim(UserSession.ADOQuerytemp.FieldByname('Akey6').AsString); TIWSmartPanel6.Lines.Text := '<font color="#FF0000">6.Tape Script:</font><br>' + script + '<br>[Key]:<font color="#FF0000">' + key + '</font>'; //************************************ TIWHTMLLabel7.Text := '7.' + trim(UserSession.ADOQuerytemp.FieldByname('A7').AsString); TIWHTMLLabel7.Text := UserSession.ReplaceStrs(TIWHTMLLabel7.Text, '[B', '<br>&nbsp;&nbsp;[B'); TIWHTMLLabel7.Text := UserSession.ReplaceStrs(TIWHTMLLabel7.Text, '[C', '<br>&nbsp;&nbsp;[C'); TIWHTMLLabel7.Text := UserSession.ReplaceStrs(TIWHTMLLabel7.Text, '[D', '<br>&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Ascript7').AsString); key := trim(UserSession.ADOQuerytemp.FieldByname('Akey7').AsString); TIWSmartPanel7.Lines.Text := '<font color="#FF0000">7.Tape Script:</font><br>' + script + '<br>[Key]:<font color="#FF0000">' + key + '</font>'; //************************************ TIWHTMLLabel8.Text := '8.' + trim(UserSession.ADOQuerytemp.FieldByname('A8').AsString); TIWHTMLLabel8.Text := UserSession.ReplaceStrs(TIWHTMLLabel8.Text, '[B', '<br>&nbsp;&nbsp;[B'); TIWHTMLLabel8.Text := UserSession.ReplaceStrs(TIWHTMLLabel8.Text, '[C', '<br>&nbsp;&nbsp;[C'); TIWHTMLLabel8.Text := UserSession.ReplaceStrs(TIWHTMLLabel8.Text, '[D', '<br>&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Ascript8').AsString); key := trim(UserSession.ADOQuerytemp.FieldByname('Akey8').AsString); TIWSmartPanel8.Lines.Text := '<font color="#FF0000">8.Tape Script:</font><br>' + script + '<br>[Key]:<font color="#FF0000">' + key + '</font>'; //************************************ TIWHTMLLabel9.Text := '9.' + trim(UserSession.ADOQuerytemp.FieldByname('A9').AsString); TIWHTMLLabel9.Text := UserSession.ReplaceStrs(TIWHTMLLabel9.Text, '[B', '<br>&nbsp;&nbsp;[B'); TIWHTMLLabel9.Text := UserSession.ReplaceStrs(TIWHTMLLabel9.Text, '[C', '<br>&nbsp;&nbsp;[C'); TIWHTMLLabel9.Text := UserSession.ReplaceStrs(TIWHTMLLabel9.Text, '[D', '<br>&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Ascript9').AsString); key := trim(UserSession.ADOQuerytemp.FieldByname('Akey9').AsString); TIWSmartPanel9.Lines.Text := '<font color="#FF0000">9.Tape Script:</font><br>' + script + '<br>[Key]:<font color="#FF0000">' + key + '</font>'; //************************************

Page 248: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 248页/共 376页

//------------------------------------------- 另一题型 TIWHTMLLabelpassage.HTMLText := '<table width="100%" border="0">' + '<tr> ' + '<td><strong>Section B (1 point each)<br> ' + '</strong></td>' + '</tr>' + '<tr> ' + '<td><strong>Directions:</strong> In this section, you will hear three short passages. ' + 'At the end of each passage, there will be some questions. Both the passage and the questions ' + 'will be read to you only once. After each question, there will be a pause. During the pause, ' + 'you must choose the best answer from the four choices given by marking the corresponding letter ' + 'with a single bar across the square brackets on your Machine-scoring Answer Sheet.</td>' + '</tr>' + '</table> '; TIWHTMLLabel10.Text := '10.' + trim(UserSession.ADOQuerytemp.FieldByname('B10').AsString); TIWHTMLLabel10.Text := UserSession.ReplaceStrs(TIWHTMLLabel10.Text, '[B', '<br>&nbsp;&nbsp;&nbsp;[B'); TIWHTMLLabel10.Text := UserSession.ReplaceStrs(TIWHTMLLabel10.Text, '[C', '<br>&nbsp;&nbsp;&nbsp;[C'); TIWHTMLLabel10.Text := UserSession.ReplaceStrs(TIWHTMLLabel10.Text, '[D', '<br>&nbsp;&nbsp;&nbsp;[D'); //************************************ TIWHTMLLabel11.Text := '11.' + trim(UserSession.ADOQuerytemp.FieldByname('B11').AsString); TIWHTMLLabel11.Text := UserSession.ReplaceStrs(TIWHTMLLabel11.Text, '[B', '<br>&nbsp;&nbsp;&nbsp;[B'); TIWHTMLLabel11.Text := UserSession.ReplaceStrs(TIWHTMLLabel11.Text, '[C', '<br>&nbsp;&nbsp;&nbsp;[C'); TIWHTMLLabel11.Text := UserSession.ReplaceStrs(TIWHTMLLabel11.Text, '[D', '<br>&nbsp;&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Bscript1').AsString); key := trim(UserSession.ADOQuerytemp.FieldByname('Bkey10').AsString); key2 := trim(UserSession.ADOQuerytemp.FieldByname('Bkey11').AsString); TIWSmartPanel11.Lines.Text := '<font color="#FF0000">10 and 11.Tape Script:</font><br>' + script + '<br>[Key]10:<font color="#FF0000">' + key + '</font>' + '<br>[Key]11:<font color="#FF0000">' + key2 + '</font>'; //************************************ TIWHTMLLabel12.Text := '12.' + trim(UserSession.ADOQuerytemp.FieldByname('B12').AsString); TIWHTMLLabel12.Text := UserSession.ReplaceStrs(TIWHTMLLabel12.Text, '[B', '<br>&nbsp;&nbsp;&nbsp;[B'); TIWHTMLLabel12.Text := UserSession.ReplaceStrs(TIWHTMLLabel12.Text, '[C',

Page 249: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 249页/共 376页

'<br>&nbsp;&nbsp;&nbsp;[C'); TIWHTMLLabel12.Text := UserSession.ReplaceStrs(TIWHTMLLabel12.Text, '[D', '<br>&nbsp;&nbsp;&nbsp;[D'); //************************************ TIWHTMLLabel13.Text := '13.' + trim(UserSession.ADOQuerytemp.FieldByname('B13').AsString); TIWHTMLLabel13.Text := UserSession.ReplaceStrs(TIWHTMLLabel13.Text, '[B', '<br>&nbsp;&nbsp;&nbsp;[B'); TIWHTMLLabel13.Text := UserSession.ReplaceStrs(TIWHTMLLabel13.Text, '[C', '<br>&nbsp;&nbsp;&nbsp;[C'); TIWHTMLLabel13.Text := UserSession.ReplaceStrs(TIWHTMLLabel13.Text, '[D', '<br>&nbsp;&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Bscript2').AsString); key := trim(UserSession.ADOQuerytemp.FieldByname('Bkey12').AsString); key2 := trim(UserSession.ADOQuerytemp.FieldByname('Bkey13').AsString); TIWSmartPanel13.Lines.Text := '<font color="#FF0000">12 and 13.Tape Script:</font><br>' + script + '<br>[Key]12:<font color="#FF0000">' + key + '</font>' + '<br>[Key]13:<font color="#FF0000">' + key2 + '</font>'; //************************************ TIWHTMLLabel14.Text := '14.' + trim(UserSession.ADOQuerytemp.FieldByname('B14').AsString); TIWHTMLLabel14.Text := UserSession.ReplaceStrs(TIWHTMLLabel14.Text, '[B', '<br>&nbsp;&nbsp;&nbsp;[B'); TIWHTMLLabel14.Text := UserSession.ReplaceStrs(TIWHTMLLabel14.Text, '[C', '<br>&nbsp;&nbsp;&nbsp;[C'); TIWHTMLLabel14.Text := UserSession.ReplaceStrs(TIWHTMLLabel14.Text, '[D', '<br>&nbsp;&nbsp;&nbsp;[D'); //************************************ TIWHTMLLabel15.Text := '15.' + trim(UserSession.ADOQuerytemp.FieldByname('B15').AsString); TIWHTMLLabel15.Text := UserSession.ReplaceStrs(TIWHTMLLabel15.Text, '[B', '<br>&nbsp;&nbsp;&nbsp;[B'); TIWHTMLLabel15.Text := UserSession.ReplaceStrs(TIWHTMLLabel15.Text, '[C', '<br>&nbsp;&nbsp;&nbsp;[C'); TIWHTMLLabel15.Text := UserSession.ReplaceStrs(TIWHTMLLabel15.Text, '[D', '<br>&nbsp;&nbsp;&nbsp;[D'); script := trim(UserSession.ADOQuerytemp.FieldByname('Bscript3').AsString); key := trim(UserSession.ADOQuerytemp.FieldByname('Bkey14').AsString); key2 := trim(UserSession.ADOQuerytemp.FieldByname('Bkey15').AsString); TIWSmartPanel15.Lines.Text := '<font color="#FF0000">14 and 15.Tape Script:</font><br>' + script + '<br>[Key]14:<font color="#FF0000">' + key + '</font>' + '<br>[Key]15:<font color="#FF0000">' + key2 + '</font>'; //************************************ end

Page 250: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 250页/共 376页

else //如果此单元无题目 begin TIWSmartPanel1.Lines.Text := ''; TIWSmartPanel2.Lines.Text := ''; TIWSmartPanel3.Lines.Text := ''; TIWSmartPanel4.Lines.Text := ''; TIWSmartPanel5.Lines.Text := ''; TIWSmartPanel6.Lines.Text := ''; TIWSmartPanel7.Lines.Text := ''; TIWSmartPanel8.Lines.Text := ''; TIWSmartPanel9.Lines.Text := ''; TIWSmartPanel11.Lines.Text := ''; TIWSmartPanel3.Lines.Text := ''; TIWSmartPanel5.Lines.Text := ''; TIWHTMLLabel1.Text := ''; TIWHTMLLabel2.Text := ''; TIWHTMLLabel3.Text := ''; TIWHTMLLabel4.Text := ''; TIWHTMLLabel5.Text := ''; TIWHTMLLabel6.Text := ''; TIWHTMLLabel7.Text := ''; TIWHTMLLabel8.Text := ''; TIWHTMLLabel9.Text := ''; TIWHTMLLabel10.Text := ''; TIWHTMLLabel11.Text := ''; TIWHTMLLabel12.Text := ''; TIWHTMLLabel13.Text := ''; TIWHTMLLabel14.Text := ''; TIWHTMLLabel15.Text := ''; self.WebApplication.ShowMessage('暂无题目,请等候加入。'); end; UserSession.ADOQuerytemp.Close;//关闭数据库查询控件 //以下 12句将答案显示控件隐藏 TIWSmartPanel1.Visible := false; TIWSmartPanel2.Visible := false; TIWSmartPanel3.Visible := false; TIWSmartPanel4.Visible := false; TIWSmartPanel5.Visible := false; TIWSmartPanel6.Visible := false; TIWSmartPanel7.Visible := false; TIWSmartPanel8.Visible := false; TIWSmartPanel9.Visible := false; TIWSmartPanel11.Visible := false;

Page 251: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 251页/共 376页

TIWSmartPanel13.Visible := false; TIWSmartPanel15.Visible := false; end; procedure TIWFormcsyd.IWAppFormCreate(Sender: TObject);//窗口生成时执行 begin //版权信息 BanQuan.Width := 750; BanQuan.HTMLText := '<div align="center"><font size="3">' + UserSession.showBanQuan + '</font></div>'; if UserSession.GuanLi_News then//如果是管理员则显示 IWLink8控件,这样就有管理员维护按钮出现 IWLink8.Visible := true else

IWLink8.Visible := false;

IWRegion2.Visible := false;//隐藏管理员维护界面 IWComboBox1Change(Sender);//查询题目 end; procedure TIWFormcsyd.IWLink2Click(Sender: TObject);//点击查看答案按钮时执行 var s: string; i: integer; begin //答案显示控件全部可见 TIWSmartPanel1.Visible := true; TIWSmartPanel2.Visible := true; TIWSmartPanel3.Visible := true; TIWSmartPanel4.Visible := true; TIWSmartPanel5.Visible := true; TIWSmartPanel6.Visible := true; TIWSmartPanel7.Visible := true; TIWSmartPanel8.Visible := true; TIWSmartPanel9.Visible := true; TIWSmartPanel11.Visible := true; TIWSmartPanel13.Visible := true; TIWSmartPanel15.Visible := true; //以下为核对答案,如果对了,则显示为红色且总分数加一 i := 0; s := trim(IWEdit1.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Akey1').AsString) then begin IWEdit1.Font.Color := clRed; i := i + 1; end;

Page 252: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 252页/共 376页

s := trim(IWEdit2.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Akey2').AsString) then begin IWEdit2.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit3.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Akey3').AsString) then begin IWEdit3.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit4.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Akey4').AsString) then begin IWEdit4.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit5.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Akey5').AsString) then begin IWEdit5.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit6.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Akey6').AsString) then begin IWEdit6.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit7.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Akey7').AsString) then begin IWEdit7.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit8.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Akey8').AsString) then begin IWEdit8.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit9.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Akey9').AsString) then begin IWEdit9.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit10.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Bkey10').AsString) then begin IWEdit10.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit11.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Bkey11').AsString) then begin IWEdit11.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit12.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Bkey12').AsString) then begin IWEdit12.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit13.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Bkey13').AsString) then begin IWEdit13.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit14.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Bkey14').AsString) then begin IWEdit14.Font.Color := clRed; i := i + 1; end; s := trim(IWEdit15.Text); if s <> '' then if UpCase(s[1]) = trim(UserSession.ADOQuerytemp.FieldByname('Bkey15').AsString) then begin IWEdit15.Font.Color := clRed; i := i + 1; end; self.WebApplication.ShowMessage('你得了 ' + inttostr(i) + ' 分。答案变为红色表示答对了。');//向用户报告得分信息

Page 253: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 253页/共 376页

end; procedure TIWFormcsyd.IWLink8Click(Sender: TObject);//点击管理员维护按钮后执行 begin IWRegionA.Visible := false;//隐藏题目显示 IWRegion2.Visible := true;//显示维护界面 end; procedure TIWFormcsyd.IWLink9Click(Sender: TObject);//点击返回按钮后执行 begin IWRegion2.Visible := false; //隐藏题目维护界面 IWRegionA.Visible := true; //显示出题界面 IWComboBox1Change(Sender); end; procedure TIWFormcsyd.IWRegion2Render(Sender: TObject);//当 IWRegion2显示时执行,取出要编辑的题目显示在维护界面的相应控件中。 var a: string; begin a := rightstr(trim(IWComboBox1.Text), 2); UserSession.ADOQuerytemp.Close; UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Jcsyd where uint =''' + a + '''');//查询该单元题目 UserSession.ADOQuerytemp.Open; if UserSession.ADOQuerytemp.RecordCount = 1 then //如果此单元有题目 begin //以下是将从数据库中取出的数据放入页面的相应编辑控件中,以便管理员修改 IWMemo1.Text := trim(UserSession.ADOQuerytemp.FieldByname('A1').AsString); IWMemo2.Text := trim(UserSession.ADOQuerytemp.FieldByname('A2').AsString); IWMemo3.Text := trim(UserSession.ADOQuerytemp.FieldByname('A3').AsString); IWMemo4.Text := trim(UserSession.ADOQuerytemp.FieldByname('A4').AsString); IWMemo5.Text := trim(UserSession.ADOQuerytemp.FieldByname('A5').AsString); IWMemo6.Text := trim(UserSession.ADOQuerytemp.FieldByname('A6').AsString); IWMemo7.Text := trim(UserSession.ADOQuerytemp.FieldByname('A7').AsString); IWMemo8.Text := trim(UserSession.ADOQuerytemp.FieldByname('A8').AsString); IWMemo9.Text := trim(UserSession.ADOQuerytemp.FieldByname('A9').AsString); IWMemo10.Text := trim(UserSession.ADOQuerytemp.FieldByname('B10').AsString); IWMemo11.Text := trim(UserSession.ADOQuerytemp.FieldByname('B11').AsString); IWMemo12.Text := trim(UserSession.ADOQuerytemp.FieldByname('B12').AsString); IWMemo13.Text := trim(UserSession.ADOQuerytemp.FieldByname('B13').AsString); IWMemo14.Text := trim(UserSession.ADOQuerytemp.FieldByname('B14').AsString); IWMemo15.Text := trim(UserSession.ADOQuerytemp.FieldByname('B15').AsString);

Page 254: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 254页/共 376页

IWEdit16.Text := trim(UserSession.ADOQuerytemp.FieldByname('Akey1').AsString); IWEdit17.Text := trim(UserSession.ADOQuerytemp.FieldByname('Akey2').AsString); IWEdit18.Text := trim(UserSession.ADOQuerytemp.FieldByname('Akey3').AsString); IWEdit19.Text := trim(UserSession.ADOQuerytemp.FieldByname('Akey4').AsString); IWEdit20.Text := trim(UserSession.ADOQuerytemp.FieldByname('Akey5').AsString); IWEdit21.Text := trim(UserSession.ADOQuerytemp.FieldByname('Akey6').AsString); IWEdit22.Text := trim(UserSession.ADOQuerytemp.FieldByname('Akey7').AsString); IWEdit23.Text := trim(UserSession.ADOQuerytemp.FieldByname('Akey8').AsString); IWEdit30.Text := trim(UserSession.ADOQuerytemp.FieldByname('Akey9').AsString); IWEdit24.Text := trim(UserSession.ADOQuerytemp.FieldByname('Bkey10').AsString); IWEdit25.Text := trim(UserSession.ADOQuerytemp.FieldByname('Bkey11').AsString); IWEdit26.Text := trim(UserSession.ADOQuerytemp.FieldByname('Bkey12').AsString); IWEdit27.Text := trim(UserSession.ADOQuerytemp.FieldByname('Bkey13').AsString); IWEdit28.Text := trim(UserSession.ADOQuerytemp.FieldByname('Bkey14').AsString); IWEdit29.Text := trim(UserSession.ADOQuerytemp.FieldByname('Bkey15').AsString); IWMemo16.Text := trim(UserSession.ADOQuerytemp.FieldByname('Ascript1').AsString); IWMemo17.Text := trim(UserSession.ADOQuerytemp.FieldByname('Ascript2').AsString); IWMemo18.Text := trim(UserSession.ADOQuerytemp.FieldByname('Ascript3').AsString); IWMemo19.Text := trim(UserSession.ADOQuerytemp.FieldByname('Ascript4').AsString); IWMemo20.Text := trim(UserSession.ADOQuerytemp.FieldByname('Ascript5').AsString); IWMemo21.Text := trim(UserSession.ADOQuerytemp.FieldByname('Ascript6').AsString); IWMemo22.Text := trim(UserSession.ADOQuerytemp.FieldByname('Ascript7').AsString); IWMemo23.Text := trim(UserSession.ADOQuerytemp.FieldByname('Ascript8').AsString); IWMemo27.Text := trim(UserSession.ADOQuerytemp.FieldByname('Ascript9').AsString); IWMemo26.Text := trim(UserSession.ADOQuerytemp.FieldByname('Bscript1').AsString); IWMemo24.Text := trim(UserSession.ADOQuerytemp.FieldByname('Bscript2').AsString); IWMemo25.Text := trim(UserSession.ADOQuerytemp.FieldByname('Bscript3').AsString); IWEdit31.Text := trim(UserSession.ADOQuerytemp.FieldByname('luyin').AsString); end; end; procedure TIWFormcsyd.IWLink7Click(Sender: TObject);//点击确认修改后执行 var a: string; begin a := rightstr(trim(IWComboBox1.Text), 2); UserSession.ADOQuerytemp.Close; UserSession.ADOQuerytemp.SQL.Clear; UserSession.ADOQuerytemp.SQL.Add('select * from Jcsyd where uint =''' + a + '''');//查询该单元题目 UserSession.ADOQuerytemp.Open; if UserSession.ADOQuerytemp.RecordCount = 1 then //如果此单元有题目

Page 255: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 255页/共 376页

begin //以下将修改好了的数据保存到数据库中 UserSession.ADOQuerytemp.Edit; UserSession.ADOQuerytemp.FieldByname('A1').AsString := trim(IWMemo1.Text); UserSession.ADOQuerytemp.FieldByname('A2').AsString := trim(IWMemo2.Text); UserSession.ADOQuerytemp.FieldByname('A3').AsString := trim(IWMemo3.Text); UserSession.ADOQuerytemp.FieldByname('A4').AsString := trim(IWMemo4.Text); UserSession.ADOQuerytemp.FieldByname('A5').AsString := trim(IWMemo5.Text); UserSession.ADOQuerytemp.FieldByname('A6').AsString := trim(IWMemo6.Text); UserSession.ADOQuerytemp.FieldByname('A7').AsString := trim(IWMemo7.Text); UserSession.ADOQuerytemp.FieldByname('A8').AsString := trim(IWMemo8.Text); UserSession.ADOQuerytemp.FieldByname('A9').AsString := trim(IWMemo9.Text); UserSession.ADOQuerytemp.FieldByname('B10').AsString := trim(IWMemo10.Text); UserSession.ADOQuerytemp.FieldByname('B11').AsString := trim(IWMemo11.Text); UserSession.ADOQuerytemp.FieldByname('B12').AsString := trim(IWMemo12.Text); UserSession.ADOQuerytemp.FieldByname('B13').AsString := trim(IWMemo13.Text); UserSession.ADOQuerytemp.FieldByname('B14').AsString := trim(IWMemo14.Text); UserSession.ADOQuerytemp.FieldByname('B15').AsString := trim(IWMemo15.Text); UserSession.ADOQuerytemp.FieldByname('Akey1').AsString := trim(IWEdit16.Text); UserSession.ADOQuerytemp.FieldByname('Akey2').AsString := trim(IWEdit17.Text); UserSession.ADOQuerytemp.FieldByname('Akey3').AsString := trim(IWEdit18.Text); UserSession.ADOQuerytemp.FieldByname('Akey4').AsString := trim(IWEdit19.Text); UserSession.ADOQuerytemp.FieldByname('Akey5').AsString := trim(IWEdit20.Text); UserSession.ADOQuerytemp.FieldByname('Akey6').AsString := trim(IWEdit21.Text); UserSession.ADOQuerytemp.FieldByname('Akey7').AsString := trim(IWEdit22.Text); UserSession.ADOQuerytemp.FieldByname('Akey8').AsString := trim(IWEdit23.Text); UserSession.ADOQuerytemp.FieldByname('Akey9').AsString := trim(IWEdit30.Text); UserSession.ADOQuerytemp.FieldByname('Bkey10').AsString := trim(IWEdit24.Text); UserSession.ADOQuerytemp.FieldByname('Bkey11').AsString := trim(IWEdit25.Text); UserSession.ADOQuerytemp.FieldByname('Bkey12').AsString := trim(IWEdit26.Text); UserSession.ADOQuerytemp.FieldByname('Bkey13').AsString := trim(IWEdit27.Text); UserSession.ADOQuerytemp.FieldByname('Bkey14').AsString := trim(IWEdit28.Text); UserSession.ADOQuerytemp.FieldByname('Bkey15').AsString := trim(IWEdit29.Text); UserSession.ADOQuerytemp.FieldByname('Ascript1').AsString := trim(IWMemo16.Text); UserSession.ADOQuerytemp.FieldByname('Ascript2').AsString := trim(IWMemo17.Text); UserSession.ADOQuerytemp.FieldByname('Ascript3').AsString := trim(IWMemo18.Text); UserSession.ADOQuerytemp.FieldByname('Ascript4').AsString := trim(IWMemo19.Text); UserSession.ADOQuerytemp.FieldByname('Ascript5').AsString := trim(IWMemo20.Text); UserSession.ADOQuerytemp.FieldByname('Ascript6').AsString := trim(IWMemo21.Text); UserSession.ADOQuerytemp.FieldByname('Ascript7').AsString := trim(IWMemo22.Text); UserSession.ADOQuerytemp.FieldByname('Ascript8').AsString := trim(IWMemo23.Text); UserSession.ADOQuerytemp.FieldByname('Ascript9').AsString := trim(IWMemo27.Text);

Page 256: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 256页/共 376页

UserSession.ADOQuerytemp.FieldByname('Bscript1').AsString := trim(IWMemo26.Text); UserSession.ADOQuerytemp.FieldByname('Bscript2').AsString := trim(IWMemo24.Text); UserSession.ADOQuerytemp.FieldByname('Bscript3').AsString := trim(IWMemo25.Text); UserSession.ADOQuerytemp.FieldByname('luyin').AsString := trim(IWEdit31.Text); UserSession.ADOQuerytemp.Post; self.WebApplication.ShowMessage('修改完毕!'); end; UserSession.ADOQuerytemp.Close; end; procedure TIWFormcsyd.IWLink10Click(Sender: TObject);//点击上传按钮后执行 begin //上传文件: if (IWFile1.filename = '') and (IWFile2.filename = '') and (IWFile3.filename = '') and (IWFile4.filename = '') and (IWFile5.filename = '') then begin self.WebApplication.ShowMessage('请至少选择一个上传文件!'); exit; end; try try if IWFile1.filename <> '' then begin IWFile1.SaveToFile(WebApplication.ApplicationPath + 'files\luyin\' + IWFile1.filename); end; except self.WebApplication.ShowMessage(IWFile1.filename + '上传失败,请重新上传!'); end; try if IWFile2.filename <> '' then begin IWFile2.SaveToFile(WebApplication.ApplicationPath + 'files\luyin\' + IWFile2.filename); end; except self.WebApplication.ShowMessage(IWFile2.filename + '上传失败,请重新上传!'); end; try

Page 257: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 257页/共 376页

if IWFile3.filename <> '' then begin IWFile3.SaveToFile(WebApplication.ApplicationPath + 'files\luyin\' + IWFile3.filename); end; except self.WebApplication.ShowMessage(IWFile3.filename + '上传失败,请重新上传!'); end; try if IWFile4.filename <> '' then begin IWFile4.SaveToFile(WebApplication.ApplicationPath + 'files\luyin\' + IWFile4.filename); end; except self.WebApplication.ShowMessage(IWFile4.filename + '上传失败,请重新上传!'); end; try if IWFile5.filename <> '' then begin IWFile5.SaveToFile(WebApplication.ApplicationPath + 'files\luyin\' + IWFile5.filename); end; except self.WebApplication.ShowMessage(IWFile5.filename + '上传失败,请重新上传!'); end; self.WebApplication.ShowMessage('上传完毕!'); except end; end;

4.2.10 unit UShenQingZhuCe(申请注册)导读 这个单元用来让用户申请一个卡号。此窗口的模板文件为 IWFormShenQingZhuCe.html,图

4-2-25是这个模板文件的视图。请大家用 dreamweaver打开查看即可。{%%}之间是窗口中的控件的name。IWRegion1控件中放置了我们的所需控件,这些控件的布局在我们在程序设计时就指定了。点击申请注册后程序直接打开该页面。

Page 258: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 258页/共 376页

图 4-2-25 IWFormShenQingZhuCe.html模板文件视图

图 4-2-26为实际运行时的显示界面:

图 4-2-26 IWFormShenQingZhuCe运行时界面

对应以上界面的窗口控件布局如图 4-2-27(各控件类型请打开源代码自己查看:将鼠标放在窗口

控件上即可显示):TIWRegion 内的控件运行时与设计时是一样的。在模板中只需要指定 TIWRegion控件出现的位置即可。

Page 259: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 259页/共 376页

图 4-2-27 IWFormShenQingZhuCe窗口控件布局

这个窗口用到了 TADOQuery等数据库控件,输入框也有一部份是直接连接数据库的,请看源代码

时注意查看各个控件的属性值。 当窗口生成时执行如下代码(显示版权信息,打开 ADOQuery2数据集,但没有记录,目的是当点

击申请注册按钮时可以直接向 ADOQuery2写入一条记录): procedure TIWFormShenQingZhuCe.IWAppFormCreate(Sender: TObject); begin BanQuan.Width := 750; //版权信息: BanQuan.HTMLText := '<div align="center"><font size="3">' + UserSession.showBanQuan +

'</font></div>'; ADOQuery2.Close; ADOQuery2.SQL.Clear; ADOQuery2.SQL.Add('select * from G01网站用户 where id=-1'); ADOQuery2.Open; end; 点击申请注册将执行如下代码(首选检查一下必填输入框是否有值,否则给出提示信息,再检查

数据库是否有相同卡号,如有提示申请者修改,符合条件后,将页面数据存入数据库中,给出申请成

功提示信息): procedure TIWFormShenQingZhuCe.IWLink1Click(Sender: TObject); begin if IWDBEdit1.Text = '' then //输入框的验证 begin self.WebApplication.ShowMessage('请填入姓名!'); Exit; end;

Page 260: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 260页/共 376页

if IWDBEdit2.Text = '' then //输入框的验证 begin self.WebApplication.ShowMessage('请填入卡号!'); Exit; end; if IWDBEdit3.Text = '' then //输入框的验证 begin self.WebApplication.ShowMessage('请填入密码!'); Exit; end; if IWDBEdit3.Text <> IWEdit1.Text then //输入框的验证 begin IWDBEdit3.Text := ''; IWEdit1.Text := ''; self.WebApplication.ShowMessage('两次密码不一样,请重新填入密码!'); Exit; end; //检查有无相同的卡号 ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G01 网 站 用 户 where 卡 号 =''' +

Trim(GY.Encrypt_text(Trim(IWDBEdit2.Text), UserSession.mm)) + ''''); ADOQuery1.Open; if ADOQuery1.RecordCount > 0 then begin self.WebApplication.ShowMessage('有相同的卡号,请重新输入别的卡号.'); IWDBEdit2.Text := ''; Exit; end; //开始向数据库提交数据: ADOQuery2.Edit; ADOQuery2.FieldByname('专业').Value := '英语'; ADOQuery2.FieldByname('可用时间').Value := '100'; ADOQuery2.FieldByname(' 卡 号 ').Value := GY.Encrypt_text(Trim(IWDBEdit2.Text),

UserSession.mm); ADOQuery2.FieldByname(' 密 码 ').Value := GY.Encrypt_text(Trim(IWDBEdit3.Text),

UserSession.mm); ADOQuery2.FieldByname('有效期').Value := '2004-1-1'; ADOQuery2.FieldByname('免费').Value := 0; ADOQuery2.FieldByname('是否审核').Value := 0; ADOQuery2.FieldByname('累积上网时间').Value := '0'; ADOQuery2.FieldByname('今日上网时间').Value:='0'; ADOQuery2.FieldByname('登录 IP').Value:='127.0.0.1';

Page 261: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 261页/共 376页

//非必填输入框给出默认值: if IWDBEdit4.Text = '' then ADOQuery2.FieldByname('年级').Value := '0000'; if IWDBEdit5.Text = '' then ADOQuery2.FieldByname('学号').Value := '0000'; if IWDBMemo1.Text = '' then ADOQuery2.FieldByname('备注').Value := '<无>'; ADOQuery2.Post; //申请成功后给出提示信息: self.WebApplication.ShowMessage('申请成功,请点击“返回首页”,输入卡号和密码登录。'); end; 点击返回首页时执行如下代码: procedure TIWFormShenQingZhuCe.IWLink2Click(Sender: TObject); begin UserSession.Move(TIWindex);//调用 UserSession内的一个函数,关闭当前活动窗口打开 Iwindex

窗口 end; 其余代码前面单元已有解释,此处不再详述。 4.2.11 unit UYongHuXinXiChaXun(用户信息查询,对应当前用户信息查询修改菜单)导读 这 个 单 元 用 来 让 用 户 登 录 后 修 改 自 己 的 相 关 信 息 。 此 窗 口 的 模 板 文 件 为

IWFormYongHuXinXiChaXun.html,图 4-2-28是这个模板文件的视图。请大家用 dreamweaver打开查看即可。{%%}之间是窗口中的控件的 name。IWRegion1控件中放置了我们的所需控件,这些控件的布局在我们设计时指定。点击当前用户信息查询修改菜单后判断是否已经登录,没有登录则提示要先

登录,登录后则将该用户相应信息查询出来显示在页面相应控件中。

图 4-2-28 IWFormYongHuXinXiChaXun.html模板文件视图

图 4-2-29为实际运行时的显示界面:

Page 262: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 262页/共 376页

图 4-2-29 IWFormYongHuXinXiChaXun运行时界面

对应以上界面的窗口控件布局如图 4-2-30(各控件类型请打开源代码自己查看:将鼠标放在窗口

控件上即可显示):TIWRegion 内的控件运行时与设计时是一样的。在模板中只需要指定 TIWRegion控件出现的位置即可。

Page 263: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 263页/共 376页

图 4-2-30 IWFormYongHuXinXiChaXun窗口控件布局

窗口生成时将执行如下代码: procedure TIWFormYongHuXinXiChaXun.IWAppFormCreate(Sender: TObject); begin //版权信息: BanQuan.Width := 750; BanQuan.HTMLText := '<div align="center"><font size="3">' + UserSession.showBanQuan +

'</font></div>'; //将当前用户的相应信息查询出来显示在页面的相应控件中 ADOQuery2.Close; ADOQuery2.SQL.Clear; ADOQuery2.SQL.Add('select * from G01网站用户 where 卡号=''' + UserSession.KaHao + ''''); ADOQuery2.Open;

IWLabel11.Caption := UserSession.XingMing + ' 信息如下:'; //显示用户姓名 IWDBEdit2.Text := GY.DeEncrypt_text(trim(ADOQuery2.FieldByName(' 卡 号 ').Value),

UserSession.mm); end; 点击确认修改后执行如下代码(先进行输入验证,再将修改好的信息存入数据库中,再更新当前

session的相关信息,最后给出修改成功的提示信息): procedure TIWFormYongHuXinXiChaXun.IWButton1Click(Sender: TObject); begin

Page 264: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 264页/共 376页

if IWDBEdit1.Text = '' then //输入框的验证 begin self.WebApplication.ShowMessage('请填入姓名!'); Exit; end; if IWDBEdit2.Text = '' then //输入框的验证 begin self.WebApplication.ShowMessage('请填入卡号!'); Exit; end; if IWDBEdit3.Text = '' then //输入框的验证 begin self.WebApplication.ShowMessage('请填入密码!'); Exit; end; if IWDBEdit3.Text <> IWEdit1.Text then //输入框的验证 begin IWDBEdit3.Text := ''; IWEdit1.Text := ''; self.WebApplication.ShowMessage('两次密码不一样,请重新填入密码!'); Exit; end; //更新数据库中的相应信息: ADOQuery2.edit; ADOQuery2.FieldByName(' 卡 号 ').Value := GY.Encrypt_text(trim(IWDBEdit2.Text),

UserSession.mm); ADOQuery2.FieldByName(' 密 码 ').Value := GY.Encrypt_text(trim(IWDBEdit3.Text),

UserSession.mm); ADOQuery2.Post; IWDBEdit2.Text := GY.DeEncrypt_text(trim(ADOQuery2.FieldByName(' 卡 号 ').Value),

UserSession.mm); //以下更新登录 session的信息: UserSession.XingMing := ADOQuery2.FieldByName('姓名').Value; UserSession.KaHao := ADOQuery2.FieldByName('卡号').Value; UserSession.MiMa := ADOQuery2.FieldByName('密码').Value; self.WebApplication.ShowMessage('信息修改成功。'); end; 其余代码前面单元已有解释,此处不再详述。 4.2.12 unit UYongHuGuanLi(用户管理)导读 这个单元实现让管理员对用户进行管理。此窗口的模板文件为 IWFormYongHuGuanLi.html,图

4-2-31是这个模板文件的视图。请大家用 dreamweaver打开查看即可。{%%}之间是窗口中的控件的

Page 265: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 265页/共 376页

name。YongHuGuanLi 控件中放置了我们的所需控件,这些控件的布局在我们程序设计时就指定了。点击当用户管理菜单后出现一个登录界面,输入管理员卡号和密码后,点击管理员登录,如果正常登

录,则将 YongHuGuanLi控件的 visible属性改为 true,这样页面中就出现了我们的用户管理界面。

图 4-2-31 IWFormYongHuGuanLi.html模板文件视图

图 4-2-32为实际运行时的显示界面:

Page 266: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 266页/共 376页

图 4-2-32 IWFormYongHuGuanLi运行时界面

对应以上界面的窗口控件布局如图 4-2-33(各控件类型请打开源代码自己查看:将鼠标放在窗口

控件上即可显示):TIWRegion 内的控件运行时与设计时是一样的。在模板中只需要指定 TIWRegion控件出现的位置即可。

Page 267: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 267页/共 376页

图 4-2-33 IWFormYongHuGuanLi窗口控件布局

这里主要用到了一个 TIWDBAdvWebGrid控件,这个与数据库直接相连的表格控件功能非常强大,

它的属性请详细查看,与 delphi中的数据库表格控件有相似的功能。这个控件的使用我们将单独介绍。在这里它与 ADOQuery1相关联。也就是说它将显示 ADOQuery1的数据。对 ADOQuery1的查询修改会在 TIWDBAdvWebGrid控件反映出来。 点击管理员登录后执行的代码如下(根据 IWButton7.Caption值执行不同的操作。一个是修改卡

号和密码,一个是输入管理员卡号和密码后来登录。登录后就把 IWButton7.Caption改为修改卡号和密码):

procedure TIWFormYongHuGuanLi.IWButton7Click(Sender: TObject); begin if IWButton7.Caption = '修改卡号和密码' then//修改卡号和密码 begin if IWEdit1.Text = '' then //输入框的验证 begin self.WebApplication.ShowMessage('请填入卡号!'); Exit; end;

Page 268: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 268页/共 376页

if IWEdit2.Text = '' then //输入框的验证 begin self.WebApplication.ShowMessage('请填入密码!'); Exit; end; UserSession.ADOQuerylogin.Close; UserSession.ADOQuerylogin.SQL.Clear; UserSession.ADOQuerylogin.SQL.Add('select * from G00网站管理员 where 用户管理员=''' +

guliyuanquanxian1 + ''''); UserSession.ADOQuerylogin.Open; UserSession.ADOQuerylogin.Edit; UserSession.ADOQuerylogin.FieldByname('卡号').Value := GY.Encrypt_text(Trim(IWEdit1.Text),

UserSession.mm); UserSession.ADOQuerylogin.FieldByname('密码').Value := GY.Encrypt_text(Trim(IWEdit2.Text),

UserSession.mm); UserSession.ADOQuerylogin.Post; IWEdit1.Text := ''; IWEdit2.Text := ''; self.WebApplication.ShowMessage('卡号和密码修改成功!'); end; //if是修改卡和密码 if IWButton7.Caption = '管理员登录' then//管理员输入卡号和密码后来登录 begin if IWEdit1.Text = '' then //输入框的验证 begin self.WebApplication.ShowMessage('请填入卡号!'); Exit; end; if IWEdit2.Text = '' then //输入框的验证 begin self.WebApplication.ShowMessage('请填入密码!'); Exit; end; UserSession.ADOQuerylogin.Close; UserSession.ADOQuerylogin.SQL.Clear; UserSession.ADOQuerylogin.SQL.Add('select * from G00 网站管理员 where 卡号=:username

and 密码=:password'); UserSession.ADOQuerylogin.Parameters.ParamByName('username').Value :=

GY.Encrypt_text(Trim(IWEdit1.Text), UserSession.mm); UserSession.ADOQuerylogin.Parameters.ParamByName('password').Value :=

GY.Encrypt_text(Trim(IWEdit2.Text), UserSession.mm); UserSession.ADOQuerylogin.Open; if UserSession.ADOQuerylogin.RecordCount = 1 then //从数据库取出登录信息存入 UserSession

Page 269: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 269页/共 376页

begin guliyuanquanxian1 := Trim(UserSession.ADOQuerylogin.FieldByname('用户管理员').Value); guliyuanquanxian2 := GY.DeEncrypt_text(Trim(guliyuanquanxian1), UserSession.mm); IWRegion3.Visible := true; IWButton7.Caption := '修改卡号和密码'; IWEdit1.Text := ''; IWEdit2.Text := ''; IWEdit2.PasswordPrompt := False; end else begin self.WebApplication.ShowMessage('卡号或密码错误,请重新输入!'); end; end; //if 是管理员 end; 点击查找按钮后执行如下代码(利用输入的查询条件对用户列表进行过滤,模糊查询模式): procedure TIWFormYongHuGuanLi.IWButton1Click(Sender: TObject); begin ADOQuery1.Close; ADOQuery1.SQL.Clear;//以下组装一句 SQL查询语句: ADOQuery1.SQL.Add('select * from G01网站用户 where 姓名 like :xm and 卡号 like :kh '); ADOQuery1.SQL.Add('and 年级 like :lj and 学号 like :xh '); ADOQuery1.SQL.Add('and 备注 like :bz '); if IWCheckBox2.Checked then//是否只显示要审核的用户 begin ADOQuery1.SQL.Add('and 是否审核=:sh '); ADOQuery1.Parameters.ParamByName('sh').Value := False; end; //以下给各查询参数赋值: ADOQuery1.Parameters.ParamByName('xm').Value := Trim(IWEdit3.Text) + '%'; if Trim(IWEdit4.Text) = '' then

ADOQuery1.Parameters.ParamByName('kh').Value := '%' else ADOQuery1.Parameters.ParamByName('kh').Value := GY.Encrypt_text(Trim(IWEdit4.Text),

UserSession.mm) + '%'; ADOQuery1.Parameters.ParamByName('lj').Value := Trim(IWComboBox1.Text) + '%'; ADOQuery1.Parameters.ParamByName('xh').Value := Trim(IWEdit6.Text) + '%'; ADOQuery1.Parameters.ParamByName('bz').Value := '%' + Trim(IWEdit8.Text); ADOQuery1.Open; end;

Page 270: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 270页/共 376页

点击设置版权信息时执行如下代码(更新数据库中的相应字段的信息): procedure TIWFormYongHuGuanLi.IWLink1Click(Sender: TObject); begin if IWEdit10.Text = '' then //输入框的验证 begin self.WebApplication.ShowMessage('请填入您自己的版权信息!'); Exit; end; UserSession.ADOQuerylogin.Close; UserSession.ADOQuerylogin.SQL.Clear; UserSession.ADOQuerylogin.SQL.Add('select * from G00网站管理员'); UserSession.ADOQuerylogin.Open; UserSession.ADOQuerylogin.Edit; UserSession.ADOQuerylogin.FieldByname('版权信息').Value := Trim(IWEdit10.Text); UserSession.ADOQuerylogin.Post; UserSession.ADOQuerylogin.Next; UserSession.ADOQuerylogin.Edit; UserSession.ADOQuerylogin.FieldByname('版权信息').Value := Trim(IWEdit10.Text); UserSession.ADOQuerylogin.Post; self.WebApplication.ShowMessage('版权信息设置成功!'); end; 其余代码前面单元已有解释或一看就明白,此处不再详述。

4.2.13 unit UxiazaiYuYin(下载语音,对应音像剪接菜单)导读 这个单元最复杂,除了没有用户和权限设置的操作外基本上是一个功能独立的模块。此窗口的模

板文件为 IWFormxiazaiyuyin.html,图 4-2-34是这个模板文件的视图。请大家用 dreamweaver打开查看即可。{%%}之间是窗口中的控件的 name。IWRegion1,IWRegion2,IWRegion3,IWRegion4,IWRegion5 控件中放置了我们的所需控件,这些控件的布局在我们设计时指定。通过改变前四个的visible属性,就可以进入不同的功能模块。

图 4-2-34 IWFormxiazaiyuyin.html模板文件视图

Page 271: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 271页/共 376页

图 4-2-35为 IWFormxiazaiyuyin运行时界面一:主要用来向用户展示所有的音像剪接文件。左

边是一个目录树,显示了音像剪接文件的目录分类,右边是一个分页显示的表格,单击每一行可以在

网页中间部分显示相应的信息,如果文件存在则会显示一个播放链接,点击它会跳出一个 RM播放器来播放指定的音像剪接文件。右边的表格以上部分是用来对音像剪接文件进行过滤查找定位的。点击

搜索按钮可以在指定的分类中按指定的搜索关键词来查找。点击向上和向下所在的蓝色部分可以让显

示框中的文字以其下方指定的翻页速度向上或向下自动滚动。点击上传音像剪接将显示如图 4-2-37所示界面。点击我要发表评论按钮将显示如图 4-2-39所示界面。在这一页中,IWRegion1,IWRegion3,IWRegion4是不可见的。主要展示 IWRegion2内的控件内容。

图 4-2-35 IWFormxiazaiyuyin运行时界面一

图 4-2-36为 IWFormxiazaiyuyin运行时界面一对应的窗口控件布局,主要是 IWRegion2内的内

容。比上图好像多了两个控件,IWMemo2和 IWDBImage1,其实不是,每显示一条记录时程序会查找是否有相应的评论和图片,以上两个控件就是用来显示所有评论和相应图片的。如果没有则它们俩

的 visible属性为 false。 这一页中的代码稍多,但没有很高的难度,都是一些对数据库或相关控件的一般操作。

Page 272: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 272页/共 376页

图 4-2-36 IWFormxiazaiyuyin运行时界面一对应的窗口控件布局

图 4-2-37 IWFormxiazaiyuyin运行时界面二

Page 273: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 273页/共 376页

图 4-2-38 IWFormxiazaiyuyin运行时界面二对应的窗口控件布局

Page 274: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 274页/共 376页

图 4-2-39 IWFormxiazaiyuyin运行时界面三

图 4-2-40 IWFormxiazaiyuyin运行时界面三对应的窗口控件布局

Page 275: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 275页/共 376页

图 4-2-41 IWFormxiazaiyuyin运行时界面四

Page 276: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 276页/共 376页

图 4-2-42 IWFormxiazaiyuyin运行时界面四对应的窗口控件布局

窗口生成时执行如下代码: procedure TIWFormxiazaiYuYin.IWAppFormCreate(Sender: TObject); var I: Integer; str1: string; Temp, item1: TIWTreeViewItem; begin ok := true; BanQuan.Width := 750; //版权信息 BanQuan.HTMLText := '<div align="center"><font size="3">' + UserSession.showBanQuan + '</font></div>'; //检查是否有别人用你的卡 UserSession.ADOQuerylogin.Close; UserSession.ADOQuerylogin.SQL.Clear; UserSession.ADOQuerylogin.SQL.Add('select * from G01网站用户 where 卡号=:username and 密码=:password'); UserSession.ADOQuerylogin.Parameters.ParamByName('username').Value := UserSession.KaHao; UserSession.ADOQuerylogin.Parameters.ParamByName('password').Value := UserSession.mima; UserSession.ADOQuerylogin.Open; if UserSession.ADOQuerylogin.RecordCount = 1 then begin if (Trim(UserSession.ADOQuerylogin.FieldByname('登录 IP').Value) <> WebApplication.ip) then begin

Page 277: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 277页/共 376页

self.WebApplication.Terminate('你的卡可能正在被别人使用,请重新登录,并立即更改密码!'); end; end; UserSession.ADOQuerylogin.Close; IWRegion1.BorderOptions.NumericWidth := 0; IWRegion2.BorderOptions.NumericWidth := 0; //IWRegion3.BorderOptions.NumericWidth := 0; //IWRegion4.BorderOptions.NumericWidth := 0; //+++++++++++++++++++++++++++++++++++++++++++++++ 对目录树进行操作: ADOQuery4.Close; //只用打开一次就能全部搞定的方法: ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('select * from G061语音分类 order by 分类 1,分类 2,id'); ADOQuery4.Open; IWTreeView1.Items.Add; IWTreeView1.Items[0].Caption := '所有分类:'; if ADOQuery4.RecordCount > 0 then begin ADOQuery4.First; str1 := ''; for I := 1 to ADOQuery4.RecordCount do begin if Trim(ADOQuery4.FieldByname('分类 1').Value) <> str1 then begin // 如果是新的开始,则加入两级目录 Temp := IWTreeView1.Items.Add; Temp.Caption := Trim(ADOQuery4.FieldByname('分类 1').Value); Temp.hint := Temp.Caption; Temp.Expanded := true; Temp.ParentItem := IWTreeView1.Items[0]; item1 := Temp; Temp.OnClick := TreeItemClick1; Temp := IWTreeView1.Items.Add; Temp.Caption := Trim(ADOQuery4.FieldByname('分类 2').Value); Temp.hint := Temp.Caption; Temp.ParentItem := item1; Temp.OnClick := TreeItemClick2; end; if (Trim(ADOQuery4.FieldByname('分类 1').Value) = str1) then begin //加入二级目录 Temp := IWTreeView1.Items.Add; Temp.Caption := Trim(ADOQuery4.FieldByname('分类 2').Value); Temp.hint := Temp.Caption;

Page 278: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 278页/共 376页

Temp.ParentItem := item1; Temp.OnClick := TreeItemClick2; end; str1 := Trim(ADOQuery4.FieldByname('分类 1').Value); ADOQuery4.Next; end; end; ADOQuery4.Close; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ADOQuery4.Close; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('select distinct 分类 1 from G061语音分类'); ADOQuery4.Open; ADOQuery4.First; IWComboBox1.Clear; IWComboBox2.Clear; IWComboBox6.Clear; IWComboBox1.Items.Add('所有分类'); IWComboBox2.Items.Add('所有分类'); IWComboBox6.Items.Add(''); for I := 1 to ADOQuery4.RecordCount do begin IWComboBox1.Items.Add(Trim(ADOQuery4.FieldByname('分类 1').Value));//给三个下拉框赋值 IWComboBox2.Items.Add(Trim(ADOQuery4.FieldByname('分类 1').Value)); IWComboBox6.Items.Add(Trim(ADOQuery4.FieldByname('分类 1').Value)); ADOQuery4.Next; end; ADOQuery4.Close; IWComboBox1.ItemIndex := 0; IWComboBox2.ItemIndex := 0; if UserSession.GuanLi_YuYin then//如果是管理员则显示相应控件 begin IWButton7.Visible := true; IWButton8.Visible := true; IWButton9.Visible := true; IWButton14.Visible := true; IWButton19.Visible := true; IWDBCheckBox2.Visible := true; IWLabel22.Visible := true; end;

Page 279: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 279页/共 376页

IWComboBox5Change(Sender); //查询相关的下载 end; procedure TIWFormxiazaiYuYin.TreeItemClick1(Sender: TObject);//目录树上点击一级目录时调用的函数 var fenlei1: string; begin fenlei1 := (Sender as TIWTreeViewItem).Caption; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where (分类 1=:x) order by 加入时间 desc'); ADOQuery1.Parameters.ParamByName('x').Value := Trim(fenlei1); ADOQuery1.Open; end; procedure TIWFormxiazaiYuYin.TreeItemClick2(Sender: TObject); //目录树上点击二级目录时调用的函数 var fenlei1, fenlei2: string; begin fenlei1 := (Sender as TIWTreeViewItem).ParentItem.Caption; fenlei2 := (Sender as TIWTreeViewItem).Caption; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where (分类 1=:x) and (分类 2=:y) order by 加入时间 desc'); ADOQuery1.Parameters.ParamByName('x').Value := Trim(fenlei1); ADOQuery1.Parameters.ParamByName('y').Value := Trim(fenlei2); ADOQuery1.Open; end; //语音有两级分类,当分类 1 改变时,搜索出相应的分类 2 并将其填入 IWComboBox5 中,之后执行ADOQuery1的相应查询。 procedure TIWFormxiazaiYuYin.IWComboBox1Change(Sender: TObject); var I: Integer; begin ADOQuery4.Close; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('select distinct 分类 2 from G061语音分类 where 分类 1=:x'); ADOQuery4.Parameters.ParamByName('x').Value := Trim(IWComboBox1.Text); ADOQuery4.Open; ADOQuery4.First; IWComboBox5.Clear; IWComboBox5.Items.Add('所有分类');

Page 280: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 280页/共 376页

for I := 1 to ADOQuery4.RecordCount do begin IWComboBox5.Items.Add(Trim(ADOQuery4.FieldByname('分类 2').Value)); ADOQuery4.Next; end; ADOQuery4.Close; IWComboBox5.ItemIndex := 0; if not IWCheckBox2.Checked then//如果没有选择推荐复选框 begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 and 审核人卡号<>:y order by 加入时间 desc'); if Trim(IWComboBox1.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%' else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox1.Text) + '%'; ADOQuery1.Parameters.ParamByName('y').Value := ' '; if Trim(IWComboBox5.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox5.Text) + '%'; ADOQuery1.Open; end else//如果选择了推荐复选框 begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 and 推荐=1 and 审核人卡号<>:y order by 加入时间 desc'); if Trim(IWComboBox1.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%' else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox1.Text) + '%'; if Trim(IWComboBox5.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox5.Text) + '%'; ADOQuery1.Parameters.ParamByName('y').Value := ' '; ADOQuery1.Open; end; if ADOQuery1.RecordCount > 0 then//如果查询出来记录数大于 0

Page 281: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 281页/共 376页

begin IWLink1.hint := '给' + Trim(ADOQuery1.FieldByname('加入者姓名').Value) + '发信息。'; TIWScrollPanel1.Text.Text := Trim(ADOQuery1.FieldByname('内容').Value); end else//如果查询出来记录数=0 IWLink1.hint := ''; if ADOQuery1.RecordCount = 0 then Exit; IWMemo2.Text := '';//以下查找出该记录对应的语音评论 ADOQuery4.Close; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('select * from G063语音评论 where 下载 ID=:x order by 评论时间 desc'); ADOQuery4.Parameters.ParamByName('x').Value := ADOQuery1.FieldByname('id').Value; ADOQuery4.Open; ADOQuery4.First; if ADOQuery4.RecordCount > 0 then begin IWMemo2.Visible := true; IWDBImage1.Top := 565; IWRegion2.Height := 578; for I := 1 to ADOQuery4.RecordCount do//将所有的评论进行组装如下 begin IWMemo2.Text := IWMemo2.Text + ' ' + ADOQuery4.FieldByname('评论人姓名').Value + '于' + DateTimeToStr(ADOQuery4.FieldByname('评论时 间 ').Value) + '发表如下评论 :' + #13 + ADOQuery4.FieldByname('评论内容').Value + #13 + #13; ADOQuery4.Next; end; end else begin IWMemo2.Visible := False; IWDBImage1.Top := 432; IWRegion2.Height := 578 - 129; end; ADOQuery4.Close; end; //以下点击搜索按钮后执行,可以键入多个词语,中间用空格分开即可 procedure TIWFormxiazaiYuYin.IWButton10Click(Sender: TObject); var I: Integer; d, e, SQL: string; y: Integer; begin if IWEdit3.Text = '' then

Page 282: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 282页/共 376页

begin self.WebApplication.ShowMessage('请填入查找搜索词。'); IWEdit3.SetFocus; Exit; end; ADOQuery1.Cancel; d := Trim(IWEdit3.Text); d := UserSession.ReplaceStrs(d, ' ', ' '); //将中文空格换成对应的英文空格 SQL := ''; y := Pos(' ', d); if (Pos(' ', d) = 0) then SQL := ' and (标题 like ' + '''%' + d + '%''' + ' or 内容 like ' + '''%' + d + '%'')' else begin while y <> 0 do begin e := leftbstr(d, y - 1); Delete(d, 1, y); d := Trim(d); y := Pos(' ', d); SQL := SQL + ' and (标题 like ' + '''%' + e + '%''' + 'or 内容 like ' + '''%' + e + '%'')'; end; SQL := SQL + ' and (标题 like ' + '''%' + d + '%''' + ' or 内容 like ' + '''%' + d + '%'')'; end; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where (审核人卡号<>:y) '); ADOQuery1.SQL.Add(SQL + ' order by 加入时间 desc'); ADOQuery1.Parameters.ParamByName('y').Value := ' '; ADOQuery1.Open; if ADOQuery1.RecordCount > 0 then IWLink1.hint := '给' + Trim(ADOQuery1.FieldByname('加入者姓名').Value) + '发信息。' else IWLink1.hint := ''; if ADOQuery1.RecordCount = 0 then Exit; IWMemo2.Text := ''; ADOQuery4.Close;

Page 283: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 283页/共 376页

ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('select * from G063语音评论 where 下载 ID=:x order by 评论时间 desc'); ADOQuery4.Parameters.ParamByName('x').Value := ADOQuery1.FieldByname('id').Value; ADOQuery4.Open; ADOQuery4.First; if ADOQuery4.RecordCount > 0 then begin IWMemo2.Visible := true; IWDBImage1.Top := 565; IWRegion2.Height := 578; for I := 1 to ADOQuery4.RecordCount do begin IWMemo2.Text := IWMemo2.Text + ' ' + ADOQuery4.FieldByname('评论人姓名').Value + '于' + DateTimeToStr(ADOQuery4.FieldByname('评论时 间 ').Value) + '发表如下评论 :' + #13 + ADOQuery4.FieldByname('评论内容').Value + #13 + #13; ADOQuery4.Next; end; end else begin IWMemo2.Visible := False; IWDBImage1.Top := 432; IWRegion2.Height := 578 - 129; end; ADOQuery4.Close; end; //以下点击上传音像剪接按钮后执行 procedure TIWFormxiazaiYuYin.IWButton5Click(Sender: TObject); var I: Integer; begin IWRegion2.Visible := true; IWRegion1.Visible := False; IWButton7.Caption := '我要修改'; IWDBEdit1.Editable := False; IWDBMemo2.Editable := False; IWDBCheckBox1.Editable := False; IWComboBox6.Editable := False; IWComboBox7.Editable := False; IWComboBox5Change(Sender); if ADOQuery1.RecordCount = 0 then Exit;

Page 284: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 284页/共 376页

IWMemo2.Text := ''; try ADOQuery1.Locate('id', Trim(DangQiangid), []); except end; ADOQuery4.Close; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('select * from G063语音评论 where 下载 ID=:x order by 评论时间 desc'); ADOQuery4.Parameters.ParamByName('x').Value := ADOQuery1.FieldByname('id').Value; ADOQuery4.Open; ADOQuery4.First; if ADOQuery4.RecordCount > 0 then begin IWMemo2.Visible := true; IWDBImage1.Top := 565; IWRegion2.Height := 578; for I := 1 to ADOQuery4.RecordCount do begin IWMemo2.Text := IWMemo2.Text + ' ' + ADOQuery4.FieldByname('评论人姓名').Value + '于' + DateTimeToStr(ADOQuery4.FieldByname('评论时 间 ').Value) + '发表如下评论 :' + #13 + ADOQuery4.FieldByname('评论内容').Value + #13 + #13; ADOQuery4.Next; end; end else begin IWMemo2.Visible := False; IWDBImage1.Top := 432; IWRegion2.Height := 578 - 129; end; ADOQuery4.Close; ok := true; end; //以下点击发布此音像剪接按钮后执行 procedure TIWFormxiazaiYuYin.IWButton1Click(Sender: TObject); var year1, month1, day1, hour1, min1, sec1, msec1: word; filename: string; BStream: TMemoryStream; begin if IWComboBox6.Text = '' then begin

Page 285: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 285页/共 376页

self.WebApplication.ShowMessage('请选择大类。'); IWComboBox6.SetFocus; Exit; end; if IWComboBox7.Text = '' then begin self.WebApplication.ShowMessage('请选择小类。'); IWComboBox7.SetFocus; Exit; end; if IWDBEdit1.Text = '' then begin self.WebApplication.ShowMessage('请填写标题。'); IWDBEdit1.SetFocus; Exit; end; if IWDBMemo2.Text = '' then begin self.WebApplication.ShowMessage('请填写内容。'); IWDBMemo2.SetFocus; Exit; end; if IWDBFile1.filename <> '' then begin if (ExtractFileExt(IWDBFile1.filename) <> '.jpg') and (ExtractFileExt(IWDBFile1.filename) <> '.JPG') and (ExtractFileExt(IWDBFile1.filename) <> '.JPEG') and (ExtractFileExt(IWDBFile1.filename) <> '.jpeg') and (ExtractFileExt(IWDBFile1.filename) <> '.bmp') and (ExtractFileExt(IWDBFile1.filename) <> '.BMP') then begin self.WebApplication.ShowMessage('图片只能是.jpg .jpeg .bmp格式!请重新选择!'); Exit; end; //上传图片 try BStream := TMemoryStream.Create; IWDBFile1.SaveToStream(BStream); Tblobfield(ADOQuery1.FieldByname('图片')).LoadFromStream(BStream); finally BStream.Free; end;

Page 286: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 286页/共 376页

end; if IWFile1.filename = '' then begin //self.WebApplication.ShowMessage('注意,您没有选择音像剪接文件。'); end; //上传文件: if IWFile1.filename <> '' then begin SysUtils.DecodeDate(Now, year1, month1, day1); SysUtils.DecodeTime(Now, hour1, min1, sec1, msec1); filename := floattostr(year1) + floattostr(month1) + floattostr(day1) + floattostr(hour1) + floattostr(min1) + floattostr(sec1) + floattostr(msec1) + SysUtils.ExtractFileExt(IWFile1.filename); IWFile1.SaveToFile(WebApplication.ApplicationPath + 'files\YuYinTianDi\' + filename); end; //以下更新数据库数据 ADOQuery1.FieldByname('点击次数').Value := 0; ADOQuery1.FieldByname('点击次数').Value := 0; ADOQuery1.FieldByname('加入时间').Value := Now; ADOQuery1.FieldByname('分类 1').Value := Trim(IWComboBox6.Text); ADOQuery1.FieldByname('分类 2').Value := Trim(IWComboBox7.Text); if (UserSession.GuanLi_YuYin) then ADOQuery1.FieldByname('审核人卡号').Value := UserSession.KaHao else ADOQuery1.FieldByname('审核人卡号').Value := ' '; ADOQuery1.FieldByname('加入者姓名').Value := UserSession.XingMing; ADOQuery1.FieldByname('加入者卡号').Value := UserSession.KaHao; if IWFile1.filename <> '' then ADOQuery1.FieldByname('下载地址').Value := filename else ADOQuery1.FieldByname('下载地址').Value := Trim(IWEdit2.Text); ADOQuery1.Post; IWComboBox7.Editable := False; IWButton1.Enabled := False; IWButton11.Enabled := true; IWButton12.Enabled := False; TIWDBAdvWebGrid2.Visible := true; IWDBImage2.Visible := true; IWDBEdit1.Editable := False;

Page 287: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 287页/共 376页

IWDBMemo2.Editable := False; IWDBFile1.Visible := False; IWFile1.Visible := False; IWDBCheckBox1.Editable := False; if IWDBCheckBox2.Visible = true then IWDBCheckBox2.Editable := False; IWButton7.Enabled := true; IWButton8.Enabled := true; IWComboBox4Change(Sender); if (not UserSession.GuanLi_YuYin) then//如果不是管理员 self.WebApplication.ShowMessage('谢谢您的投稿,请等待管理员审核您的资料后别人才能浏览。'); end; //点击我要修改或确认修改按钮时执行,目的是修改当前记录 procedure TIWFormxiazaiYuYin.IWButton7Click(Sender: TObject); var year1, month1, day1, hour1, min1, sec1, msec1: word; filename: string; BStream: TMemoryStream; begin if (ADOQuery1.RecordCount = 0) then//如果记录为 0则退出 begin IWButton12Click(Sender); self.WebApplication.ShowMessage('当前没有选定记录。'); Exit; end; //如果该记录不是当前登录者发布的就不能修改 if (ADOQuery1.FieldByname(' 加 入 者 卡 号 ').Value <> UserSession.KaHao) and (not UserSession.GuanLi_YuYin) then begin self.WebApplication.ShowMessage('这不是你发的,你无权修改。'); Exit; end; //根据 IWButton7.Caption的值进行不同操作,如果是我要修改则进入修改状态 if IWButton7.Caption = '我要修改' then begin IWDBEdit1.Editable := true; IWDBMemo2.Editable := true; IWDBCheckBox1.Editable := true; IWDBFile1.Visible := true; IWFile1.Visible := true; if IWDBCheckBox2.Visible = true then IWDBCheckBox2.Editable := true; IWButton12.Enabled := true; IWButton11.Enabled := False;

Page 288: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 288页/共 376页

IWButton8.Enabled := False; TIWDBAdvWebGrid2.Visible := False; IWDBImage2.Visible := False; ADOQuery1.Edit; IWButton7.Caption := '确认修改';//改变为确认修改,表示已经进入修改状态 end else//根据 IWButton7.Caption的值进行不同操作,如果不是我要修改则保存修改后的内容 begin if IWComboBox6.Text = '' then//检查输入不否合法 begin self.WebApplication.ShowMessage('请选择大类。'); IWComboBox6.SetFocus; Exit; end; if IWComboBox7.Text = '' then//检查输入不否合法 begin self.WebApplication.ShowMessage('请选择小类。'); IWComboBox7.SetFocus; Exit; end; if IWDBEdit1.Text = '' then//检查输入不否合法 begin self.WebApplication.ShowMessage('请填写标题。'); IWDBEdit1.SetFocus; Exit; end; if IWDBMemo2.Text = '' then//检查输入不否合法 begin self.WebApplication.ShowMessage('请填写内容。'); IWDBMemo2.SetFocus; Exit; end; if IWDBFile1.filename <> '' then//判断图片的格式 begin if (ExtractFileExt(IWDBFile1.filename) <> '.jpg') and (ExtractFileExt(IWDBFile1.filename) <> '.JPG') and (ExtractFileExt(IWDBFile1.filename) <> '.JPEG') and (ExtractFileExt(IWDBFile1.filename) <> '.jpeg') and (ExtractFileExt(IWDBFile1.filename) <> '.bmp') and (ExtractFileExt(IWDBFile1.filename) <> '.BMP') then begin self.WebApplication.ShowMessage('图片只能是.jpg .jpeg .bmp格式!请重新选择!');

Page 289: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 289页/共 376页

Exit; end; //上传图片 try BStream := TMemoryStream.Create;//创建内存流 IWDBFile1.SaveToStream(BStream);//将图片保存到内存流 Tblobfield(ADOQuery1.FieldByname('图片')).LoadFromStream(BStream);//将图片从内存流中保存到数据库的图片字段中 finally BStream.Free;//释放内存流 end; end; if IWFile1.filename <> '' then begin //上传文件: if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\YuYinTianDi\' + Trim(ADOQuery1.FieldByname('下载地址').Value)) then//如果文件存在 SysUtils.DeleteFile(WebApplication.ApplicationPath + 'files\YuYinTianDi\' + Trim(ADOQuery1.FieldByname('下载地址').Value));//删除老文件 SysUtils.DecodeDate(Now, year1, month1, day1); SysUtils.DecodeTime(Now, hour1, min1, sec1, msec1); filename := floattostr(year1) + floattostr(month1) + floattostr(day1) + floattostr(hour1) + floattostr(min1) + floattostr(sec1) + floattostr(msec1) + ExtractFileExt(IWFile1.filename);//用当前时间组装出新文件的名称 IWFile1.SaveToFile(WebApplication.ApplicationPath + 'files\YuYinTianDi\' + filename);//将客户端的文件上传到服务器的相应目录下:WebApplication.ApplicationPath + 'files\YuYinTianDi\' + filename ADOQuery1.FieldByname('下载地址').Value := filename;//将新的文件名存入到数据库 end; if (IWFile1.filename = '') and (Trim(IWEdit2.Text) <> '') then ADOQuery1.FieldByname('下载地址').Value := Trim(IWEdit2.Text); ADOQuery1.FieldByname('分类 1').Value := Trim(IWComboBox6.Text); ADOQuery1.FieldByname('分类 2').Value := Trim(IWComboBox7.Text); ADOQuery1.Post; IWButton7.Caption := '我要修改';//改回为我要修改 TIWDBAdvWebGrid2.Visible := true; IWDBImage2.Visible := true; IWDBEdit1.Editable := False; IWDBMemo2.Editable := False; IWComboBox6.Editable := False; IWComboBox7.Editable := False;

Page 290: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 290页/共 376页

IWDBFile1.Visible := False; IWFile1.Visible := False; IWDBCheckBox1.Editable := False; IWButton12.Enabled := False; IWButton11.Enabled := true; IWButton8.Enabled := true; if IWDBCheckBox2.Visible = true then IWDBCheckBox2.Editable := False; end; end; procedure TIWFormxiazaiYuYin.IWButton11Click(Sender: TObject); begin IWButton12.Enabled := true; IWButton11.Enabled := False; IWButton7.Enabled := False; IWComboBox7.Editable := False; IWButton8.Enabled := False; IWComboBox6.Editable := true; IWComboBox6.ItemIndex := -1; TIWDBAdvWebGrid2.Visible := False; IWDBImage2.Visible := False; IWEdit2.Text := ''; end; //点击确认删除按钮时执行 procedure TIWFormxiazaiYuYin.IWButton8Click(Sender: TObject); begin if (IWButton11.Enabled = False) or (ADOQuery1.RecordCount = 0) then//无记录可以删除 begin IWButton12Click(Sender); self.WebApplication.ShowMessage('当前没有选定记录。'); Exit; end; if (ADOQuery1.FieldByname(' 加 入 者 卡 号 ').Value <> UserSession.KaHao) and (not UserSession.GuanLi_YuYin) then//检查权限:自己发布的或者自己是管理员,否则无法删除 begin self.WebApplication.ShowMessage('这不是你发的,你无权删除。'); Exit; end; ADOQuery4.Close;//先删除当前记录对应的语音评论 ADOQuery4.SQL.Clear;

Page 291: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 291页/共 376页

ADOQuery4.SQL.Add('delete from G063语音评论 where 下载 ID=:x'); ADOQuery4.Parameters.ParamByName('x').Value := ADOQuery1.FieldByname('id').Value; ADOQuery4.ExecSQL; //if pos('YuYinTianDi',trim(ADOQuery1.FieldByName('下载地址').Value))>0 then if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\YuYinTianDi\' + Trim(ADOQuery1.FieldByname('下载地址').Value)) then//再删除相应的语音文件 SysUtils.DeleteFile(WebApplication.ApplicationPath + 'files\YuYinTianDi\' + Trim(ADOQuery1.FieldByname('下载地址').Value)); ADOQuery1.Delete;//最后删除该条记录 IWDBEdit1.Editable := False; IWDBMemo2.Editable := False; IWDBCheckBox1.Editable := False; IWComboBox6.Editable := False; IWComboBox7.Editable := False; IWDBFile1.Visible := False; IWFile1.Visible := False; TIWDBAdvWebGrid2.Visible := true; IWDBImage2.Visible := true; if IWDBCheckBox2.Visible = true then IWDBCheckBox2.Editable := False; IWComboBox4Change(Sender); self.WebApplication.ShowMessage('该音像剪接信息已经全部删除。') end; //点击允许此音像剪接发布按钮后执行,这将填入当前审核人的卡号,这样该音像剪接就可以被别人浏览到了。 procedure TIWFormxiazaiYuYin.IWButton9Click(Sender: TObject); begin if (IWButton11.Enabled = False) or (ADOQuery1.RecordCount = 0) then//记录为空,不可审核 begin IWButton12Click(Sender); self.WebApplication.ShowMessage('当前没有选定记录。'); Exit; end; if (not UserSession.GuanLi_YuYin) then//检查权限 begin self.WebApplication.ShowMessage('你不是管理员,你无权审核。'); Exit; end; if trim(ADOQuery1.FieldByname('审核人卡号').Value) <> '' then//如果已经审核 begin

Page 292: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 292页/共 376页

self.WebApplication.ShowMessage('已经审核发布了。'); Exit; end; if UserSession.GuanLi_YuYin then//如果是管理员则执行审核:将自己的卡号填入审核人卡号字段 begin ADOQuery1.Edit; ADOQuery1.FieldByname('审核人卡号').Value := UserSession.KaHao; ADOQuery1.Post; end; IWDBEdit1.Editable := False; IWDBMemo2.Editable := False; IWDBCheckBox1.Editable := False; self.WebApplication.ShowMessage('审核完毕。') end; //点击放弃改动按钮后执行 procedure TIWFormxiazaiYuYin.IWButton12Click(Sender: TObject); begin ADOQuery1.Cancel;//取消数据库的当前操作 TIWDBAdvWebGrid2.Visible := true; IWDBImage2.Visible := true; IWButton1.Enabled := False; IWButton11.Enabled := true; IWButton7.Caption := '我要修改'; IWDBEdit1.Editable := False; IWDBMemo2.Editable := False; IWDBCheckBox1.Editable := False; IWDBFile1.Visible := False; IWFile1.Visible := False; IWButton12.Enabled := False; IWButton7.Enabled := true; IWButton8.Enabled := true; IWComboBox6.Editable := False; IWComboBox7.Editable := False; if IWDBCheckBox2.Visible = true then IWDBCheckBox2.Editable := False; IWComboBox4Change(Sender); end; //点击音像剪接浏览时执行,进入浏览界面 procedure TIWFormxiazaiYuYin.IWButton13Click(Sender: TObject); begin

Page 293: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 293页/共 376页

ok := False; IWRegion1.Visible := true;//这是浏览界面 IWRegion2.Visible := False; //这是编辑和上传界面 IWComboBox4Change(Sender); try ADOQuery1.Open; ADOQuery1.Locate('id', Trim(DangQiangid), []); except end; end; //点击要审核的音像剪接按钮时执行,这将搜索出所有要审核的音像剪接 procedure TIWFormxiazaiYuYin.IWButton14Click(Sender: TObject); begin if IWButton12.Enabled = true then begin self.WebApplication.ShowMessage('请先按放弃改动按钮。'); Exit; end; ADOQuery1.Cancel; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062 语音内容 where (审核人卡号=:x1) order by 加入时间 desc'); ADOQuery1.Parameters.ParamByName('x1').Value := ' '; ADOQuery1.Open; if ADOQuery1.RecordCount <> 0 then begin IWComboBox6.ItemIndex := IWComboBox6.Items.IndexOf(Trim(ADOQuery1.FieldByname('分类1').Value)); IWComboBox7.Items.Clear; IWComboBox7.Items.Add(Trim(ADOQuery1.FieldByname('分类 2').Value)); IWComboBox7.ItemIndex := 0; end; end; //改变大类时执行 procedure TIWFormxiazaiYuYin.IWComboBox2Change(Sender: TObject); var I: Integer; begin if IWButton12.Enabled = true then begin

Page 294: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 294页/共 376页

self.WebApplication.ShowMessage('请先按放弃改动按钮。'); Exit; end; ADOQuery4.Close; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('select distinct 分类 2 from G061语音分类 where 分类 1=:x'); ADOQuery4.Parameters.ParamByName('x').Value := Trim(IWComboBox2.Text); ADOQuery4.Open; ADOQuery4.First; IWComboBox4.Clear; IWComboBox4.Items.Add('所有分类'); for I := 1 to ADOQuery4.RecordCount do begin IWComboBox4.Items.Add(Trim(ADOQuery4.FieldByname('分类 2').Value)); ADOQuery4.Next; end; ADOQuery4.Close; IWComboBox4.ItemIndex := 0; if not UserSession.GuanLi_YuYin then begin if not IWCheckBox1.Checked then begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 and 加入者卡号=:y and 锁定=0 order by 加入时间 desc'); if Trim(IWComboBox2.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%' else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox2.Text) + '%'; if Trim(IWComboBox4.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox4.Text) + '%'; ADOQuery1.Parameters.ParamByName('y').Value := UserSession.KaHao; ADOQuery1.Open; end else begin

Page 295: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 295页/共 376页

ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 and 加入者卡号=:y and 推荐=1 and 锁定=0 order by 加入时间 desc'); if Trim(IWComboBox2.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%' else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox2.Text) + '%'; if Trim(IWComboBox4.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox4.Text) + '%'; ADOQuery1.Parameters.ParamByName('y').Value := UserSession.KaHao; ADOQuery1.Open; end; end else begin if not IWCheckBox1.Checked then begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 order by 加入时间 desc'); if Trim(IWComboBox2.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%' else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox2.Text) + '%'; if Trim(IWComboBox4.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox4.Text) + '%'; ADOQuery1.Open; end else begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 and 推荐=1 order by 加入时间 desc'); if Trim(IWComboBox2.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%'

Page 296: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 296页/共 376页

else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox2.Text) + '%'; if Trim(IWComboBox4.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox4.Text) + '%'; ADOQuery1.Open; end; end; if ADOQuery1.RecordCount <> 0 then begin IWComboBox6.ItemIndex := IWComboBox6.Items.IndexOf(Trim(ADOQuery1.FieldByname('分类1').Value)); IWComboBox7.Items.Clear; IWComboBox7.Items.Add(Trim(ADOQuery1.FieldByname('分类 2').Value)); IWComboBox7.ItemIndex := 0; end; end; //在编辑页面点击搜索时执行 procedure TIWFormxiazaiYuYin.IWButton4Click(Sender: TObject); var d, e, SQL: string; y: Integer; begin if IWButton12.Enabled = true then begin self.WebApplication.ShowMessage('请先按放弃改动按钮。'); Exit; end; if IWEdit1.Text = '' then begin self.WebApplication.ShowMessage('请填入查找搜索词。'); IWEdit1.SetFocus; Exit; end; ADOQuery1.Cancel; d := Trim(IWEdit1.Text); d := UserSession.ReplaceStrs(d, ' ', ' '); //将中文空格换成对应的英文空格 SQL := ''; y := Pos(' ', d); if (Pos(' ', d) = 0) then SQL := ' and (标题 like ' + '''%' + d + '%''' + ' or 内容 like ' + '''%' + d + '%'')'

Page 297: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 297页/共 376页

else begin while y <> 0 do begin e := leftbstr(d, y - 1); Delete(d, 1, y); d := Trim(d); y := Pos(' ', d); SQL := SQL + ' and (标题 like ' + '''%' + e + '%''' + 'or 内容 like ' + '''%' + e + '%'')'; end; SQL := SQL + ' and (标题 like ' + '''%' + d + '%''' + ' or 内容 like ' + '''%' + d + '%'')'; end; if not UserSession.GuanLi_YuYin then begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where (锁定=0) and (加入者卡号=:y) '); ADOQuery1.SQL.Add(SQL + ' order by 加入时间 desc'); ADOQuery1.Parameters.ParamByName('y').Value := UserSession.KaHao; ADOQuery1.Open; end else begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where '); Delete(SQL, 1, 4); ADOQuery1.SQL.Add(SQL + ' order by 加入时间 desc'); ADOQuery1.Open; end; if ADOQuery1.RecordCount <> 0 then begin IWComboBox6.ItemIndex := IWComboBox6.Items.IndexOf(Trim(ADOQuery1.FieldByname('分类1').Value)); IWComboBox7.Items.Clear; IWComboBox7.Items.Add(Trim(ADOQuery1.FieldByname('分类 2').Value)); IWComboBox7.ItemIndex := 0; end; end; //点击推荐按钮时执行 procedure TIWFormxiazaiYuYin.IWCheckBox1Click(Sender: TObject);

Page 298: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 298页/共 376页

begin if IWButton12.Enabled = true then begin self.WebApplication.ShowMessage('请先按放弃改动按钮。'); Exit; end; IWComboBox4Change(Sender); end; procedure TIWFormxiazaiYuYin.IWCheckBox2Click(Sender: TObject); begin IWComboBox5Change(Sender); end; //点击评论界面中的确认删除按钮时执行,这将删除相应的评论 procedure TIWFormxiazaiYuYin.IWButton18Click(Sender: TObject); begin if (IWButton20.Enabled = False) or (ADOQuery5.RecordCount = 0) then begin IWButton21Click(Sender); self.WebApplication.ShowMessage('当前没有选定记录。'); Exit; end; if (ADOQuery5.FieldByname(' 评 论 人 卡 号 ').Value <> UserSession.KaHao) and (not UserSession.GuanLi_YuYin) then//检查权限,是自己发布的或者是管理员才能够删除 begin self.WebApplication.ShowMessage('这不是你发的,你无权删除。'); Exit; end; ADOQuery5.Delete; IWDBEdit6.Editable := False; IWDBMemo3.Editable := False; IWButton20.Enabled := true; IWButton16.Enabled := False; IWButton21.Enabled := False; self.WebApplication.ShowMessage('该条评论已经删除。') end; //点击评论界面中的我要修改或确认修改按钮时执行 procedure TIWFormxiazaiYuYin.IWButton17Click(Sender: TObject); begin if (ADOQuery5.RecordCount = 0) then begin

Page 299: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 299页/共 376页

IWButton21Click(Sender); self.WebApplication.ShowMessage('当前没有选定记录。'); Exit; end; if (ADOQuery5.FieldByname(' 评 论 人 卡 号 ').Value <> UserSession.KaHao) and (not UserSession.GuanLi_YuYin) then begin self.WebApplication.ShowMessage('这不是你发的,你无权修改。'); Exit; end; if IWButton17.Caption = '我要修改' then//进入修改状态 begin IWDBEdit6.Editable := true; IWDBMemo3.Editable := true; IWButton21.Enabled := true; IWButton20.Enabled := False; IWButton18.Enabled := False; ADOQuery5.Edit; IWButton17.Caption := '确认修改'; end else//保存编辑好了的数据 begin if IWDBEdit6.Text = '' then begin self.WebApplication.ShowMessage('请填写标题。'); IWDBEdit6.SetFocus; Exit; end; if IWDBMemo3.Text = '' then begin self.WebApplication.ShowMessage('请填写内容。'); IWDBMemo3.SetFocus; Exit; end; ADOQuery5.Post; IWButton17.Caption := '我要修改'; IWDBEdit6.Editable := False; IWDBMemo3.Editable := False; IWButton20.Enabled := true; IWButton16.Enabled := False;

Page 300: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 300页/共 376页

IWButton21.Enabled := False; IWButton18.Enabled := true; end; end; //点击评论界面的音像剪接浏览时执行 procedure TIWFormxiazaiYuYin.IWButton22Click(Sender: TObject); var I: Integer; begin IWButton21Click(Sender); IWRegion2.Visible := true; IWRegion3.Visible := False; IWButton17.Caption := '我要修改'; IWDBEdit6.Editable := False; IWDBMemo3.Editable := False; IWMemo2.Text := ''; ADOQuery4.Close; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('select * from G063语音评论 where 下载 ID=:x order by 评论时间 desc'); ADOQuery4.Parameters.ParamByName('x').Value := DangQiangid; ADOQuery4.Open; ADOQuery4.First; if ADOQuery4.RecordCount > 0 then begin IWMemo2.Visible := true; IWDBImage1.Top := 565; IWRegion2.Height := 578; for I := 1 to ADOQuery4.RecordCount do begin IWMemo2.Text := IWMemo2.Text + ' ' + ADOQuery4.FieldByname('评论人姓名').Value + '于' + DateTimeToStr(ADOQuery4.FieldByname('评论时 间 ').Value) + '发表如下评论 :' + #13 + ADOQuery4.FieldByname('评论内容').Value + #13 + #13; ADOQuery4.Next; end; end else begin IWMemo2.Visible := False; IWDBImage1.Top := 432; IWRegion2.Height := 578 - 129; end; ADOQuery4.Close; ADOQuery5.Close;

Page 301: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 301页/共 376页

try ADOQuery1.Open; ADOQuery1.Locate('id', Trim(DangQiangid), []); except end; ok := true; end; //点击评论界面的放弃改动按钮后执行 procedure TIWFormxiazaiYuYin.IWButton21Click(Sender: TObject); begin ADOQuery5.Cancel; IWButton17.Caption := '我要修改'; IWDBEdit6.Editable := False; IWDBMemo3.Editable := False; IWButton20.Enabled := true; IWButton16.Enabled := False; IWButton21.Enabled := False; IWButton17.Enabled := true; IWButton18.Enabled := true; end; //点击评论界面的发布此评论时执行 procedure TIWFormxiazaiYuYin.IWButton16Click(Sender: TObject); begin if IWDBEdit6.Text = '' then begin self.WebApplication.ShowMessage('请填写标题。'); IWDBEdit6.SetFocus; Exit; end; if IWDBMemo3.Text = '' then begin self.WebApplication.ShowMessage('请填写内容。'); IWDBMemo3.SetFocus; Exit; end; //保存评论 ADOQuery5.FieldByname('下载 ID').Value := DangQiangid; ADOQuery5.FieldByname('评论时间').Value := Now; ADOQuery5.FieldByname('评论人姓名').Value := UserSession.XingMing; ADOQuery5.FieldByname('评论人卡号').Value := UserSession.KaHao;

Page 302: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 302页/共 376页

ADOQuery5.Post; IWDBEdit6.Editable := False; IWDBMemo3.Editable := False; IWButton15Click(Sender); IWButton20.Enabled := true; IWButton16.Enabled := False; IWButton21.Enabled := False; IWButton17.Enabled := true; IWButton18.Enabled := true; end; //点击我发布的所有评论按钮时执行 procedure TIWFormxiazaiYuYin.IWButton15Click(Sender: TObject); begin if not UserSession.GuanLi_YuYin then//如果不是管理员,只显示当前用户的评论 begin ADOQuery5.Close; ADOQuery5.SQL.Clear; ADOQuery5.SQL.Add('select * from G063语音评论 where 下载 ID = :x and 评论人卡号=:y order by 评论时间 desc'); ADOQuery5.Parameters.ParamByName('x').Value := DangQiangid; ADOQuery5.Parameters.ParamByName('y').Value := UserSession.KaHao; ADOQuery5.Open; end else//如果是管理员,则显示所的评论 begin ADOQuery5.Close; ADOQuery5.SQL.Clear; ADOQuery5.SQL.Add('select * from G063语音评论 where 下载 ID = :x order by 评论时间 desc'); ADOQuery5.Parameters.ParamByName('x').Value := DangQiangid; ADOQuery5.Open; end; end; //点击增加评论按钮时执 procedure TIWFormxiazaiYuYin.IWButton20Click(Sender: TObject); begin IWDBEdit6.Editable := true; IWDBMemo3.Editable := true; ADOQuery5.Append; IWButton20.Enabled := False; IWButton17.Enabled := False;

Page 303: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 303页/共 376页

IWButton18.Enabled := False; IWButton16.Enabled := true; IWButton21.Enabled := true; end; //点击我要发表评论按钮时执行 procedure TIWFormxiazaiYuYin.IWButton3Click(Sender: TObject); begin ok := False; ADOQuery1.Open; if (ADOQuery1.RecordCount = 0) then//如果没有当前记录则退出 begin self.WebApplication.ShowMessage('当前没有选定音像剪接。'); Exit; end; ADOQuery1.Close; IWRegion1.Visible := False; IWRegion2.Visible := False; IWRegion3.Visible := true; IWButton15Click(Sender); end; //点击表格的相应行,将记录指向到该记录,并给相应控件赋值 procedure TIWFormxiazaiYuYin.TIWDBAdvWebGrid2AfterGotoLink(Sender: TObject; RowIndex, ColumnIndex: Integer); begin if ADOQuery1.RecordCount <> 0 then begin IWComboBox6.ItemIndex := IWComboBox6.Items.IndexOf(Trim(ADOQuery1.FieldByname('分类1').Value)); IWComboBox7.Items.Clear; IWComboBox7.Items.Add(Trim(ADOQuery1.FieldByname('分类 2').Value)); IWComboBox7.ItemIndex := 0; TIWScrollPanel1.Text.Text := Trim(ADOQuery1.FieldByname('内容').Value); end; end; //删除某一个类别前要相应删除所有的语音评论,语音文件和语音记录 procedure TIWFormxiazaiYuYin.ADOQuery2BeforeDelete(DataSet: TDataSet); begin ADOQuery4.Close;

Page 304: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 304页/共 376页

ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('delete from G063语音评论 where 下载 ID in (select id from G062语音内容 where 分类 1=:x1 and 分类 2=:x2)'); ADOQuery4.Parameters.ParamByName('x1').Value := ADOQuery2.FieldByname('分类 1').Value; ADOQuery4.Parameters.ParamByName('x2').Value := ADOQuery2.FieldByname('分类 2').Value; ADOQuery4.ExecSQL; ADOQuery4.Close; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('delete from G062语音内容 where 分类 1=:x1 and 分类 2=:x2'); ADOQuery4.Parameters.ParamByName('x1').Value := ADOQuery2.FieldByname('分类 1').Value; ADOQuery4.Parameters.ParamByName('x2').Value := ADOQuery2.FieldByname('分类 2').Value; ADOQuery4.ExecSQL; end; //增加音像剪接分类 procedure TIWFormxiazaiYuYin.IWButton19Click(Sender: TObject); begin ADOQuery2.Open; IWRegion4.Visible := true; IWRegion1.Visible := False; end; //执行返回按钮的动作 procedure TIWFormxiazaiYuYin.IWButton24Click(Sender: TObject); begin IWRegion1.Visible := true; IWRegion4.Visible := False; ADOQuery2.Close; end; procedure TIWFormxiazaiYuYin.IWComboBox4Change(Sender: TObject); begin if IWButton12.Enabled = true then begin self.WebApplication.ShowMessage('请先按放弃改动按钮。'); Exit; end; if not UserSession.GuanLi_YuYin then begin if not IWCheckBox1.Checked then begin ADOQuery1.Close;

Page 305: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 305页/共 376页

ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 and 加入者卡号=:y and 锁定=0 order by 加入时间 desc'); if Trim(IWComboBox2.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%' else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox2.Text) + '%'; if Trim(IWComboBox4.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox4.Text) + '%'; ADOQuery1.Parameters.ParamByName('y').Value := UserSession.KaHao; ADOQuery1.Open; end else begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 and 加入者卡号=:y and 推荐=1 and 锁定=0 order by 加入时间 desc'); if Trim(IWComboBox2.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%' else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox2.Text) + '%'; if Trim(IWComboBox4.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox4.Text) + '%'; ADOQuery1.Parameters.ParamByName('y').Value := UserSession.KaHao; ADOQuery1.Open; end; end else begin if not IWCheckBox1.Checked then begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 order by 加入时间 desc'); if Trim(IWComboBox2.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%'

Page 306: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 306页/共 376页

else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox2.Text) + '%'; if Trim(IWComboBox4.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox4.Text) + '%'; ADOQuery1.Open; end else begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 and 推荐=1 order by 加入时间 desc'); if Trim(IWComboBox2.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%' else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox2.Text) + '%'; if Trim(IWComboBox4.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox4.Text) + '%'; ADOQuery1.Open; end; end; if ADOQuery1.RecordCount <> 0 then begin IWComboBox6.ItemIndex := IWComboBox6.Items.IndexOf(Trim(ADOQuery1.FieldByname('分类1').Value)); IWComboBox7.Items.Clear; IWComboBox7.Items.Add(Trim(ADOQuery1.FieldByname('分类 2').Value)); IWComboBox7.ItemIndex := 0; end; end; procedure TIWFormxiazaiYuYin.IWComboBox5Change(Sender: TObject); var I: Integer; begin if not IWCheckBox2.Checked then begin ADOQuery1.Close; ADOQuery1.SQL.Clear;

Page 307: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 307页/共 376页

ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 and 审核人卡号<>:y order by 加入时间 desc'); if Trim(IWComboBox1.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%' else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox1.Text) + '%'; ADOQuery1.Parameters.ParamByName('y').Value := ' '; if Trim(IWComboBox5.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox5.Text) + '%'; ADOQuery1.Open; end else begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('select * from G062语音内容 where 分类 1 like :x1 and 分类 2 like :x2 and 推荐=1 and 审核人卡号<>:y order by 加入时间 desc'); if Trim(IWComboBox1.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x1').Value := '%' else ADOQuery1.Parameters.ParamByName('x1').Value := Trim(IWComboBox1.Text) + '%'; if Trim(IWComboBox5.Text) = '所有分类' then ADOQuery1.Parameters.ParamByName('x2').Value := '%' else ADOQuery1.Parameters.ParamByName('x2').Value := Trim(IWComboBox5.Text) + '%'; ADOQuery1.Parameters.ParamByName('y').Value := ' '; ADOQuery1.Open; end; if ADOQuery1.RecordCount > 0 then begin IWLink1.hint := '给' + Trim(ADOQuery1.FieldByname('加入者姓名').Value) + '发信息。'; TIWScrollPanel1.Text.Text := Trim(ADOQuery1.FieldByname('内容').Value); end else IWLink1.hint := ''; if ADOQuery1.RecordCount = 0 then Exit;

Page 308: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 308页/共 376页

IWMemo2.Text := ''; ADOQuery4.Close; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('select * from G063语音评论 where 下载 ID=:x order by 评论时间 desc'); ADOQuery4.Parameters.ParamByName('x').Value := ADOQuery1.FieldByname('id').Value; ADOQuery4.Open; ADOQuery4.First; if ADOQuery4.RecordCount > 0 then begin IWMemo2.Visible := true; IWDBImage1.Top := 565; IWRegion2.Height := 578; for I := 1 to ADOQuery4.RecordCount do begin IWMemo2.Text := IWMemo2.Text + ' ' + ADOQuery4.FieldByname('评论人姓名').Value + '于' + DateTimeToStr(ADOQuery4.FieldByname('评论时 间 ').Value) + '发表如下评论 :' + #13 + ADOQuery4.FieldByname('评论内容').Value + #13 + #13; ADOQuery4.Next; end; end else begin IWMemo2.Visible := False; IWDBImage1.Top := 432; IWRegion2.Height := 578 - 129; end; ADOQuery4.Close; end; //点击下载音像剪接按钮时执行 procedure TIWFormxiazaiYuYin.IWButton25Click(Sender: TObject); begin ok := False; try ADOQuery1.Open; ADOQuery1.Locate('id', Trim(DangQiangid), []); except end; if ADOQuery1.RecordCount = 0 then Exit; if Trim(ADOQuery1.FieldByname('下载地址').Value) = '' then Exit; if Pos('/', Trim(ADOQuery1.FieldByname('下载地址').Value)) = 0 then begin if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\YuYinTianDi\' +

Page 309: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 309页/共 376页

Trim(ADOQuery1.FieldByname('下载地址').Value)) then//判断是否有此文件 WebApplication.SendFile(WebApplication.ApplicationPath + 'files\YuYinTianDi\' + Trim(ADOQuery1.FieldByname('下载地址').Value), true, '', '')//向客户端发送文件 else self.WebApplication.ShowMessage('无音像剪接文件下载。'); end else begin if SysUtils.FileExists(WebApplication.ApplicationPath + Trim(ADOQuery1.FieldByname('下载地址').Value)) then WebApplication.SendFile(WebApplication.ApplicationPath + Trim(ADOQuery1.FieldByname('下载地 址 ').Value), true, '', Trim(ADOQuery1.FieldByname(' 标 题 ').Value) + SysUtils.ExtractFileExt(WebApplication.ApplicationPath + Trim(ADOQuery1.FieldByname('下载地址').Value))) else self.WebApplication.ShowMessage('无音像剪接文件下载。'); end; if ADOQuery1.RecordCount = 0 then Exit; ADOQuery1.Edit; ADOQuery1.FieldByname('下载次数').Value := ADOQuery1.FieldByname('下载次数').Value + 1; ADOQuery1.Post; ok := true; end; procedure TIWFormxiazaiYuYin.IWComboBox6Change(Sender: TObject); var I: Integer; begin //判断自己是否选择了空的,否则就退出 if Trim(IWComboBox6.Text) = '' then begin self.WebApplication.ShowMessage('大类不能为空。'); IWComboBox6.SetFocus; Exit; end; ADOQuery4.Close; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('select distinct 分类 2 from G061语音分类 where 分类 1=:x'); ADOQuery4.Parameters.ParamByName('x').Value := Trim(IWComboBox6.Text); ADOQuery4.Open; ADOQuery4.First; IWComboBox7.Clear;

Page 310: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 310页/共 376页

for I := 1 to ADOQuery4.RecordCount do begin IWComboBox7.Items.Add(Trim(ADOQuery4.FieldByname('分类 2').Value)); ADOQuery4.Next; end; ADOQuery4.Close; IWComboBox7.ItemIndex := -1; IWDBEdit1.Editable := true; IWDBMemo2.Editable := true; IWComboBox6.Editable := False; IWComboBox7.Editable := true; IWDBFile1.Visible := true; IWFile1.Visible := true; IWDBCheckBox1.Editable := true; IWButton12.Enabled := true; if IWDBCheckBox2.Visible = true then IWDBCheckBox2.Editable := true; ADOQuery1.Append; IWButton1.Enabled := true; end; //点击设定此速度后执行 procedure TIWFormxiazaiYuYin.IWButton26Click(Sender: TObject); begin TIWScrollPanel1.Speed := Strtoint(Trim(TIWAdvEdit1.Text)); end; //到达指定记录后执行 procedure TIWFormxiazaiYuYin.ADOQuery1AfterScroll(DataSet: TDataSet); var I: Integer; begin if ok = true then begin if ADOQuery1.RecordCount = 0 then Exit; if ADOQuery1.FieldByname('内容').Value = NULL then Exit; try ////++++++++++++++++++++++++++++++ if ADOQuery1.FieldByname('下载地址').Value <> NULL then begin if Pos('/', Trim(ADOQuery1.FieldByname('下载地址').Value)) = 0 then

Page 311: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 311页/共 376页

begin if SysUtils.FileExists(WebApplication.ApplicationPath + 'files\YuYinTianDi\' + Trim(ADOQuery1.FieldByname('下载地址').Value)) then TIWHTMLLabel1.HTMLText := ' <span id="spanSpk1" language=javascript onClick="run(''' + 'files/YuYinTianDi/' + Trim(ADOQuery1.FieldByname('下载地址').Value) + ''')" ><a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音">播放</a></span>' else TIWHTMLLabel1.HTMLText := ''; end else begin if SysUtils.FileExists(WebApplication.ApplicationPath + Trim(ADOQuery1.FieldByname('下载地址').Value)) then//如果有此文件,以下将显示小喇叭和播放两个字,点击播放将调用 realplqyer播放该文件 TIWHTMLLabel1.HTMLText := ' <span id="spanSpk1" language=javascript onClick="run(''' + Trim(ADOQuery1.FieldByname(' 下 载 地 址 ').Value) + ''')" ><a href="javascript:;" onClick="MM_showHideLayers(''floater'','''',''show'')"><img border="0" src="../files/spk1.gif" width="21" height="20" alt="点击播放录音">播放</a></span>' else TIWHTMLLabel1.HTMLText := ''; end; end else TIWHTMLLabel1.HTMLText := ''; ////++++++++++++++++++++++++++++++ TIWScrollPanel1.Text.Text := Trim(ADOQuery1.FieldByname('内容').Value); IWMemo2.Text := ''; ADOQuery4.Close; ADOQuery4.SQL.Clear; ADOQuery4.SQL.Add('select * from G063语音评论 where 下载 ID=:x order by 评论时间 desc'); ADOQuery4.Parameters.ParamByName('x').Value := ADOQuery1.FieldByname('id').Value; ADOQuery4.Open; ADOQuery4.First; if ADOQuery4.RecordCount > 0 then begin IWMemo2.Visible := true; IWDBImage1.Top := 565; IWRegion2.Height := 578; for I := 1 to ADOQuery4.RecordCount do begin

Page 312: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 312页/共 376页

IWMemo2.Text := IWMemo2.Text + ' ' + ADOQuery4.FieldByname('评论人姓名').Value + '于 ' + DateTimeToStr(ADOQuery4.FieldByname('评论时间 ').Value) + '发表如下评论 :' + #13 + ADOQuery4.FieldByname('评论内容').Value + #13 + #13; ADOQuery4.Next; end; end else begin IWMemo2.Visible := False; IWDBImage1.Top := 432; IWRegion2.Height := 578 - 129; end; ADOQuery4.Close; if ADOQuery1.RecordCount > 0 then IWLink1.hint := '给' + Trim(ADOQuery1.FieldByname('加入者姓名').Value) + '发信息。'; except ADOQuery4.Close; end; if ADOQuery1.RecordCount = 0 then begin IWLink1.hint := ''; IWLink1.Enabled := False; Exit; end; IWLink1.Enabled := true; jiarykahao := Trim(ADOQuery1.FieldByname('加入者卡号').Value); jiaruxingming := Trim(ADOQuery1.FieldByname('加入者姓名').Value); IWLink1.hint := '给' + Trim(ADOQuery1.FieldByname('加入者姓名').Value) + '发信息。'; DangQiangid := Trim(ADOQuery1.FieldByname('id').AsString); end; end; //更新点击次数 procedure TIWFormxiazaiYuYin.TIWDBAdvWebGrid3AfterGotoLink(Sender: TObject; RowIndex, ColumnIndex: Integer); begin if ADOQuery1.RecordCount = 0 then Exit; ADOQuery1.Edit; ADOQuery1.FieldByname('点击次数').Value := ADOQuery1.FieldByname('点击次数').Value + 1; ADOQuery1.Post; end;

Page 313: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 313页/共 376页

//输出完 html代码后执行 procedure TIWFormxiazaiYuYin.IWAppFormAfterRender(Sender: TObject); begin if ok = true then begin ADOQuery1.Close; end; end; //输出 html代码时执行 procedure TIWFormxiazaiYuYin.IWAppFormRender(Sender: TObject); begin if UserSession.flag = true then begin try ADOQuery1.Open; ADOQuery1.Locate('id', Trim(DangQiangid), []); except end; end; UserSession.flag := False; self.WebApplication.SessionTimeOut := 30;//设定当前页的自动关闭时间 if IWRegion2.Visible = true then IWRegion5.Visible := true else IWRegion5.Visible := False; end; //关闭 session procedure TIWFormxiazaiYuYin.ComGridColumns0Click(ASender: TObject; const AValue: string); begin UserSession.closesessoion; end; 补充说明: 本程序主要以应用 intraweb 控件和 TMS 控件为主,所以页面上有很多各种各样的控件。代码其

实是很简单的,主要是对数据库的操作和相应控件的属性和方法的操作。改变相应控件的 visible属性可以实现灵活多样的界面输出,请好好利用这一点可以减少编程窗口的数量和模板的数量。 如有不懂的地方请多看看源代码,查看相应控件的事件即可明白它在程序中的作用。大家在看程

序时,不要力求全部明白程序的所有逻辑过程,应主要着眼于整个 intraweb程序的大体框架和实现的基本途径,数据库操作的细节和程序的整体应用逻辑是次要的,切记!

Page 314: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 4.2 一个英语教学网站的综合编程 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 314页/共 376页

所有模板文件用 dreamweaverMX 编辑,如有不明白的地方,请打开源代码自己细看。请注意模板的图片文件的相对路径。

Server_dll.dpr 为生成 dll 版本的工程文件。要用 IIS 发布生才能查看。所有代码在

WinXPSP2+Dlphi7.0 +IntraWeb7.2.41下调试通过。IWServerController的属性 ComInitialization:发布到WinXPSP2,Win2000,请选择 ciMultiThreaded,发布到Win2003SP1请选择 ciNormal。

Page 315: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 5.1 使用通用框架的目的 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 315页/共 376页

第五章 Intraweb编程通用框架

5.1 使用通用框架的目的 IntraWeb 编程开始都是一样的,它有一些通用的窗口和单元,例如 ServerController.pas 和

UserSessionUnit.pas 等。我们可以把一些常用的通用函数定义在这两个单元中。如果有导航条或者菜单之类的东西,则可以放在 UFormBase.pas 单元中,其它单元可以从它继承(在《用窗口继承的方法实现网页中的导航条》这一节中有详细讲解)。我们将工程命名为 exe.dpr和 dll.dpr,这样我们可以很清楚的看出其发布方法。 有了以上框架,我们编写任何程序都可以从这个框架开始。我样做的好处是: 1、可以节省不少时间 2、常用函数和方法可以直接调用

5.2 通用框架的基本结构 通用框架的基本结构我们从以下几个方面讲解: 1、程序的目录结构 程序的所有源代码都存入在程序的根目录下,此外在该目录下还有如下 3个文件夹:database下

存放数据库文件,files 文件夹下存放所有的程序要用到的相关文件,templates 文件下存放程序模板文件。在这个框架中,我们用的是 database\data.mdb数据库,用它是因为它不用安装,发布简便,且可以很方便的移植到 SQL2000 等数据库中;files\Skin 中放的是我们的皮肤文件模板,也就是一些帮助我们美化输出数据的一些事先定义好的带有特定标记的 html文件(在《用 html 模板格式化输出数据库中的数据》这一节中有详细讲解),其中的文件夹 1 表示这是该程序的一套皮肤,如果有文件夹 2,3等,程序就具有换肤功能了,files\dtree是一个显示 tree结构的 javascript相关文件,可以当作控件对待(在《实现网页中的目录树》这一节中有详细讲解),files\ images是一个在网页中实现复杂html编辑器的“控件”(在《在 IntraWeb中轻松实现通用的 HTML文本编辑器》这一节中有详细讲解),files\ tip.js是一个实现复杂信息提示框的 javascript文件(在《实现网页复杂提示信息框》这一节中有详细讲解),files\ exit.htm为程序退出时调用的页面,files\ System.ini中记录了一些程序系统设置信息,如程序使用的端口,IP,数据库连接密码,是否使用网页特效,默认使用的模板和皮肤文件夹等等,其它文件是模板所要调用的文件,一些图片等;templates 下放的是模板文件,它和皮肤文件一样,可以有很多文件夹,更换文件夹就可以实现不同的网站风格。根目录下的 Clean.bat 可以用来清除编程所留下的临时文件。根目录下的 GY.pas中存放了一些常用的函数集合。如图 5-1所示:

Page 316: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 5.2 通用框架的基本结构 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 316页/共 376页

图 5-1程序的目录结构

2、程序的编程结构 我们先完成 exe 发布方式的编程,这是因为这种方式可以很方便的进行调试,当完成程序后,也

要可以很方便的转化成 dll的形式,这方便我们利用 IIS正式进行发布。我们需要一个主界面,同时也要有导航条或菜单,如果方便的话,程序中最好自带一些我们常用的共用函数和一些通用的处理模块,

如加密、解密,自动调用模板,自动退出处理等等。按照以上要求我们的设计框图如图 5-2所示:

图 5-2 通用框架结构示意图

1、打开 dll.dpr工程文件,将 exe.dpr工程中用到的单元文件加入到该工程中即可将.exe形式转化

创建我们的 intraweb程序

exe.dpr dll.dpr

ServerController.pas UserSessionUnit.pas UFormBase.pas Umain.pas GY.pas

生成 exe.exe 生成 dll.dll

以默认文件名保

存,设置程序多个

重要参数。我们精

选了一些常用的

函数,其它窗口可

以直接调用

以默认文件名保

存,处理数据库的

连接和程序退出

结束 Session 的函数,其它窗口以如

下方式调用其中

的 函 数 和 变 量

UserSession.CloseSession;

这是程序中被

继承的窗口,

用 来 完 成导

航、菜单或登

录、退出等相

关处理

这是程序的

主页面,从

UFormBase.pas继承。可以在这里实

现我们的主

界面

常 用 函

数集合,

自 己 可

以 任 意

添加

Page 317: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 5.3 通用函数导读与讲解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 317页/共 376页

成.dll形式用 IIS发布(参考《IntraWeb程序.exe与.dll两种发布形式的相互转换》这一节)。 2、ServerController.pas是一个很重要的单元,该单元中的一些属性设置对程序很重要(参考《建

立一个以独立的应用程序的形式发布的程序》这一节)。此外,该单元还定义了很多有用的函数,下面

有详细介绍。 3、UserSessionUnit.pas是一个很特殊的单元,为什么这么说呢?因为它相当于一个 Session的

共用数据存储区,所有 use它的窗口都可以直接使用它的变量和函数,这为各个窗口之间的数据交换提供了方便(参考《窗口之间数据参数传递详解》这一节)。

4、UFormBase.pas 是一个被继承的单元,其使用方法请参考《用窗口继承的方法实现网页中的导航条》这一节。

5.3 通用函数导读与讲解 1、ServerController.pas单元中新加入了如下函数: 本单元代码太多,请打开通用框架文件夹内的源代码查看。此处只列出函数声明,并简单说明一

下函数的作用,同时指出了相应的参考章节。 function GetLocalIP: string; //得到本机 IP地址 procedure ShowForm(AFormName: string;FreeActiveForm:boolean=false);//打开页面的通用函

数 function GetLinkStringEx(Row: Integer; ID, Link: string; Cof: string = ''; GridName: string =

'ComGrid'): string; // 请参考《用自己的代码实现表格翻页控件》这一节 function GetToolStr(RecNo, RecordCount, RowLimit: Integer; GridID: Integer; Nums: Integer =

10; Captions: string = '条记录'; Grid: string = 'ComGrid'): string;// 请参考《用自己的代码实现表格翻页控件》这一节

function GetSpace(Count: Integer): string;//得到插入 Count个空格的 html代码 function pictureString(IPath, ISize: string): string;//得到在网页中显示图片的 html代码。IPath为

图片文件例如:/files/temp.jpg ISize为图片的小,中,大选项:small,med,larg function GetLinkString(Row, ID: string; Link: string; title: string = ''; Cof: string = ''; GridName:

string = 'ComGrid'): string; //请参考《让超级链接变成可向服务器传递参数的按钮》这一节 procedure SetPage(Grid: TIWDBGrid; AValue: string; RecNumble: Integer); // 请参考《用自己的

代码实现表格翻页控件》这一节 function PlayRM(Iflie: string): string;//得到播放 RM文件:Iflie的 html代码 function PlayAvi(Iflie: string): string; //得到播放 Avi文件:Iflie的 html代码 function CopyDirectory(const Source, Dest: string): Boolean; //复制文件夹(Source为被拷贝的文

件夹名,Dest新文件夹名) function DelDirectory(const Source: string): Boolean; //删除文件夹 function RenDirectory(const OldName, NewName: string): Boolean; // 更改文件夹名称 function gethzPy(const AHzStr: string): string; //得到汉字着字母 function RenString(Istring: string): string; //将字符中的/替换成\ function IIF(str, num: string): string; //如果 str为空,则函数值为 num,如果不为空,则函数值为

str function GetHourStr: string; //得到一天的时间段称呼 function GetpicString(picurl: string; width: string = '500'; alt: string = '在新窗口中查看该图片'):

string; //alt为鼠标上去后的提示文字

Page 318: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 5.3 通用函数导读与讲解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 318页/共 376页

function ReplaceStrs(str, SearchStr, ReplaceStr: string): string;//用 ReplaceStr替换 str中所有的SearchStr字符串

2、UserSessionUnit. pas单元中的完整代码如下: unit UserSessionUnit; interface uses IWUserSessionBase, SysUtils, Classes, //新加入的 : IWApplication, DB, ADODB; type TIWUserSession = class(TIWUserSessionBase) List: TADOQuery; ListSource: TDataSource; Querytemp: TADOQuery; cn: TADOConnection; Querytemp1: TADOQuery; procedure IWUserSessionBaseCreate(Sender: TObject); private { Private declarations } public { Public declarations } Skin: string; //所使用的皮肤 RecNumble: Integer; //记录集的当前记录号 procedure CloseSession;//关闭退出程序,可以在其它任意窗口中调用 end; implementation uses ServerController, IWInit; {$R *.dfm} procedure TIWUserSession.IWUserSessionBaseCreate(Sender: TObject); var i: Integer; begin //设定全局数据连接并打开,不要把它写在 IWServerController单元内,用 IIS发布时有问题 cn.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +

IWServerController.AppPath + 'database\data.mdb;Persist Security Info=False'; cn.Open; for i := 0 to self.ComponentCount - 1 do begin//给所有的 TADOQuery控件指定数据库连接为

cn if (self.Components[i] is TADOQuery) then begin (self.Components[i] as TADOQuery).Connection := cn; end; end; end;

Page 319: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 5.3 通用函数导读与讲解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 319页/共 376页

procedure TIWUserSession.CloseSession;//关闭退出程序,可以在其它任意窗口中调用 begin //可以添加退出时要处理的代码,例如记录上网用时,下网时间等等 WebApplication.Terminate;//结束当前会话(sessoion) end; end. 3、UFormBase.pas单元中的完整代码如下: 设计时窗口内的控件布局如图 5-3 所示。IWTemplateProcessorHTML1 是用来指定窗口的 html

模板的。ComGrid0是为了响应页面上的某些超级链接的。退出按钮用来结束程序。

图 5-3 UFormBase单元对应窗口的控件布局

unit UFormBase; {页面进入和退出的特效 进入页面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)"> 推出页面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)"> 这个是页面被载入和调出时的一些特效。duration 表示特效的持续时间,以秒为单位。transition

表示使 用哪种特效,取值为 1-23: 0 矩形缩小 1 矩形扩大 2 圆形缩小 3 圆形扩大 4 下到上刷新 5 上到下刷新 6 左到右刷新 7 右到左刷新 8 竖百叶窗 9 横百叶窗 10 错位横百叶窗 11 错位竖百叶窗 12 点扩散 13 左右到中间刷新 14 中间到左右刷新 15 中间到上下 16 上下到中间 17 右下到左上 18 右上到左下 19 左上到右下 20 左下到右上 21 横条 22 竖条 23 以上 22种随机选择一种} interface uses Classes, SysUtils, IWAppForm, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout, IWTemplateProcessorHTML, IWCompButton, IWCompLabel, Controls, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWGrids, IWDBGrids; type TIWFormBase = class(TIWAppForm) IWTemplateProcessorHTML1: TIWTemplateProcessorHTML; ComGrid0: TIWDBGrid; IWLabel1: TIWLabel;

Page 320: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 5.3 通用函数导读与讲解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 320页/共 376页

IWButton1: TIWButton; procedure IWAppFormRender(Sender: TObject); procedure ComGrid0Columns0Click(ASender: TObject; const AValue: string); procedure IWButton1Click(Sender: TObject); public end; implementation uses ServerController, UserSessionUnit; {$R *.dfm} procedure TIWFormBase.IWAppFormRender(Sender: TObject); var VLIst: TStringList; closestr: string; begin closestr := '<script FOR=window EVENT=onunload>if (window.event.clientY <0) ' + '{SubmitClickConfirm(''ComGrid0'',''0_close'', true, '''');window.alert('' 欢 迎 下 次 再 来 !

'');}</script>';//让 IE响应关闭事件(点击刷新也会执行) //ExtraHeader.Text :=closestr+ ExtraHeader.Text;//如果要 IE关闭时自动关闭 session,则请去

掉此句的注释 VLIst := TStringList.Create; VLIst.LoadFromFile(WebApplication.ApplicationPath + 'files\System.ini'); //读取系统设置信息 //StyleSheet.Filename := WebApplication.ApplicationPath + 'Files\Skin\' + UserSession.Skin +

'\style.css'; IWTemplateProcessorHTML1.Templates.Default := UserSession.Skin + '\' +

WebApplication.ActiveForm.Name + '.Html'; //设定所有继承它的窗口的 html模板文件名 if StrToBoolDef(VLIst.ValueFromIndex[1], true) then //如果支持页面特效 ExtraHeader.Text := ' <meta HTTP-EQUIV="Page-Enter"

CONTENT="revealtrans(duration=0.5, transition=23)"> ' + ExtraHeader.Text; VLIst.Free; //登录成功的话改变页面显示:========= //登录成功的话改变页面显示。========= end; procedure TIWFormBase.ComGrid0Columns0Click(ASender: TObject;const AValue: string); //响

应 IE的关闭事件,关闭所有窗口 begin UserSession.CloseSession;//关闭退出程序 end; procedure TIWFormBase.IWButton1Click(Sender: TObject); begin

Page 321: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 5.3 通用函数导读与讲解 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 321页/共 376页

self.WebApplication.Terminate('您主动退出了!'); //或者用下一句 //UserSession.CloseSession;//关闭退出程序 end; end. 4、Umain.pas单元中的完整代码如下: unit Umain; interface uses Windows, Messages, UFormBase, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout, IWTemplateProcessorHTML, IWCompButton, IWCompLabel, Classes, Controls, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWGrids, IWDBGrids; type TIWFormmain = class(TIWFormBase) ComGrid: TIWDBGrid; IWLabel2: TIWLabel; private { Private declarations } public { Public declarations } end; var IWFormmain: TIWFormmain; implementation uses ServerController, UserSessionUnit;//最好每个窗口都加上这两个单元 {$R *.dfm} initialization TIWFormmain.SetAsMainForm; RegisterClass(TIWFormmain);//请在每个窗口最后一个 end 前加上这一句,如果没有

initialization,也请加上 initialization end. 5、GY.pas单元中有如下函数可被调用(当然你可以无限增加): function GetMACAddress(Num: Byte = 0): string; overload; //获取第 num块网卡卡号,如果只有

一块网卡的话,直接调用 GetMACAddress(0)即可返回网卡卡号字符串(当有网络连接时才能返回正确值)

function GetIDEDiskSerialNumber: string;//得到硬盘物理号 function GetIDEDiskDriveInfo(Drive: Char; InfoID: Byte = 1): string;//取得 C盘等分区盘的序列号 function GetCPUInfo(InfoID: Byte = 1): string;//得到 CPU的信息,1为序列号,2为频率,3为厂

家 function Encrypt_text(text,mima:string):string; //用密码mima对 text字串进行加密,函数返回加

密后的字串 function DeEncrypt_text(text,mima:string):string; //用密码mima对 text字串进行解密,函数返回

Page 322: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 5.4 使用框架的注意事项 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 322页/共 376页

解密后的字串,当然加密是用的上一个函数 Encrypt_text(text,mima:string) function Encrypt(file1,tofile2,mima:string):boolean; //用密码mima对 file1文件加密生成为 tofile2

文件,加密成功函数返回 true,否则返回 false function DeEncrypt(file1,tofile2,mima:string):boolean; //用密码 mima 对 file1 文件解密生成为

tofile2文件,解密成功函数返回 true,否则返回 false function CopyDirectory(const Source, Dest: string): Boolean; //拷贝一目录到另一个目录 function DelDirectory(const Source: string): Boolean; // 删除一个目录 function RenDirectory(const OldName, NewName: string): Boolean; // 给一个目录改名 function MoveDirectory(const OldName, NewName: string): Boolean; // 移动一个目录名 function gethzPy(const AHzStr: string): string; //得到汉字首字母 function ReplaceText(const S, ReplacePiece, ReplaceWith: string): string; //用 ReplaceWith字串

替换 S中的所有 ReplacePiece字串 function GetLocalIP: string; //得到本机 IP地址(只有当有网络连接时),单机时返回字串:127.0.0.1

5.4 使用框架的注意事项

1、在新开始一个项目时,请将通用框架文件夹全部拷贝到一个合适的位置并改名为该项目名称,该项目的所有相关文件都放在该文件夹中,其中源代码文件放在根目录下,database存放数据库文件,templates存放模板文件,files存放程序要用到的所有资源文件,doc存放项目编程所有技术文档。发布程序时只要 database,templates,files三个文件夹和两个文件:dll.dll,exe.exe(两种发布方式)。

2、敏感数据请加密后保存(应用 Encrypt_text(text,mima)函数),程序要调用时可以先解密(调用 DeEncrypt_text(text,mima)函数)。防止被下载后看到。

3、用 IIS发布时,如果程序发布时该硬盘分区为 NTFS文件系统的话(如果是 Fat32格式,则不用进行如下操作),还要设置权限,否则程序可能运行不正常,如不能更新数据库,写入硬盘临时文件

等等。进行如下两步操作即可: (1)第一步:打开工具菜单下的文件夹选项,如图 5-4所示:不要选择“使用简单文件共享(推

荐)”这一项。

图 5-4 文件夹选项对话框

Page 323: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 5.4 使用框架的注意事项 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 323页/共 376页

(2)第二步:右击要发布的文件夹,选择属性,如图 5-5所示。在安全选项卡中添加 Internet来宾帐户,给其权限为图中所示。

图 5-5 属性对话框

如果没有进行以上设置,如果程序访问修改数据库的话,则可能会出现如图 5-6所示出错提示:

图 5-6 出错提示对话框 1

如果程序要更改某个文件的话,则可能出现如图 5-7所示出错提示:

图 5-7 出错提示对话框 2

以上请参考《Windows下 IntraWeb开发后的发布》这一节。

Page 324: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 6.1 系统简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 324页/共 376页

第六章 项目立项评介系统

6.1 系统简介 还没有写呢!

Page 325: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 325页/共 376页

第七章 附录 免责申明:7.1和 7.2节内容为资料性附录,内容非本人原创,从网上搜集,谢谢原创者。

7.1 IntraWeb 控件使用简要说明 注:本节参考《Delphi7下 IntraWeb应用开发详解》书中的相关章节。感谢该书的作者,该书是我

的启蒙书,作者是我的启蒙老师。再次感谢。这是一本好书,建议大家购买保留一本(以下内容稍作修改,由于平时使用时用不到这么多控件,所以没有进行一一验证,仅供参考)。 7.1.1、TIWServerController 属性:

属性 方法 AllowSubFolders 是否允许使用下级文件夹,一般设定为 true AppName 这个属性为标识此程序的唯一名称。作为 Windows 的服务程序,不能有两

个一样的 appname 出现。 AuthList 权限列表。默认情况下它是空的。一般来说,你自己可以做一个登陆界面来

控制权限,这根普通应用没有区别。不过这个属性也能实现简单的控制。它

是一个 TStrings 类型的,每一行数据的格式都应该这样:用户名=口令,注意,它是大小写敏感的。一旦这个属性非空,那么当你请求访问的时候,它

会要求你输入用户名和口令。除非验证通过,否则你会被拒绝。这个属性不

能满足复杂的验证。一般不用。 BoundIP 填写程序服务器的 IP,一般都空着,如果空着,那么自动使用 127.0.0.1 这

个 IP。 CacheDir 可以用来指定 IntraWeb 应用所需要的 cache 目录。这是程序运行时的缓存

目录,在服务器端保存各个用户的状态。 ComInitialization 当你的程序中需要使用 com、ole 等时,比如使用 ADO数据库时,你必须设

置这个属性。默认情况下它是关闭的。设置为 ciNormal或者 ciMultiThreaded 后,你才能使用 com 技术。

Port 指定端口号。如果不指定,那么将自动获得一个可用端口号,但不能保证下

次仍使用同一个端口号。所以最好指定。以上三个参数一般在 onCreate事件中填写: procedure TIWServerController.IWServerControllerBaseCreate(Sender: TObject); begin self.Port :=90;//设置程运行时的端口 self.CacheDir := self.GetAppPath + 'cache';//指定 cache目录 self.BoundIP := GetLocalIP;//自动绑定本机 IP,GetLocalIP为一个得到本机 IP函数 end;

Description 这个属性给出一个描述性文字,一般你应该设置为一个一看就明白的文字。

虽然它是一个说明,但当注册为 Windows 的服务时,它的值被作为名称来使用,因此也要注意不要重复。

ExceptionDisplayMode

有时页面上的行为可能会产生异常,一般都会报告给客户端用户。这里定义

的是信息显示的方式。默认是一个模式显示的信息框。它有四个值可选,与

Page 326: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 326页/共 376页

WebApplication.Showmessage的后一个参数相同。 ExecCmd 内部命令,只是一个字符串而已,可以任意指定。默认是“exec”。 HistoryEnabled 决定是否允许“后退”等按钮的使用。默认是“不允许”。 HTMLHeaders 这个属性设置页面头部。这里的设置将输出到每个页面。比如公司的信息、

联系电话可以放在这里。 InvalidCommandURL 这个属性设置一个 url,在使用了无效的内部命令时转向到这个 url。与

ExecCmd 有关。 RestrictIPs

IP 约束。这是安全保证的一个手段。如果为 true,那么在创建 Session 的时候会记录用户的 IP,之后,每次会话之前都要比较 IP。这样当然更加安全一些,但是那些使用“代理”软件的用户应该小心,它们的 IP 可能不停变化,这会被当作非法用户。

SessionTimeout

设置一个等待时间。因为要为每个用户创建一个 Session,如果永远保留那可是巨大的开支!因此设置一个时间,如果这么长时间里用户没有与服务器

交互,那么就认为用户已经“离开”,它的 Session 没必要再保留。这个时间如果太小,可能导致用户不能正常使用,如果太长,则需要较多资源。也

许 2个小时比较合适吧。 SessionTrackingMethod

有三个值可选:tmURL、tmHidden 和 tmCookie。因为服务器需要跟踪Session,也就是跟踪用户,因此需要将一些信息保存在客户端,当它再次与服务器交互的时候这些信息用来证明用户是合法的。可以将这些信息保存在

URL(选择 tmURL)中,页面里(选择 tmHidden)或 Cookie(选择 tmCookie)里,一般选择 tmHidden。但默认为 tmURL。

ShowResyncWarning 你知道,IntraWeb 应用是不支持“后退”的,因为它的页面之间有严密的前后逻辑关系,凡应用都是如此。如果试图刷新一个过期的页面,或者你试图

“后退”到前一个页面都是不符合逻辑的,默认情况下,此时会警告用户,

然后将当前页的最新数据给用户。但是否有必要给出警告信息,不同的人有

不同的看法,他们可以通过这个属性做出自己的决定。 StartCmd 它的作用是启动一个应用的实例。

格式是:http://host:port/startcmd默认它是空的,那么 http://host:port/就能启动一个应用的实例。它可以是任何字符串,但我建议还是空着为好。

SupportedBrowsers 这个属性设置应用支持那些Web 浏览器。 TemplateDir 模板文件所在目录。格式如下:文件夹名\,如可以填写:moban\。

如果为空,则模板文件夹名必须为 templates,也就是说,所有的 HTML 模板都要放在 templates文件夹内。

TimeoutURL 前面的 SessionTimeout 属性设置的时间如果用完,那么 Session 就会被销毁。如果之后又有请求访问这个 Session,那么显然会失败。这个属性允许你设置一个 url,当这种情况发生的时候,将跳转到这个 url 处,那里一般是一个解释性的页面,告诉用户发生了什么,以及该怎样处理。如果这个属性

为空,那么表示“无处可去”,应用将给出一个默认的信息。 方法: 方法 说明 GetAppPath 取得应用程序所在根目录路径,如:f:\project1\。记住,这最后带“\” 事件

事件 说明

Page 327: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 327页/共 376页

OnBeforeRender 可以这样理解 Render,把 IWServerController 当作一个工厂,Render 就是在产生 html代码,这样,OnBeforeRender产生的时间就很好理解了。每次页面刷新都会执行这里的代码。

OnAfterRender 就是在产生 html代码后执行。在这里再设法改变页面输出内容已经是不可能的了。因为代码已经产生好了,只等送到 IE显示了。可以执行一些服务器端代码,如关闭数据库连接等。

OnBackButton 当用户点击 IE的后退按钮时。 OnAuthRequest 声明 procedure (const AUserName: String; const APassword:String; var AValid:

Boolean) 这个事件允许你突破 AuthList 提供的简单权限管理功能。 事件的参数之一 AValid 代表验证的结果,如果为 true,表示通过。 触发时机:用户填完数据并确定,这时服务器首先查找 AuthList,如果查找到,将不会触发这个事件,如果没有查找到,则触发这个事件。一般不用,

登录界面通常都用数据库解决。 OnCloseSession 在销毁一个 Session 的前一刻触发。可以理解成当某个用户正真退出时。 OnCreate 这个事件有时候也是很有用的,特别是你使用了全局变量的时候,初始化的

工作都在这里完成。比如应用所允许的合法用户列表的构建应该在这里完成。 你必须明白,这个事件发生的时候,任何 Session 都还没有存在,没有任何TIWApplication 的实例,数据模板也不存在,如果你需要从数据库获得一些信息,如登陆人员列表信息,那么你不得不创建一个临时的数据模板对象。 必须注意的是:这个事件发生的时候,ComInitialization 的设置还没有起作用,也就是说“尚未调用 ComInitialize”。如果你此时需要使用 ADO 或者其他COM 组件,那么你可能需要亲自调用 CoInitialize 这个WindosAPI 函数。

OnException 如果你为这个事件填写了代码,那么异常将由这个事件处理,否则将调用

WebApplication.Showmessage(AException.Message) OnNewSession 声 明 : procedure ( ASession: TIWApplication; var VMainForm:

TIWBaseForm); 触发时机:在创建一个 Session 之后触发。也可以理解成当某个用户正真登录时。注意 VMainForm 是 var 型参数,这意味着你可以对它赋值。VMainForm 是应用的第一个窗口,如果你不改变这个参数,那么应用的第一个窗口就是

工程文件里 IWRun 指定的窗口。这个事件的 VmainForm 参数与TIWApplication 的 RunParams结合起来使用能够让程序象外界提供灵活的功能,好像能够象 WebSnap 应用那样向外提供若干页面似的。参考TIWApplication 的 RunParams 的说明。

7.1.2、TIWApplication 属性

属性 说明 ActiveForm 返回当前活动的窗口。只读。参考 setActiveForm 方法。 AppID 获得当前的 appID,实际上就是 SessionID。只读。 AuthUser 获得当前的用户的用户名。如果不需权限验证,那么它为空。一般不

用。 Browser TIWBrowser 类型,通过这个属性你能知道客户端是什么浏览器。它

的值是 brUnknown、brIE、brNetscape6、brOpera 等之一 Data 这是一个非常重要的属性,它主要用来保存用户数据。因为 IntraWeb

Page 328: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 328页/共 376页

应用是多线程的,因此全局变量不太合适了,应该通过这个属性将一

些数据保存到 Session 里。任何类的实例都可以给它,而你可以定义任何类。一般来说,你应该在 Session 创建的时候为 data 赋值,但是data 所指定的对象的释放是自动的不需要你写代码释放。

FileList 所有上载的文件 FormAction 简单的说,这个属性的值是页面上 form 的 action 的值。但是这个值

是不停变化的,你得到的总是变化前的。比如:你在窗口上放置一个

按钮,其中代码为: IWButton1.Caption:=WebApplication.FormAction;运行程序,页面出来了 , 此 时 页 面 上 的 form 的 action 的 值 是 :

"/EXEC/1/14FCDD00E4693473EB66E240"。点击你的按钮,按钮的标题也就显示为/EXEC/1/14FCDD00E4693473EB66E240,但此时页 面 上 form 的 action 的 值 已 经 变 成 :

"/EXEC/2/14FCDD00E4693473EB66E240"了,因为 trackID 变化了。 FormCount Forms 所包含的窗口个数,包括部分数据模板。 Forms 包括所有的你创建的窗口或者数据模板,只要它们还没被销毁。 IP 当前请求所携带的 IP,也就是当前用户的 IP。 LastAccess 最后一次访问的时间。 Response 将要发给客户端的信息。参考 Request RunParams 如:

http://www.atozedsoftware.com:4000?param1=value1&param2=value2 问号之后就是两个参数(格式:参数名=参数值) 。 这个属性也许能够用来实现一些特别的功能,考虑外部某个页面连 接到我们的应用这种情况,也许那个页面希望传过来一些参数。我 们在这边就可以借助这个属性,获得那些参数,然后做出不同的响 应。比如:我在 formMain 的 create 事件里填写这样的代码: procedure TformMain.IWAppFormCreate(Sender: TObject); var i:integer; begin with WebApplication.RunParams do begin i:=IndexOfName('IWButton2'); if i>=0 then if ValueFromIndex[i]='yes' then IWButton2.visible:=true else IWButton2.visible:=false; end; end; 上 面 代 码 将 对 http://127.0.0.1:82?IWButton2=yes 和

http://127.0.0.1:82?IWButton2=no 做出不同的响应。 参考附录。

Terminated 判断当前的应用实例是否已经停止。只要曾经调用过 Terminate, 或者已经超时,那么都将返回 true。

TerminateMessage 如果调用 Terminate 时使用了参数,那么这个属性返回那个参数的 值,否则返回空。只读。

Page 329: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 329页/共 376页

TerminateURL 如果调用的是 TerminateAndRedirect 而不是 Terminate,那么将返回 转向所去的 url。如果调用的是 Terminate 就返回空。只读。

TrackID 这个属性说来话长,你只要知道它是用来跟踪用户就可以了,它是 自动产生的,每次交互它都自动增长。只读。

URLBase 就是相对 url 的参照。如果是 standard alone 那么为空,如果是 ISAPI应用,则是 dll 的 url。

方法 方法 说明

AddDataModule 向应用中登记一个数据模板。从这个属性可以看出,数据模板跟窗口

一样可以直接被 WebApplication 拥有并管理,不一定要使用WebApplication.data。 另 一 方 面 , 只 有 通 过 这 个 方 法 登 记 的 模 板 才 会 被WebApplication.forms 和WebApplication.formCount 管理。

MarkAccess 它影响属性 LastAccess。你不会调用它,它仅仅供内部使用。 RemoveDataModule 与 AddDataModule 相反。 RemoveForm 从用户的活动窗口列表中将窗口删除。 SendFile 声明:

procedure SendFile(const APathname: String; AContentType: String; AFilename: String; const AAttachment: Boolean); 将磁盘上一个文件发给客户端,客户端会出现对话框询问保存位置。

用于下载文件。 参数说明: APathname:路径,可包括也可以不包括文件名,当它不包括时需要在AFilename 参数里指定。 AContentType:这个参数用来指定文件类型。不知道这个参数可以怎样设置。 AAttachment:这个参数如果为 true 将不考虑忽略AContentType 参数。

SendStream 将一个流作为文件发给客户端。参考 SendFile SetActiveForm 将一个窗口设置成当前窗口,相当于调用这个窗口的 Show。 ShowMessage 在客户端显示一个消息。声明

procedure ShowMessage(AMsg: String; const AType: TIWShowMessageType; ATemplate: String); 参数说明: AMsg: String;就是你要显示的消息。 AType: TIWShowMessageType;指定显示的方式。它有四个值: smNewWindow :表示在一个新窗口显示。新窗口有个“OK”按钮,点击它新窗口关闭。其实新窗口关闭不关闭都不影响我们的应用。 smSameWindow:在当前窗口显示消息,此时窗口上有显示的消息与一个“OK”按钮,没有别的内容,点击按钮回到前一个页面。 smSameWindowFrame:与 smSameWindow 几乎一样只是消息在一个方框中。 smAlert:消息以一个模式显示的弹出窗口显示,必须关掉这个窗口才能回到刚才的页面。默认值。 ATemplate: String = '';这个参数可以指定一个模板文件,以便格式化的

Page 330: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 330页/共 376页

显示消息。这个参数值有消息在当前窗口显示时( 即 smSameWindow 与 smSameWindowFrame 时)才有效。如果没有指定这个参数, 那么将试图使用系统模板 IWShowMessage.HTML,如果它存在的话。 参考示例 Features 的 ShowMessage。

Terminate 结束当前 Session,也结束了当前应用实例。如果指定参数,那么参数的信息将显示给用户。

TerminateAndRedirect 结束当前 Session 并转向到一个 url。参数指定 url。 7.1.3、TIWForm 属性 属性 说明 ActiveControl 指定一个活动控件。与 Tform 的这个属性的意义一样。

实现的方法是在页面上的初始化部分,调用这个控件对应的 HTML 元素的 setfocus()。

Background 复合属性。指定页面的背景,一个图片。 BackgroundColor 指定页面的背景颜色。如果设置了 Background,那么这个属性被忽略。 ExtraHeader 这个属性允许你为页面的 head 部分写一些 HTML 代码,可以包含

JavaScript 代码。 HandleTabs 普通应用中经常有这样的要求,即 tab 的顺序是被要求的。

页面上也能如此?IE 没有问题,NS 需要客户端代码控制。 HiddenParams 通过这个属性,你可以让窗口替你保存一些数据。实际上这些数据是

保存在页面上的,每一个参数对应一个 hidden 类型的 input 元素。 这个属性以及 Params 对 TIWPageForm 尤其重要。

JavaScript 这里你可以填写一个写 JavaScript 代码,比如定义一些函数,以便你在控件的某些事件里调用它们。

LinkColor 设置页面上热连接的颜色。 Released 是否调用过 release 或者 free。 Params 读取从客户端携带来的参数。这些参数对应页面上的所有input 元素

(包括隐藏的)以及textarea、select 等元素。但是IW_Action 和IW_ActionParam 却不在Params 里。我原以为这个属性只读,但实际上也可以通过它保存数据,对它写入时,它相当于HiddenParams。 这个属性以及HiddenParams 对TIWPageForm 尤其重要。与HiddenParams 比较它包含的信息更多,HiddenParams 只包含隐藏的信息。 参考 HiddenParams。

ScriptFiles TStrings 类型,每行指定一个js 文件,必须指定文件的url。 应该保证它们不重复。如果用 AddScriptFile 来添加,那么将能够保证不会重复。

ShowHint 是否显示各个控件的提示信息。只影响其属性 ParentShowHint=true 的控件。

StyleSheet 指定样式表。IntraWeb 大量的使用了 CSS,也鼓励你使用它们。你可以通过 url 或者 filename 指定样式表的位置,如果用 filename,文件必须在子目录 files 中。

SupportedBrowsers 指定支持哪些Web 浏览器。

Page 331: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 331页/共 376页

TemplateProcessor 指定布局管理器。 TextColor 指定页面上文字的颜色。各个控件都可以设置自己的文字颜色。如果

各个控件的文字的颜色是默认颜色(即 clNone),那么将使用窗口的TextColor 指定的颜色。

Title 给出一个标题。 VLinkColor 指定被点击过的连接的颜色。 WebApplication 这个属性是当前应用的引用。这个属性提供了很多方便。 方法 方法 说明 AddScriptFile 增加一个js 文件。

一般在窗口的onCreate 事件里使用这个函数。 等同于 ScriptFiles.Add,但这个方法能够保证 ScriptFiles 里没有重复的内容。

AddToInitProc 填写在这里的JavaScript 代码将出现在页面上的Initialize 函数里。 一般在窗口的onCreate 事件里使用这个函数。 这里增加的内容,用完立即清除。因此有时候需要重复调用。

AddToIWCLInitProc 填写在这里的 JavaScript 代码将出现在页面上的 InitIWCLObjects 函数里。一般在窗口的 onCreate 事件里使用这个函数。

AddValidation procedure AddValidation(const ACondition: String; const AMsg:String); 指定一个条件和一个消息。当条件满足的时候将显示该消息。 例:AddValidation('SubmitForm.IWEDIT1.value>100','太大了! '); 页面在提交之前会调用页面上的Validate 函数。而这个函数实际是产生Validate 的内容。例子产生的Validate 的内容是: function Validate() {if(SubmitForm.IWEDIT1.value>100) {window.alert("太大了!");return false;} return true;} 一般在窗口的onCreate 事件里使用这个函数。 用这个方法添加的内容,输出以后立即清除,因此有时候需要重复调

用它。 CacheImage 缓存一个图片,在页面上缓存。

一般页面上引用某个图片直接用src 指定,浏览器自动下载它并管理,但在客户端你不知道图片在哪里。如果你打算对它控制,比如你打算

用两个图片表示两个状态并且状态频繁变化,而你不想频繁访问服务

器,那么就需要将图片缓存到变量里,以提高速度。 procedure CacheImage(const AName: String; const AURL:String); 参数说明: AName:指定一个变量名称,以便在客户端访问它,实际上在页面的名称= ‘GImageCache_’+ AName 。在客户端‘GImageCache_’+ AName 这个变量就对应着一个图片。 AURL:指定图片所在的url。

Page 332: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 332页/共 376页

Scriptfile 如ScriptFile('/files/test001.js'); 返回字符串: <script language=JavaScript src="/files/test001.js"></script> 注意:/files/test001.js 必须已经通过AddScriptFile 加入进来了。

事件 事件 说明 OnAfterRender 发生时机:在窗口已经产生 HTML 文本之后,发送给客户端之前。

每次刷新页面都执行。 OnCreate 当窗口生成时,最早执行的一个!页面刷新时不再执行。 OnDefaultAction 一般,各个控件都有自己的事件来处理提交自己的数据。但是你未

必为它们填写代码。当用户提交了数据,而且没有事件来处理的时

候,就用这个事件来处理——如果你为这个事件填写了代码的话。 这个事件的触发有两个时机: 1 如果用在页面上的文本框(TIWEdit)里回车,那么可能触发这个事件。为何是“可能”?因为如果你为TIWEdit 的onSubmit 事件填写了代码,那么就不触发这个事件; 2 窗口的一个按钮的 ButtonType=btSubmit,而且这个 onClick没有代码,那么点击这个按钮也触发这个事件。

OnDestroy OnRender 在窗口产生HTML 文本之前触发。 7.1.4、TIWControl 属性 属性 说明 Align 指定控件在窗口上的位置。这与非 IW 控件一样。 Anchors 控件定位自己时的依据:相对它父亲的四个边界的哪几个。

一般依据左边和上边就可以了。如果四个都选中,那么父亲大小将

影响它的大小。这与非 IW 控件一样。 Canvas 这个属性仅仅一般在设计时起作用,开发控件的时候,你用它来构

造设计时你控件的外观。控件的这个属性在运行时无效。 Caption 标题 Color 自己的底色 ControlEncode DesignMode 这个属性告诉你,现在是设计状态还是运行状态。 ExtraTagParams 这个属性需要解释一下。每个控件都要输出一个 HTMLTag,一般

的 HTMLTag 都有一些参数,如 name,id,style,class,onClick 等。一般,一个 HTMLTag 并不指定全部参数,或者因为其他原因,用户需要增加一个参数,只要你需要为控件输出的 HTMLTag 增加参数,那么就可能需要这属性了。直接填写就行了,格式应该是:

ParamName=ParamValue。每行对应一个参数。 Font 指定控件的字体。与非 IW 控件不同的是它可以通过它的子属性

CSSStyle 指定使用哪个样式定义。参考 TIWForm 的 StyleSheet。另外,Font.Style 允许你直接指定一些具体设置,此属性可以代替简单的 StyleSheet。假如同时制定了这两个内容,并且二者有重复,

Page 333: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 333页/共 376页

Font.Style 的设置优先。 Form 通过这个属性可以知道控件所属的窗体。 FriendlyName 这个属性提供一个友好的名称,在数据验证没有通过时弹出的消息

框上使用。一般,页面提交之前会验证页面上的数据是否合理,如

果没问题就提交,否则会报告说:某某的数据有什么什么问题,如

TIWEdit,如果它的属性 required 为 true那么如果没有输入数据,提交时会说“XX is required field”,其中的 XX 就是 TIWEdit 的FriendlyName。

HTML 这个属性返回控件的 HTMLTag 对象。访问这个属性,意味着调用控件的 RenderHTML 方法。

HTMLName 元素在页面上的名称 RenderSize 这个只读属性用来判断:设计时控件的大小是否决定了页面控件的

大小。只读。 ScriptEvents 控件在客户端可能支持若干事件( 见控件的

SupportedScriptEvents),其中一些事件有对应的服务器事件。我们分三种情况讨论。1 只写了服务器端事件,那么当客户端事件发生时,将调用服务器端的事件;2 只写了客户端事件,那么当客户端事件发生时与服务器没关系,执行的是客户端代码。请注意,此时

客户端的事件里的代码没什么限制,可以随便写;3 在服务器端和客户端同时为同一个事件写了代码,那么执行哪个?如何执行?这

种情况下,客户端代码只能是一个布尔表达式,首先在客户端执行

这个表达式,如果该表达式返回true 那么接着触发服务器端的事件,否则就此结束。实际上是允许你做一个判断,看看是否需要执

行服务器端的事件。 对于第3 种情况有个限制,就是客户端代码只能是一个表达式。2 没有这个限制。对于这种限制,也有扩展的办法,因为表达式里可

以使用自己定义的函数,因此你可以写一些函数放在窗口的

JavaScript 里,然后在表达式里调用它,这就突破了这个限制。 另外,IntraWeb 对ScriptEvents 里的客户端代码有个共同的限制: 如果表达式中需要字符串常量,那么请使用单引号,不要使用双引

号,因为双引号有可能会引起冲突。 ScriptFiles 如果控件需要的 JavaScript 在某个文件里,可以将文件的 url 加入

到这里,这要用到 AddScriptFile。一般在控件开发时用到。对于每个 url , 页面上会出现类似<scriptlanguage=JavaScript src="…"></script>这样的语句。

ShowHint 略 SupportedScriptEvents 通过这个属性我们能够知道该控件在客户端支持哪些事件。

这是一个字符串,包含用逗号隔开的若干事件名称。如果字符串为

空,那么将不支持任何事件。 这是一个只读属性,它与内部变量 FSupportedScriptEvents 对应。

Text 一般,控件在输出 HTML 文本的时候,都把 text 作为 HTML元素的 value 输出。

UseFrame 是否使用 frame。使用 UseFrame 的好处之一是会得到两个滚动条,表格有时需要这样。但是那样将要创建临时文件,而临时文件需要

Page 334: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 334页/共 376页

手工清除。 Visible 决定是否在页面上可见。如果该属性设置为 false,那么 IntraWeb 将

忽略它。 WebApplication 这个属性相当有用,因为通过它你可以访问整个工程里的任何数

据。 ZIndex 这个属性跟 CSS 有关。当几个控件重叠的时候,从底到上有个顺

序,这个属性将决定这个次序。数字大的在上面。当然,如果控件

之间没有重叠,那么它们的这个值也就没什么用。 方法 方法 说明 AddScriptFile 参考ScriptFiles。通过这种方法将一个文件的 url 加入到ScriptFiles,

如果同样的 url 已经存在,那么不会重复加入的。与 TIWForm 的AddScriptFile 相比,控件的 AddScriptFile 只有在 RenderHTML 函数使用才有效,因为 RenderHTML 之前总是清空它的设置。

AddToInitProc 同 TIWAppForm。但是只有在 RenderHTML 函数里使用才有效,因为在调用 RenderHTML 之前总是清空它上次的设置。

AddToIWCLInitProc 同 TIWAppForm。但是只有在 RenderHTML 函数里使用才有效,因为 RenderHTML 之前总是清空它的上次的设置。

AddToJavaScriptOnce 同 TIWAppForm。但是只有在 RenderHTML 函数里使用才有效,因为 RenderHTML 之前总是清空它上次的设置。

ColorToRGBString 这个函数将 integer 类型的一个颜色值,转换成 RGB 字符串,以便放在页面上。

HTMLColor 起转化作用。 Invalidate 这个方法仅仅在设计时被调用,用来重画自己。 RenderCSSClass 它产生的实际上是一个规则。规则包括规则名和规则定义,其中的

规则定义是调用 RenderStyle 得到的。 RenderHTML 产生自己主要的 HTML 文本。各个控件必须 override 它。 RenderStyle 产生一个规则定义的具体内容,它应该被各个控件override。 SupportsSubmit 这个属性决定这个控件是否支持提交。

只读,与 FSupportsSubmit 对应。 ToJPEGFile 将指定的图片转化成jpeg 格式并保存到指定的位置。

如:ToJPegFile(FPicture.Graphic, LPathname) 事件 事件 说明 OnHTMLTag 这个事件在你的控件的 RenderHTML 执行完毕之后,也就说产生

了它的 HTMLTag 之后,但在被装配到页面之前,触发它。目的是让你有机会修改产生了的 HTMLTag。

7.1.5、TIWButton 这个控件在页面产生一个按钮。它等价与普通窗口的TButton 控件。对于这个控件,一般来说最关

心的是它的onClick 事件和Ajax事件。 属性 属性 说明 ButtonType 这个属性有三个值:btButton、btSubmit、btReset。默认是btButton。

Page 335: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 335页/共 376页

如果为控件的onClick 填写代码,那么该设置不起作用;如果不填代码,那么点击它时,对应着三个值发生的行为: btButton 什么也不做; btSubmit 如果窗口的ondefaultAction 事件有代码,那么提交数据并执行该事件,否则什么也不做; btReset 恢复数据的原始设置。

Confirmation 这个属性用来设置一个确认信息,比如:“你确定要删除吗?”。当

点击按钮时,如果这个属性不空,那么先出现一个问答,如果回答

“否”,那么什么也不做,如果“是”,触发服务器端事件。注意:

如果没有填写 onClick 事件,那么这个属性没有意义。 DoSubmitValidation 这个属性决定是否验证其它的控件的数据是否有效。这个属性默认

为 true,当为 true 时,在客户端执行一个叫做 Validate的函数。很多控件影响 Validate 的内容,如 TIWEdit 控件,当它的 required 属性为 true 的时候,它影响 Validate 的内容。

Hint 、Showhint 、 parentShowhint

这三个属性跟普通控件一样,分别表示:提示信息、是否提示、是

否使用父亲的 Showhint 决定自己的 Showhint。Hint的值对应页面上元素的 title 参数。

ScriptEvents 这个属性允许你为该控件的客户端事件写JavaScript 代码。 TabOrder 这个属性决定页面上元素的 tab 顺序。 事件 事件 说明 onClick 点击时触发,服务器端执行。整个页面会被刷新。 OnAsyncClick Ajax事件,异步执行。发送到服务器执行但不刷新整修页面,只是

页面的局部刷新。单击时执行,如果此时有 onClick事件,则 onClick事件会被忽略。

OnAsyncDoubleClick 同上。当双击时执行。 OnAsyncEnter 同上。当焦点进入到按钮时执行。 OnAsyncExit 同上。当焦点离开按钮时执行。 7.1.6、TIWCheckBox 属性 属性 说明 checked 这跟 TCheckBox 的这个属性没什么区别。 Editable 默认为 true,当为 false 时,相当于客户端不能改变它的 checked 属

性的值。 Style 这个属性有两个值可选择: stNormal 和 stCool 。默认为 stNormal,

此设置下的 checkBox 就是常见的普通样式,如果设置为 stCool,则样子略微好看些,因为它用两个图形表示两个状态。

事件 事件 说明 onClick 点击时触发,服务器端执行。整个页面会被刷新。 OnChange 当选择状态发生改变时,,服务器端执行。整个页面会被刷新。 OnAsyncChange 以下为 Ajax 事件,异步执行。发送到服务器执行但不刷新整修页

面,只是页面的局部刷新。当选择状态发生改变时执行。

Page 336: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 336页/共 376页

OnAsyncClick 同上。当点击时执行。 OnAsyncEnter 同上。当焦点进入到按钮时执行。 OnAsyncExit 同上。当焦点离开按钮时执行。 OnAsyncKeyDown 同上。当有键盘某个键按下时执行。 OnAsyncKeyUp 同上。当有键盘某个键放起时执行。 OnAsyncKeyPress 同上。当有键盘某个键按下并放起时执行。 OnAsyncMouseDown 同上。当鼠标按下时执行。 OnAsyncMouseMove 同上。当鼠标在该控件移过时执行。 OnAsyncMouseOver 同上。当鼠标移动到该控件上时执行。 OnAsyncMouseOut 同上。当鼠标从该控件上移走时执行。 OnAsyncMouseUp 同上。当鼠标放起时执行。 7.1.7、TIWEdit 说明:以OnAsync为前缀的事件均为Ajax事件,其基本含意与上类似,以下控件中不再赘述。 这个控件与TEdit 对应,在页面上产生一个单行编辑框

属性 属性 说明 BGColor 这个属性等同于 Color。 Required 这属性如果为true 那么表示必须为这个控件填一个非空的值。这在页面

数据有效性验证的时候验证。 实际上,当该属性为 true 的时候,TIWEdit 将调用窗口的 AddValidation 来影响客户端 Validate 函数的内容。

Editable 与 readonly 这两个属性并不重复,如果 Editable 为 false,则相当于一个 label,无法编辑,不论 readonly 如何,肯定“只读”。如果 readonly为 true,而 editable 也为 true,那么虽然不能修改数据,但是保留了编辑框,光标也能停在里面。另外,即使 readonly 为 true,而且 editable 为 false,你在它上面回车仍然能够触发服务器端的 onSubmit 事件,这有点可笑。

Passwordprompt 如果为 true 表示该编辑框用来输入口令的,自然不会显示其内容,而是显示星号。当然,当控件的 editable 为 false 时,这个属性就无效了。

事件 事件 说明 onSubmit 当光标停在这个控件上,如果回车,则触发这个事件。 7.1.8、TIWComboBox 这就是页面上的下拉框了。

属性 属性 说明 items TStrings 类型的。不用解释了。 ItemIndex 这属性表示当前值是列表 items 中的第几个。 ItemsHaveValues 如果 items 的每行里都有等号,那么是将每行仅仅理解为字符串,

还是理解为 name=value?如果这个属性为 true,那么理解成name=value。另外, 如果这个属性为 true , 那么也起到“RequireSelection=true”的作用。

NoSelectionText 一般,下拉选择框的第一条是“-- No Selection --”,它表示什么也没选择。你可以通过这个属性改变这个字符串,比如:“不选”。

Page 337: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 337页/共 376页

RequireSelection 这个属性为 true 时,表示必须做一个选择,而且不能是NoSelectionText 的值。这个属性为 true 的时候, 除非 ItemIndex= -1,否则 NoSelectionText 的值不会在客户端看到,容易理解:一旦选择了一个有效值并生效了(到达过服务器),再也无法“ 什么也不选了”, 因为你再也看不到“NoSelectionText”了。

Text 当ItemsHaveValues=false 时,这个属性的值就是用户看到的内容; 当 ItemsHaveValues=true 时,这个属性的值不是用户看到的字符串,而是相应的 value。

Sorted 该属性决定是否按 items 的每个字符串(或者 name=value 中的name)排序。

事件 事件 说明 onchange 当客户端选择另外一个值时,这个事件触发。 7.1.9、TIWListbox 属性 属性 说明 MultiSelect 该属性决定是否允许多选。 Selected Selected[]:Boolean 用来判断哪些被选中(需要一个循环)。 useSize 这是个布尔类型的属性,决定页面上的大小是否跟设计时一样。默

认为 false,此时宽度是自动的(以适应最长的一行为准);当该属性为 true 时,页面上的大小跟设计时完全一样。这是用 CSS 时实现的,如果你留心,你发现 useSize=false 时,样式定义只指定了left 与 top 的值(注:此时的高度由 select标记的 Size 决定),当useSize=true 时,还指定 width:和 height。

事件 事件 说明 onchange 当客户端选择另外一个值时,这个事件触发。 7.1.10、TIWLabel 属性: 属性: 说明 caption 这个控件的内容值。 rawtext 这个属性为true 时,表示caption 里的内容是HTML 文本。

这个属性在后面的控件中还会讲到。参考 TIWText 和 TIWURL。 7.1.11、TIWImage 这个控件用来显示一个图片。它的工作原理是这样的,当需要它产生HTML 文本的时候,它将产生

一个jpeg 图片作为临时文件保存在\cache 目录下,然后在引用它。当然,它能保证每次产生的文件的名称绝对不会重名,也不会冲突,这个你不用担心。不过它不负责清除这些临时文件,而且“产生”的

过程也要耗用资源,所以这样的方式其效率肯定不是很好。不过它非常灵活,非常方便。主要用于动态

图形处理。 属性: 属性: 说明 atlText 这个属性对应页面上 img 元素的 alt 参数。当图像无法显示时,显

示给用户的一个文字内容。对于 TIWImage 来说,这个属性没什么

Page 338: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 338页/共 376页

用,因为 TIWImage 将图片保存在程序内部(作为资源),不会出现这样的问题。当然,如果程序动态控制,或者客户端禁止图片,

那就是另一回事了。 autoSize 这个属性我们早就熟悉了,但在 IntraWeb 的控件里,一般它只决

定设计时的大小,假如这控件的另一个属性 useSize 为 true,那么autoSize 也影响页面上元素的大小。

Picture 同 TIamge 的这个属性一样。你可以动态的控制它,以达到动态效果。这个属性非常重要,是这个控件的核心。

JpegOptions 这是一个复合控件。当 load 的图是 bmp 格式的时候有效。 CompressionQuality 压缩质量,与压缩率成反比。这个值如果很高,那么图形的质量就

不错,代价是文件会大一些,反过来,这个值如果很低,那么产生

的文件就很小,但图形效果就不怎么样了。 Performance 这个属性两个值:jpBestQuality 和 jpBestSpeed。前者主要考虑图

形的质量,后者主要考虑显示图形的速度。 ProgressiveEncoding 如果这个属性为 true,那么客户端显示图片是渐进的显示,也就是

一边下载一边显示。浏览器显示图片默认是渐进显示,但只有那些

包含“渐进编码”的图形才能渐进显示。这个属性为 true 时,输出的数据包含这个信息。

Smoothing 平滑处理,只有 JpegOptions. ProgressiveEncoding =true 它才有意义。

usesBorder 决定页面上的图形是否有边框,当为 true 时,页面上的该元素将有 border 参数,其值为 1。

事件 事件 说明 OnClick 这个事件与按钮的 onClick 一样,只是,如果你为 TIWImage控件

填写 onClick 事件,那么它在页面上就是一个带有热连接的图形。该事件与 onMouseDown 互斥。

onMouseDown 这个事件发生在用户的鼠标按下的时候。这个事件与 OnClick相比多了两个参数 ax 与 ay,它们表示鼠标按下的位置,其位置是相对自己右上角的相对位置,也就是内部位置。这个事件与 OnClick 互斥。

7.1.12、TIWImageFile 这个控件也是为了让你在页面上显示图片。它的原理是直接从url 处获得图片,而你必须指定它的

URL。因为浏览器直接从url 处获得图片,因此相比较TIWImage 要迅速多了,而且没有临时文件的问题。 属性 属性 说明 imagefile 复合属性。 URL 这个属性用来指定图片的位置,这个属性的值直接给了页面上该元

素的 src 参数。 filename 这个属性会令人迷惑,好象可以指定本机上任何位置的图片。

的确,在设计时,你可以指定任何位置的图片,而且在设计时你也

能正常的看到,但是运行起来不是这样。前面说过,这控件必须指

Page 339: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 339页/共 376页

定 url,当你通过 filename 指定一个图片时(先不管路径,假设文件名称为 image1.gif),实际上页面上元素的 src 的设置是"/files/image1.gif",因此你必须将那个图片拷贝到 files 子目录下才行,注意必须是 files 子目录,其它名称的子目录不行。从这一点可以看出,这个控件实际需要的是一个 url,这样浏览器可以直接从 url获得图片。

事件 事件 说明 OnClick 这个事件与 TIWImageFile 的 onClick 一样。 onMouseDown 这个事件由于 Picture 不能使用也毫无意义——得到坐标又如

何?,你又不能操纵 Picture。 7.1.13、TIWMemo 注意:这个控件的text 与它lines.text 是两回事。

属性 属性 说明 lines 这个属性当然用来填写文本的了,没什么可说的。 Editable 这个属性已经在介绍别的控件的时候说明过,但对这个控件还是有

必要说明一下。如果你将这个属性设置为 false 那么你在页面上的确不能修改它了。你可能以为此时页面上该元素可能有 readonly 选项,其实不是,实际上此时这个控件输出的不是 textarea 标签,而是 iframe 标签。当然,同样有滚动条,不看源代码真分辨不出来。不过为什么要这样麻烦呢?还要用临时文件!不要以为开发者傻,

其实这样做是有目的的,这是为了 rawtext 属性 rawText 这个属性在介绍 TIWLabel 的时候已经介绍了。现在你试一试这个

控件的这个属性是否管用?你发现,如果 editable=true那么这属性不起作用,只有 editable=false 的时候才有用。这也符合逻辑,难道你打算在页面上修改 HTML 文本吗?

Readonly 这属性也介绍过了。如果 editable 为 true 那么它对应 textarea标签readonly 选项,否则,它决定临时文件的内容。

7.1.14、TIWText 这个控件的用途就是显示一段文字。它的RawText 比其它控件的RawText 要出名得多,因为这也是

它的主要用途之一,但我们也看到,别的控件也能起到这个作用。如果这控件的useframe=true 那么它相当于editable=false 的TIWMmemo。它的属性WantReturns=true 时,设计时的换行在页面上起作用。当RawText=true 时此属性无效。 7.1.15、TIWFile 这个控件用来上载文件用的,它产生一个type="FILE"的input 元素,这样在客户端可以输入/浏览文

件。在服务器端,可以使用这个控件的SaveToFile 或者SaveToStream 将文件保存,也可以通过FileData访问其中的文件。 7.1.16、TIWURL 这个控件用来定义热连结,使得用户点击它能够跳转到另一个页面上去。这个页面是外部的一个页

面,通过该控件的url 属性来指定。如果要从当前页面跳到内部的另一个页面上去,那么应该用TIWLink 控件。 属性 属性 说明

Page 340: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 340页/共 376页

URL 指定跳转目标。 假如url 的头部是http://,比如http://news.sina.com.cn,那么该控件的输出大致是这样: <a href="#" onClick="parent.LoadURL('http://news.sina.com.cn')" id="IWURL1" class="IWURL1CSS">IWURL1</a> 如果头部不是http://,比如/image1.jpg,输出应该这样: <a href="/image1.jpg " id="IWURL1" class="IWURL1CSS">IWURL1</a> 当然,这里假设UseTarget=false。 这里有个问题,也是比较严重的问题:当 url 的头部是 http://时,用户在页面上点击它工作很正常,但那些喜欢使用“在新窗口打开”的用户

会恼火。此时建议使用 TIWLabel 控件。 TargetOptions 当属性 UseTarget=true 是,该属性在起作用。参考 TIWURLTarget TerminateApp 决定跳转之后,是否结束当前Session。

这个属性对AppMode 适用。当跳转到外部的一个url,比如http://news.sin a.com.cn,而且是在当前窗口打开该url(即UseTarget=false),那么会出现什么情况呢?当然不是说发生什么错误,但是根据前面的知识我们知

道两个事实:1、我们无法回到我们的应用中来了(参考AppMode下的“状态管理”); 2、在Session 超时之前,服务器端与该客户端对应的Session 还存在。很显然,从节约的角度考虑应该结束该Session。 如果该属性为true(同时UseTarget=false),设置url 为: http://news.sina.com.cn 那么TIWURL 控件的输出应该是这样: <a href="#" onClick="parent.LoadURL('/STOP/A0CCE000FE301BEABA65E240/news. sina.com.cn')" id="IWURL1" class="IWURL1CSS">IWURL1</a> STOP 命令结束了sissionID=A0CCE000FE301BEABA65E240 的Session, 然后转向到 http://news.sina.com.cn。

UseTarget 决定是否用新窗口打开目标。 7.1.17、TIWURLTarget 当TIWURL 产生的连结要在新窗口打开的时候, 该控件( 对应TIWURL 的TargetOptions 属性)

用来定义目标窗口的大小、位置和外观。该控件不可能单独使用,必然是通过TIWURL 来使用它。 属性 属性 说明 Height、Top、Left、Width 定义窗口的大小和位置。 Resizable 指定窗口是否可以改变大小。 Scrollbars 指定窗口是否有滚动条。 Toolbar 指定窗口是否有工具栏和菜单 WindowName 指定窗口的名称。 7.1.18、TIWLink 这个控件也是用来“从一个页面跳到另一个页面”。但它跳转的目标却是应用内部的另一个窗口。

它的关键是它的onClick 事件,也就是说跳转动作在onClick 事件里完成,比如:

Page 341: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 341页/共 376页

procedure TformMain.IWLink1Click(Sender: TObject); begin form1.Show; end; 就跳转到form1 去了。

7.1.19、TIWRegion 这个控件很特别,TIWControl 不是它的祖先,它也不输出什么,可以说它不是真正IntraWeb 控件。 这个控件是一个容器,它的用法与Tpanel 相似。 可以将一些控件放入其中,然后它们将作为一个整体,这样移动它们就很方便了。 你还可以看到它的两个滚动条。这个控件的意义是方便设计时的工作,它什么也不输出。

7.1.20、TIWRectangle 这个控件可不是容器,它仅仅产生一个矩形并带有一个文本而已。实际上这个矩形是表格的一个单

元格。 7.1.21、TIWGrid 首先说这个控件用来产生一个表格。表格是一个很复杂的东西,如果手工写HTML文本,你会发现

它的确够复杂。好在你肯定不会去手工写HTML,因为有许多可视化的工具。即便如此,如果希望做一个有特色的表格,还是需要设置许多属性。 如今TIWGrid 将怎样工作呢?我们用Delphi 怎样控制呢? 这个控件的关键属性是cell,它是二维数组,每个cell 代表一个单元格,因此只要为各个cell 指定数

据就可以了,一个表格也就完成了。之后,对于每个非空的cell,都触发事件onRenderCell,在onRenderCell 里你还有机会修改cell 的内容,如text、Color、control等。

TIWGrid 收集了所有单元格的HTML 文本后,形成了自己的HTML 文本。 属性 属性 说明 BGColor 指定背景颜色。 BorderColors 复合属性。 Color 这个属性用来指定表格的表格线的颜色之主色。 Dark 这个属性用来指定表格的表格线的颜色之背光色。 Light 这个属性用来指定表格的表格线的颜色之向光色。 borderSize 即表格线的宽度,对应 table 标签的 border 参数。 borderStyle 指定四个外围的边框显示哪几个,默认是都显示。注意,这个属性设置

的整个表格的外围的四个边框的可见性,不影响表格里面的线的可见

性。参考 lines。 cellPadding 指定 cell 中的数据离 cell 的边框有多远。以像素为单位。 cellSpace 指定 cell 之间的距离。以像素为单位。 columnCount 指定表格有多少列。注意,将来访问 cell 的时候受此属性约束。 Lines 这个属性用来决定表格里面的线的可见性。如果它的值为 tlNone 并且,

borderStyle 为 tfVoid ,那么 borderColors 和 borderSize 的值就毫无意义了。

Summary 这属性对应table 标签的子标签summary。但是5.0.43 版本时,它不起作用,因为它的代码写错了,它总是输出caption 的内容,因为它的代码写错了,下面是TIWGrid 的RenderHTML的部分代码: Result.Contents.AddText(iif(Caption, '<CAPTION>' + Caption +'</CAPTION>'));

Page 342: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 342页/共 376页

Result.Contents.AddText(iif(Summary, '<SUMMARY>' +Caption + '</SUMMARY>')); 后一句应该为: Result.Contents.AddText(iif(Summary, '<SUMMARY>' +Summary + '</SUMMARY>'));

Cell 这个属性用来访问 TIWGrid 的每个单元格,比如 cell[row,col]。每个单元格都是一个 TIWGridCell 类型的对象。这类非常重要。

方法 方法 说明 CellExists 这个方法的声明如下:

CellExists (const ARow: Integer; const AColumn: Integer):Boolean; 这个方法用来判定某个单元格是否有效。它首先判断给定的两个参数是

否超界,其次判断单元格是否为空。单元格的创建是自动的,但是如果

某个单元没什么用处的话,那么 TIWGrid 将不创建它。没什么用处?什么意思呢?至少曾经被访问过才算有用,比如给 text 赋值,或者改变颜色等。没有用处的单元格也不会触发 onRenderCell 事件。

Clear 不要以为这方法将清除表格的内容,实际上它好像没什么用处,虽然

TIWGrid 为它写了代码,可是那还要看每个 cell 的 control 的 clear 是否干活。

DeleteColumn 删除一列 DeleteRow 删除一行 事件 事件 说明 onRenderCell 这个事件非常重要,因为它是你的代码介入以完成单元格的设置的一个

机会。 表格输出 HTML 文本之前,触发所有它认为有必要的单元格的这个事件。

onCellClick 当客户端在表格的单元格上点击时触发。但这个事件跟每个单元的

clickable 有关。 7.1.22、TIWGridCell 属性 属性 说明 Alignment 略 BGColor 略 Clickable 指定用户点击这个单元格是否触发表格的 onCellClick 事件。 Control 这个属性很有用,也是灵活的地方,你可以为单元格指定一个对象用来

处理单元格里的数据。比如,如果表格需要编辑数据,那么可以创建一

个 TIWEdit 对象给这个属性。参考示例 feature 中的 editablegrid。 DoSubmitValidation 参考TIWButton。 Font 略。 Text 这是 cell 的数据。 VAlign 表示数据的纵向位置:靠上、靠下、居中。取值为:

vaMiddle, vaTop, vaBottom, vaBaseline。

Page 343: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 343页/共 376页

Wrap 决定是否折行。 7.1.23、TIWTreeView 在网页上放置一个树,展开、缩放、以及点击的处理,那需要很多工作,但现在,你在一分钟内可

完成从前半小时的工作。 属性 属性 说明 items 这个属性即树的节点集,是TIWTreeView 最关键的属性,类型为

TIWTreeViewItems。设计时,你可以通过点击来建立整个树,并且可以为每个节点填写onClick 事件;在运行时你可以通过它来访问任何节点,或者,你可以动态建立整个树。它实际是一个数组,每个元素是一个

TIWTreeViewItem 类型的对象。参考TIWTreeViewItem 的说明。

HorScrollBarVisible 和 VertScrollBarVisible

这两个属性也会让你惊喜,它居然还有滚动条。不过横向滚动条我认为

不要用,因为你应该给出合适的宽度,否则,如果宽度不够,树中的节

点会换行,或者往前移动,这很不美观。但纵向滚动条可是经常要用的。 TreeViewImages 复合属性。

一棵树需要几个图片,首先“伸展”和“折叠”分别需要一个图片,默

认是+和-;然后是节点本身,节点可以分为“叶”和“结”两种,“叶”只有一种状态,默认的图片是一张纸,故一个图片就行了,但“结”有

两个状态:展开的与折叠的,默认是敞开的书与合上的书,需要两个图

片。共需 5 个图片。下面五个属性都分别有 filename 与 url 两个子属性,请参考 TIWImageFile 控件的 imagefile 属性的说明。

PlusImage 对应加号(即“+”)。 MinusImage 对应减号(即“-”)。 DocumentImage 对应“叶”。 ClosedFolderImage 对应折叠的“结”。 OpenFolderImage 对应展开的“结”。 这个控件的核心是items 属性,请参考TIWTreeViewItems 和TIWTreeViewItem。 7.1.24、TIWTreeViewItems 属性 属性 说明 items 节点列表,是数组,类型 TIWTreeViewItem。 Count 节点个数。 方法 方法 说明 Add 增减一个节点。 Clear 清除所有节点。 Delete 删除一个节点。 Insert 插入一个节点。 7.1.25、TIWTreeViewItem 属性 属性 说明 Caption 节点的标题,即显示的文本。

Page 344: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 344页/共 376页

Expanded 决定节点是否展开它的下一层。读写。 Index 节点在兄弟中的排行,如果是第一个,则返回 0。 Name 节点的名称。可以认为 Name 是唯一标识,因为它绝对不会重复。 SubItems 下一层节点列表,类型 TIWTreeViewItems。 方法 方法 说明 Create、Destroy 略 DoClick 调用,即执行onClick 的代码。 GetNamePath 获得节点的带有“路径”信息的全名称,首先是树的名称,然后是若干

节点……,倒数第三是它的爷爷,倒数第二是它的父亲,最后是自己的

名称。 事件 事件 说明 OnClick 节点有了这个事件实在太方便了。节点有了这个事件才使TIWTreeView

完整。从另一个角度说, 没有这个事件TIWTreeView 将失去意义。如果onClick 不是nil 那么在页面上它是一个热连接的样子。

7.1.26、TIWMenu 这个控件的功能是在页面上增加菜单。它的使用方法是这样的,首先在窗体上放置TIWMenu,然后,

再放置一个TMainMenu,TmainMenu。最后让TIWMenu 的AattachedMeunu 指向TMainMenu 即可。随后,你要做的事情就是定义TIWMenu就可以了。

TIWMenu 的工作原理是根据它附着的TMainMenu 菜单的内容自动生成页面上的菜单。如果你以前在开发普通应用的时候为窗口设计过菜单,那么这个控件对你来说就太容易了。 属性 属性 说明 AttachedMenu 这个属性用来指定一个可以依附的菜单,生成页面时,就将根据这菜单

产生页面上的菜单。 这个属性必须设置。

ItemSpacing 这个属性决定顶层菜单项之间的距离。有两个值可选:itsNone 表示没有距离,即菜单项紧密相邻;itsEvenlySpaced将按页面宽度计算均匀分布。 强调一下:这个属性只影响顶层菜单项,对下层以及更下层菜单不影响。

Orientation 两个值可选:iwOHorizontal 表示菜单的顶层菜单项横向排列,这是默认值;iwOVertical 这个值表示菜单的顶层菜单项纵向排列,也有人喜欢这样吗?不会吧!

TimeOut 这个可以设置一个时间,以毫秒为单位。当鼠标经过菜单时,菜单就展

开了,如果鼠标又移动到菜单之外了,那么刚才展开的菜单不是立即消

失,而要等一个时间才消失,时间的长短由这个属性决定。 MenuStyle ,MenuItemStyle TIWMenuStyle 类型。

这个两个属性用来美化菜单。MenuStyle 控制顶层菜单的风格,不影响其子菜单;MenuItemStyle 控制除顶层菜单以外的菜单的风格。它们有相同的子属性,参考TIWMenuStyle

7.1.27、TIWMenuStyle 属性

Page 345: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 345页/共 376页

Alignment 略 Animation 如果为true 那么其子菜单的展开是动画的,也就是我们所说的“慢动作” AnimationInterval 假如你的鼠标停在一个菜单上,那么这个菜单的子菜单当然就要展开

了。如果正要展开一个菜单的子菜单有多个菜单项,那么它们很显然是

一个一个出现的,之所以你没有察觉到,是因为它们之间的时间间隔很

小。没关系,如果你渴望体会一下,那么请将这个属性的值设置大一点,

因为这个属性用来控制显示一个菜单项到显示下一个菜单项之间的时

间间隔(或者说停顿)。 AnimationSpeed 上面的属性用来设置从“绘画一个菜单完毕”到“开始绘画下一个兄弟

菜单”之间的停顿时间。这个属性与它配套使用,它决定的是绘画一个

菜单项的速度。 Border 是否需要边框 Color 底色 Font 字体设置 Height 菜单项的高度 HighLightColor 点亮时的背景色 HighLightTextColor 点亮时的文本的颜色 7.1.28、TIWApplet 这个控件是javaApplet 容器。

7.1.29、TIWFlash 这个控件是Flash 容器。

7.1.30、TIWHRule 这个控件在页面上画一条水平线,即输出一个hr 标签。

7.1.31、TIWList 这个控件将在页面上产生一个条目列表。它实际是用table 标签实现的。它重要的属性有两个:Items

和Numbered。Items 用来放置条目列表的内容,TStrings 类型。Numbered决定是否为条目编号。 7.1.32、TIWRadioGroup 这个控件与TRadioGroup 的使用没什么不同。

7.1.33、TIWTimer 这个控件的使用方法跟TTimer 一样。它的原理是在客户端用setTimeout 来定时触发服务器端你在

ontimer 里写的代码。 7.1.34、TIWDBCheckBox 数据敏感控件,以chechbox 方式显示和编辑数据。

属性 属性 说明 autoEditable 如果为true,那么它的editable 将由当前的dataset 的状态决定。 DataSource 指定数据源控件,即指定一个TDataSource 控件。 DataField 指定一个字段。 ValueChecked 选中时的值,默认为false。 ValueUnChecked 不选中时的值,默认为true。 事件 事件 说明 onClick 跟TIWCheckBox 一样。不过一定要注意这个事件触发的时机!

Page 346: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 346页/共 376页

该事件发生在什么时候?点击后,并且已经修改了dataset 的数据后。 7.1.35、TIWDBComboBox 属性 属性 说明 autoEditable 如果为 true,那么它的 editable 将由当前的 dataset 的状态决定。 DataSource 指定数据源控件,即指定一个 TDataSource 控件。 DataField 指定一个字段。 Items、itemsHaveValues 参考 TIWComboBox。 itemIndex 参考 TIWComboBox。一般,字段的当前值决定了这个属性的值,而当

新添记录的时候,它的值为-1 或者 0,虽然你能够修改它的值,它没意义,也马上被自动产生的值(来自 dataset 的值)覆盖。因此,我觉得在此它应该只读。

NoSelectionText 、 RequireSelection

参考 TIWComboBox。

事件 事件 说明 onChange 发生在点击后,并且 dataset 的 afterEdit 之后。 7.1.36、TIWDBEdit 属性 属性 说明 autoEditable 如果为 true,那么它的 editable 将由当前的 dataset 的状态决定。 DataSource 指定数据源控件,即指定一个 TDataSource 控件。 DataField 指定一个字段。 事件 事件 说明 onSubmit 发生在点击后,并且 dataset 的 afterEdit 之后。参考 TIWEdit。 7.1.37、TIWDBGrid 这个控件是用来浏览数据的,使用有点复杂,因此需要详细说明。但是有了TIWGrid 的说明在前,那么就容易多了。凡TIWGrid 有的说明,这里都不再重复,除非它们确有不同之处。 属性 属性 说明 DataSource 指定数据源控件,即指定一个TDataSource 控件。 Columns 这个属性类似于TDBGrid 的这个属性,用来指定表格显示哪些字段。如

果没有指定任何字段,那么将显示所有字段。这个属性的类型是

TIWDBGridColumns,后面将有说明。 footerRowCount 有时候需要为表格加上footer,这个属性用来设置表格的footer 有几行。

Footer 的行号是负数,最后一行的行号是-1。 假如footerRowCount=3,表示footer 有3 行,而且从上到下的行号是-3 、-2 、-1 。如何为footer 填写内容呢? 在onRenderCell 事件里。Footer 里的每个单元格都会触发这个事件。 但在5.0.43 版本时,如果这个属性大于1,输出有点问题,查看其代码,发现它忘了换行了。

Fromstart 如果这个属性为true,那么每次TIWDBGrid 从dataset 获得数据时,总是

Page 347: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 347页/共 376页

从dataset 的第一条记录开始,也就是说dataset的所有记录都出现在TIWDBGrid 中;如果这个属性为false,那么TIWDBGrid 从dataset 获得数据时,总是从dataset 的当前记录开始,也就是说TIWDBGrid 只包含dataset 中从当前记录开始往后的数据。 默认为True。

HighLightColor 和 HighLightRows

这两个属性的目的是这样的:有时候我们觉得某些行比较异常, 于是希望这些异常的行能引起用户的注意。 HighLightRows 决定是否特殊显示异常行,HighLightColor 设置特殊显示时异常行的颜色。一行数据,只要其中一个字段的数据异常,那么这

行就是异常行。至于什么样的数据属于异常数据,这与Columns 中的每个列的定义有关。请参考TIWDBGridColumn 的说明。

Options 复合属性。 dgIndicator 决定是否显示当前行的指示符,如果为true 那么表格将在最左边多出很

窄的一列,用来显示当前行指示符。与TDBGrid不同,TIWDBGrid 的前行指示符是一个星号,而TDBGrid的是一个三角形。默认为false。

dgShowTitles 这个属性决定是否显示列的标题。默认为true。 rollOver 和rollOverColor 当鼠标在表格上移动的时候,是否希望移动到某行,某行的颜色就变化?这就是这两个属性的目的。rollOverColor 决定变成何种颜色,rollOver 决定是否启用这个功能。

rowAlternateColor 这个属性设置一个颜色,这个颜色与GBColor 一起交替使用,即奇数行这种颜色,偶数行那种颜色。如果没指定这个属性,那么都用GBColor 显示。

RowClick 在定义Columns 中的各列的时候,你发现每个列都有一个onClick 事件,你可以为每个都填写代码,做不同的事情。默认情况下,点击发生在某

列时,触发这个列的onClick 事件,但是如果RowClick=true 那么只触发一个事件,即最后一个onClick 事件有代码的列的onClick 事件。 关于onClick 事件,参考TIWDBGridColumn 的说明。

rowHeaderColor 设置列标题的颜色 rollOver 决定rollOverColor 是否有效。 rollOverColor 设置一个颜色,当鼠标经过某行的时候这行就是用这个颜色。 rowCurrentColor 这个属性设置当前行的颜色。 好了,到此为止我们已经知道好几个与设置颜色有关的属性了,它们是: GBColor、 HighLightColor、rollOverColor、rowAlternateColor、rowCurrentColor。它们的优先级如下: rollOverColor> rowCurrentColor> HighLightColor> rowAlternateColor> GBColor。 rowLimit 这个属性限制TIWDBGrid 的行数。默认为0,这表示不限制,即dataset 里

有多少行数据,表格也就有多少行。当用户需要“翻页”这样的功能的

时候,这个属性大于0。这个属性是否为0 关系着系统的效率,大于0 时,我们是用劳动换取效率。这是一个很常见的话题。 如果这个属性大于0,那么Fromstart 就应该为false。

方法 方法 说明 RefreshData 这个方法强迫表格立即从dataset 那里重新装入数据。这个方法需要一个

参数,但实际上它没用,传递一个nil 即可 7.1.38、TIWDBGridColumns

Page 348: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 348页/共 376页

属性 属性 说明 Items 元素列表, 实际上也就是数组, 元素的类型为TIWDBGridColumn。 Count 这个属性表明Items 中的元素个数。 方法 方法 说明 Add 增加一个元素, 它的位置在最后。返回一个 TIWDBGridColumn 对象。 Insert Insert(index : integer) 在 指 定 位 置 插 入 一 元 素 , 返 回 一 个

TIWDBGridColumn 对象。 Clear 删除所有元素。 Delete Delete(index : Integer) 删除指定的元素。 FindItemID FindItemID(ID:Integer) 根据 ID 寻找元素。 7.1.39、TIWDBGridColumn 属性 属性 说明 BlobCharLimit 这个属性用来限制大文本的输出。0 表示不限制,如果大于 0,那么对

于长度大于它的文本将截去后面的。 CompareHighlight 设置比较方式, 以确定数据是否异常。这个属性与CompareValue 联合

使用。这个属性的取值: cNone 、hcEqualTo 、hcNotEqualTo 、hcContains 、hcDoesNotContain、hcGreaterThan、hcLessThan。 默认是 cNone。

CompareValue 这个属性与CompareHighlight 一起来检查记录是否异常。 这个属性只能包含一个值。我原以为:当CompareHighlight的值为hcContains 或hcDoesNotContain 时,CompareValue 可以包含多个值,其实不能。 参考 TIWDBGrid 的 HighLightColor 和 HighLightRows。

DataField 略 ID 这个属性唯一标识一个对象。它的产生是自动的。 LinkField 这个属性为这个列指定一个关联字段。只有设置了这个属性,这个列的

onClick 事件才会触发,并且 LinkField 指定的字段的数据通过参数传递到 onClick 里。

Title 这个属性用来设置字段的列标题。它的属性是 TIWGridCell类型,前面已经有说明。

事件 事件 说明 onClick 声明:onClick(ASender: TObject; const AValue: String)简单的说,在相应

的列上点击的时候触发这个事件。但是它与fieldLink 以及rowClick 有关。参数AValue 的值就是点击所在列的LinkField 字段的该行的值。遗憾的是我们不知道点击所在的行号,如果知道行号,那么我们就能够移

动到这一行——这有时非常方便:1、用户可以通过点击而不是通过导航条移动当前记录;2、进一步,因为点击行已经成为当前行,其它字段的值也就知道了。缺少这个信息非常遗憾!有什么变通的办法吗?有!

Page 349: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 349页/共 376页

你要利用AValue 参数来传递当前行号,这要求必须有个字段保存行号,用计算字段可以很容易实现。 例:这个例子中,当用户点击某行时,当前记录就是某行。 窗口上放置table1、DataSource1 以及IWDBGrid1,并分别设置它们。然后进行下面三个步骤: 1、定义一个计算字段row_no,在table1 的onCalcFields 事件里填写代码如下: procedure TformMain.Table1CalcFields(DataSet: TDataSet);begin DataSet.FieldByName('row_no').asInteger:=dataset.RecNoend; 这样字段row_no 就包含了每行的行号。 2、编辑IWDBGrid1 的Columns 属性,将所有字段都加入进来。然后选中字段row_no,设置它的LinkField 是它自己,然后填写它的onClick 事件: procedure TformMain.IWDBGrid1Columns2Click(ASender: TObject; const AValue: String); var i:integer; begin i:=StrToInt(AValue); Table1.MoveBy(i-Table1.RecNo) ; end; 3、设置 IWDBGrid1 的 rowClick=true

OnTitleClick 点击列的标题的时候触发。 7.1.40、TIWDBImage 这个控件的使用参考TIWImage、TImage、TDBImage 即可。

7.1.41、TIWDBNavigator 这个控件的作用跟普通导航条一样,不过是在页面上罢了。需要留意它的事件的触发时机。

属性 属性 说明 Conformations 这个属性允许你为每个导航条上的每个按钮指定一个确认信息。当点击

某按钮时,如果与它对应的确认信息非空,那么就产生一个确认对话框,

以确认是否真的要执行按钮的功能。 CustomerImages 你知道,在页面上导航条上每个按钮实际上都是图片,你看到的是默认

的样子,使用的是 IntraWeb 内部的图片。但你可以通过这个属性为每个按钮或者某个按钮指定更好看的图片,使页面具有特色。因为每个按钮

的状态有两种:有效和无效,因此每个按钮需要两个图片。图片可以通

过 filename 或者 url 指定,请参考 TIWImageFile 的这两个属性。 imageHeight 和 imageWidth 刚才已经说过,在页面上,导航条的按钮实际都是图片。这两个属性用

来设置每个图片所占的空间有多大。 Orientation 导航条是横着的还是立着的呢?由这个属性决定。 VisibleButtons 指定导航条包含哪些按钮。默认是全包括。 事件 事件 说明 OnCancel 这些事件都与dataset 有关。但必须记住:当这些事件发生的时候,对

Page 350: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 350页/共 376页

OnDelete OnEdit OnFirst OnInsert OnLast OnNext OnPost OnPrior OnRefresh

dataset 的操作已经结束。比如,当用户点击“删除”按钮的时候,如果你为dataset 的beforeDelete、afterDelete 以及这个控件的onDelete 都写了代码,那么事件的发生顺序是:beforeDelete—〉afterDelete—〉onDelete 因此,这个控件的事件只是做“事后处理”的,如果你希望做一些控制,

那么有两个机会: 1、在客户端。通过Conformations 属性设置问答,以决定是否真的执行按钮的功能; 2、在服务器端。在dataset 的事件里。 总的来说,这些事件不能代替 dataset 的那些事件。

7.1.42、TIWDBListbox 参考TIWListbox

7.1.43、TIWDBLookupListBox和 TIWDBLookupComboBox 这两控件与TIWDBListbox 和TIWDBComboBox 的差别是: TIWDBListbox 和TIWDBComboBox

的items 的内容需要你手工或者程序填写,而TIWDBLookupListBox和TIWDBLookupComboBox 直接从某个dataset 的某个字段获得。TIWDBLookupListBox和TIWDBLookupComboBox 已经没有items 属性了,代替它是listSource 和listField。 7.1.44、TIWDBMemo 用于编辑数据集里的多行文本数据。参考TIWMemo。

7.1.45、TIWDBFile 这个控件与TIWFile 的不同是:你在客户端指定的文件,自动的在服务器端保存到dataset 里了。当

然,它仍然保留了TIWFile 的savetoFile 和savetoStream,因为它们都派生自同一个控件:TIWCustomFile。 7.1.46、TIWDBText 这个控件用来显示数据表中的多行文本数据,不能编辑。不要小瞧这个控件,假如数据表中的多行

文本是HTML 文本,它与Rawtext 属性一起能实现很灵活的功能呢! 7.1.47、TIWClientSideDatasetDBLink 这个控件为客户端数据控件提供数据,使用它太简单了,只要指定datasource 即可。

7.1.48、TIWClientSideDataset 这个控件也是为客户端数据控件提供数据的,不同的是:它不是从某个数据集获得数据,而是让你

填写数据。 属性 属性 说明 columnNames 定义若干列名称。TStrings 类型,每行表示一个名称。 Data 在这个属性中填写数据。每行表示一条记录,一行内的数据之间用逗号

隔开。顺序一定要与 columnNames 里的顺序一致。 7.1.49、TIWCSNavigator 客户端数据的导航条。对客户端数据的操作都是通过它进行的,你没有别的办法操作它们。

属性 属性 说明 ClientSideDataSet 指 定 客 户 端 数 据 集 , TIWClientSideDataset 或 者

TIWClientSideDatasetDBLink。 Conformations 这个属性无效。 customerImages、VisibleBu ttons 、ImageHeight 、 ImageWidth、Orientation

参考TIWDBNavigator。

Page 351: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 351页/共 376页

7.1.50、TIWCSLabel 这个控件类似TIWDBLabel。 属性 属性 说明 ClientSideDataSet 指定客户端数据集。 FieldName 指定字段名称。 7.1.51、TIWDynGrid 这个控件叫动态表格,也是客户端控件。所谓动态,就是与普通表格相比,在每个字段上都有过滤

和排序的功能。它的使用非常简单,只要指定数据源即可。它对字段的数据类型的要求是:必须是能够

转换成文本,向图形等字段它都不支持。这个控件的工作完全依赖于客户端的JavaScript 代码。 属性 属性 说明 backGroundColor 背景色设置。 borderColor 设置四个边框的颜色,需要设置三个颜色,主色、向光色、背光色。 borderSize 决定边框有多粗。 Data 指定数据源。这是最主要的属性,其实只要设置这一个属性即可。 dataCell 这个属性用来设置数据所在的那些表格的外观,它也是通过

backGroundColor、borderColor、borderSize 来定义外观的。 Color 不起作用。

filterCell 设置过滤单元的外观。同dataCell。 titleCell 设置标题栏外观。同 dataCell。 7.1.52、TIWDynamicChart 这个客户端控件能够产生图表。所谓动态,其实是通过动态改变它的一些属性的值来实现得。它的

操纵全部在客户端,因此必须写一些客户端代码,即JavaScript 代码。这个图形控件输出的是二维的简单的图形,而且只有“矩形图”一种效果。如果要实现更强大的功能,可以使用更加强大的第三方控件。 对这个控件的操作是在服务器端与客户端两个地方进行的,因此我们从两个角度来观察它。因此分

为服务器端对象与客户端对象。服务器端对象是在服务器端从Delphi 的角度看到的,客户端对象是在客户端从JavaScript 角度看到的。 服务器端对象: 属性 属性 说明 Data 这个属性指定动态图表的数据源,这个属性必须在服务器端指定,因为

这个属性决定将哪个客户端数据集附着在图表上。 有这样一种情况:如果窗口上有个TIWClientSideDataset,任何别的控件都没有使用它的数据,那么它不会输出数据到客户端。 考虑这样一种情况:假如有若干个图表控件以及动态表格控件或者其他

客户端控件,如果它们使用相同的客户端数据集,是否在页面上只有一

份数据?很不幸!动态图表与动态表格不与任何控件共享数据,它们独

自拥有自己的数据。 horzData 这个属性指定横坐标对应的字段。图表基于一个二维坐标,你必须指定

一个字段,用它的值作为横坐标的值。可以在服务器端或者客户端设置。 注意,该字段的值在横坐标上从左向右的排列不是从小到大的顺序,其

顺序完全由记录的前后顺序决定。因此如果该字段不是排序字段,那么

在没有示意图的情况下,图形很难看懂,即使有示意图也不易懂。

Page 352: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 352页/共 376页

valuesInBars 决定是否在图表中的 bar 上显示数据。 vertData 实际上它应该叫做 valueData,因为它是要刻画的值。控件将找出横坐标

的每个刻度上这个字段的值——如果是多个值,那么求和或者平均等,

默认是求和。可以在服务器端或者客户端设置。 Legend 这个属性用来指定一个解说控件,它产生动态图表的图例。参考

TIWDynamicChartLegend。 客户端对象: 属性 属性 说明 name 名称=’G’+uppercase(服务器端的名称)。 horzData 、vertData 同服务器端对象。只是千万注意大小写。 Func 这个属性用来设置:横坐标的一个刻度上对应多个数据的时候,如何将

这些数据合并成一个数,默认是 sum。这个属性只能在客户端设置,因为服务器端没有这属性。它可能的取值为:Sum、Count、Min、Max、Avg。

方法 方法 说明 Draw() 画图。调用它,将根据当前设置重新画图,一般在某个属性变化之后调

用。 7.1.53、TIWDynamicChartLegend 这个控件即解说控件, 用来为TIWDynamicChart 产生一个图例。只要将TIWDynamicChart 的legend

属性指定既可,没有其他操作。 7.1.54、TIWTemplateProcessorHTML 这个控件是布局管理器之一,叫做模板处理器。它管理布局的方法是使用模板,而模板是其它开发

工具,如FrontPage、dreamweave 等创建的,因此,这种方式使得IntraWeb可以借助别的工具来管理页面的布局,借助其它工具的长处来超越IntraWeb 自己。 使用模板有另外两个好处:1、美工与程序员可以分开、并行工作;2、将来可以仅仅改动模板来改

变页面的外观,而无需改动程序,也无须重编译、重发布,似乎与程序无关。 使用方法: 1、将TIWTemplateProcessorHTML 拖放到窗口上; 2、设置窗口的TemplateProcessor;

3、将模板文件放置在工程目录的子目录Templates 下。 属性 属性 说明 TIWTemplateFiles 复合属性,用来指定模板文件。 .Default 指定一个模板文件名,注意,不要包含路径。如果这个属性为空,那么,

将是试图使用文件名为:窗口名称+’.HTML’的文件为模板。 将来,IntraWeb 总是到应用目录的子目录Templates 下去寻找模板文件。虽然TIWServerController 有个属性叫TemplateDir,但是在5.0.43 版本时你必须保持它为空,否则将找不到模板。 希望后来的版本能消除这个问题。

.IE 这个属性的意图是:可以为IE 指定单独的模板,如果不指定,那么将使用TIWTemplateFiles. Default 的内容。 但这个属性在 5.0.43 版本里不起作用。

.NetScape6 与 TIWTemplateFiles.IE 相同。

Page 353: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.1 IntraWeb 控件使用简要说明 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 353页/共 376页

MasterFormTag 这个属性你可以在 IntraWeb 的帮助中找到有关信息。我们要说的与帮助上说的不一样。无论这个属性如何设置,IntraWeb 总是输出 FormTag。帮助上说,如果它为 false 那么你应该在模板里手工添加 FormTag。假如你真的这样做了,你会发现 IntraWeb 仍然输出了 FormTag,而且其中包含了几个隐藏的元素,它们与前面的元素重名。奇怪的是一切工作正

常。我原以为是 IntraWeb 的 bug,同时 IE 有某些容错能力,后来阅读IntraWeb 的几个 js 文件才知道这正是他们的原意。

TagType 这个属性决定tag 的格式。有两个值可选: ttIntraWeb 格式:{%TagName%} 默认值 ttBorland 格式:<# TagName #> 对于这两个值的取舍,一方面是习惯问题,另一方面大概考虑 PageMode 要与 WebSnap 或者 WebBroker 协作,而后两者使用的是 ttBorland 格式。同时使用两种格式绝对不是好注意。

事件 事件 说明 onunknownTag onunknownTag (const AName: String; var VValue: String);这个事件在遇到

一些IntraWeb 不能处理的标记的时候触发。 AName 是标记名,VValue 是一个变量型参数,你可以为其赋值,它将代替整个标记。 这个事件能够为我们带来一定的灵活性。我们可以在模板里放置任何自

定义的标签,比如: {%hello%}, 相应的代码可以这样写: procedure TformMain.IWTemplateProcessorHTML1UnknownTag( const AName: String; var VValue: String); begin if Aname='hello' then VValue:='<p>This is a HELLO_TEXT</p>' end;

7.1.55、TIWLayoutMgrHTML 这也是一个管理布局的控件。刚才介绍TIWTemplateProcessorHTML 时,我们说过,

TIWTemplateProcessorHTML 使IntraWeb 能够利用别的所见即所得工具,如FrontPage 等来管理布局。但TIWLayoutMgrHTML 本身就是一个所见即所得的网页编辑器,当然它不如FrontPage 与dreamweave 强大。它实际上产生的也是一个模板,但这个模板文件是保存在程序内部。 它的使用非常简单:将它放在窗口上,然后设置窗口的TemplateProcessor 属性。之后,你只要双击

它就可以进入它的编辑界面,在那个界面有点类似FrontPage 的界面。在它的界面里你仍然可以使用IntraWeb 的控件,而且能直接设置它的属性,甚至为事件填写代码,因为那个界面与Delphi 环境同时存在,并协作。 这个控件的唯一好处是将模板保存在内部,因为这样对发布有好处。但这也许是一个坏处,因为我

无法单独修改模板,为了修改页面的布局不得不重新编译程序。当然,这一特点对于不同需要来说,会

有不同的评价。如果希望发布简单,可以将FrontPage 等其它产生的模板文件拷贝到它里面,这样不要模板目录和模板文件了。

Page 354: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 354页/共 376页

它仅仅用来产生一个简单的模板,然后把它拷贝到别的工具里编辑,最后形成模板文件。 7.1.56、TIWLayoutMgrForm 这个控件是最重要的布局管理器,不要担心,你不需要了解它的任何事情。它就是窗口布局管理器,

默认情况下,你就是使用它来管理布局的。在你建立一个窗口的同时,内部就为这个窗口建立了一个

TIWLayoutMgrForm 对象。我们几乎不会直接使用到它。

7.2 TMS For IntraWeb控件简介 TMS作为一家著名的开发研制Delphi第三方控件的软件公司,已经为大家所熟知,像它开发的

AdvStringGrid、DbPlanner等控件一直是闻名遐迩,是业界最为知名的公司之一。同样,为了使程序员更简便、更快捷地来使用IntraWeb,TMS公司推出了著名的控件包TMSIntraWeb Component Pack Pro,支持Delphi5~2009、C++Builder5、6及Kylix2、3在内的各种版本。大家可以到其网站http://www.tmssoftware.com浏览一下,并可以下载到免费试用版本。

如果想用IntraWeb做出真正实用、美观、漂亮的程序来,是离不开TMS控件包的。TMS控件包大约有70余个组件,几乎涵盖了Web设计的方方面面,更好地学习和使用它将会使你的开发工作事半功倍。

本节简单地将TMS的控件分成了标签文字类、编辑类、列表类、日期类、图形类、面板类、表格类等几个大项。 7.2.1 TMS内嵌 HTML编辑器

TMS提供了一个内嵌式的HTML编辑器,是HTML标准的子集,利用它可以编辑带有HTML标记的文本。相对于IntraWeb的传统组件,TMS最大的亮点在于其设计期的完全可视性,在TMS的HTMLLabel中就包含这样一个让我们心动的HTML编辑器,其工具条如图7-2-1所示。

图 7-2-1 HTML编辑器工具栏

工具条的图标已经标得很清楚了,可以选择不同的字体、字号,加粗、变斜、加下划线,居左、

居中、居右对齐,添加一个链接,字体选色,上、下标处理,插入一个断行符,字体背景色,插入图片,

缩进,文字闪烁,列表,确认、放弃以及预览。 在其编辑窗内,可以使用标准的HTML标记来格式化文本或图片。下面就分两部分来介绍这些控制

标记。 1.标准控制

B:加粗标记。 U:下划线标记。 I:斜体标记。 S:删除线标记。 HR:水平线。 BR:断行。 SUB:下标标记。 SUP:上标标记。 BLINK:闪烁标记(只能用于Netscape系列浏览器)。 UL:列表标记。 LI:列表项目。

Page 355: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 355页/共 376页

A:锚点标记。 PONT:指定字体标记。 P:段落标记。 BODY:指定字体及背景颜色标记。 2.扩展控制

(1)IMG:图形标记。插入一张图片,图片可以是绝对引用或相对引用。 <IMG src="specifier.name"[align="specifier"][width="width"][height="height"][alt="

specifier.name"]> src及alt参数被":"分隔为两部分,specifier可以取以下值: idx:与ImageList关联的图片的索引下标。 ssys:Windows系统图形列表(小图标格式)的索引下标或者是系统图形列表中可以找得到的相应的图

片的名字。 lsys:同ssys,但指的是系统图形列表的大图标格式。 file:指定的文件名的全称。 res:资源文件中位图的名称(无法在设计期显示出来)。 如果不设定些值的话,则取默认的Files目录下的图形文件。 下面看一些图片的例子: <IMG src="idx:1"align="top"> <IMG src="ssys:1"> <IMG src="ssys:worfile.doc"> <IMG src="file://c:\my documents\test.bmp"> <IMG src="res://BITMAP1"> <IMG src="name"> (2)SHAD:带阴影的文本。 <SHAD>:开始带阴影文本。 </SHAD>:结束带阴影文本。 (3)Z:隐藏文本 <Z>:开始隐藏文本。 </Z>:结束隐藏文本。 (4)HI:高亮文本。 <HI>:开始高亮文本。 </HI>:结束高亮文本。 (5)E:错误标注。文本以红色下划曲线标注出来。 <E>:开始错误标注。 </E>:结束错误标注。 (6)特殊符号: &lt;—< &gt;—> &amp;—& &quot;—" &nbsp;—非间断空白 &trade;—商标符号 &euro;—欧元符号 &sect;—区段符号 &copy;—版权符号 &para;—段落符号 提示:如果需要使用这些符号,可别忘了加&和;。 (7)数据字段标记:对于数据字段,可以使用(#字段名称)在HTML中加以引用。

4.6.2 TMS的标签文字类控件 1.TTIWHTMLLabel

TTIWHTMLLabel控件的使用同IntraWeb的标准控件TIWLabel的使用基本相同。

Page 356: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 356页/共 376页

2.TIWDBHTMLLabel

除添加了DataSource属性之外,DBHTMLLabel和HTMLLabel没有什么区别,可是怎么来引用数据表内容呢?原来,在HTML编辑器里面提供了标记(#字段名)来引用数据表的内容。这更像是一个模板,可以定制显示个性化的数据表信息,从而提供了灵活的处理方式。 而且,HTMLText允许将一段包含HTML标记的文本赋值给它。 7.2.3 TMS的编辑类控件

1.TIWAdvEdit

TIWAdvEdit是TMS提供的高级编辑控件,包括以下主要属性: (1) TIWAdvEdit支持编辑的数据类型是由TTIWAdvEditType来定义的。主要包括以下几大类:

etString允许字符串数据;etNumeric只允许整型数值;etFloat只允许浮点型数值;etUppercase自动将输入转换成大写;etMixedCase自动将输入转换成大小写混合;etLowerCase自动将输入转换成小写;etHex只允许十六进制数值的输入。

(2)AdvanceOnRetum:Boolean类型。是否对输入中的回车键进行处理。如果选真的话,按下回车键则会将输入焦点转到其后的第一个按钮上。实质上是利用该属性处理了IntraWeb的TIWEdit控件中的OnSubmit事件。

(3)Alignment:TAlignment类型。设置其对齐方式。 (4)BorderColor:TColor类型。设置其边框的颜色。 (5)BorderWidth:Integer类型:设置其边框的宽度。 (6)Color:TColor类型。设置其背景颜色。 (7)DecimalPoint:Char类型。设置浮点数输入时所用到的小数点样式。 (8)EditType:TTIWAdvEditType类型。前面已经提到了,设置AdvEdit要编辑的数据类型。 (9)Flat:Boolean类型。为真时,设置AdvEdit为平面表现形式。它是现在在网页上比较流行的样式。 (10)FocusColor:TColor类型。设置当AdvEdit拥有输入焦点时的背景颜色。 (11)PasswordPrompt:boolean类型。是否是输入密码。如果选真的话,输入的内容将会被星号所代替,

用以保护用户信息。 (12)SelectAll:Boolean类型。当为真时,用鼠标点击任一文本内容,则全部文本会被选中。 (13)Signed:Boolean类型。当为真时,允许在etNumberic和etFloat模式下输入正负号。 (14)SubmitOnRetum:Boolean类型。是否当按下回车键的时候执行提交功能。 2.TIWAdvLUEdit

(1)CaseSensitive:Boolean类型。设置是否大小写敏感。 (2)LookupItems:TStringList类型。设置要查看项目列表内容。 在窗体上放置一个TIWAdvLUEdit控件,在LookupItems框随意输入一些字符串,按F9键运行一下。

如果在输入框中输入一个大写的“T”,则自动匹配列表框中对应的字符串。下面看一下IntraWeb生成的网页源文件(部分):

//此函数用以处理自动匹配 function TIWADVLUEDIT1autoComplete (field,select) { var found=false; var s; var lookup=new String(""); s=field,value; for (var i=0;i<select.options.length;i++) { lookup=select.options[i]['value'];

Page 357: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 357页/共 376页

if (lookup.indexOf(s)=0) { found=true;break; }

} if (found) {select.selectedIndex=i;} else{select.selectedIndex=-1;} if (field.createTextRange) { var cursorKeys="8;46;37;38;39;40;33;34;35;36;45; "; if (cursorKeys.indexOf(event.keyCode+"; ")=-1) { var rl=field.createTextRange( ); var oldValue=r1.text;

var new Value=found?select.options[i]['value'];oldValue; if (new Value!=field.value) {

field.value=newValue; varNew=field.create TexRange( ); rNew.moveStart('character',oldValue.length); rNew.select ( ); } } } } Function TIWADVLUEDIT1Focus(ctrl) { } </Script> <input type=input name="TIWADVLUEDIT1"onKeyUp="TIWADVLUEDIT1autoComplete

(this,document.getElementById('TIWADVLUEDIT1_ID')) " Style=""size=17 value="TIWAdvLUEditl"style="background-color.#FFFFFF";onFocus="

TIWADVLUEDIT1Focus(this) ";> <SELECT style>="visibility:hidden"id="TIWADVLUEDIT1_ID"> <OPTION VALUE="太阳">太阳 <OPTION VALUE="你好">你好 <OPTION VALUE="大家好">大家好 <OPTION VALUE="this is a sample program! ">This is a sample program! </SELECT> 熟悉JavaScript的读者马上就会明白了,原来是对AdvLUEdit定义了一个onKeyUp事件,该事件调用

了前面定义的TIWADVLUEDIT1autoComplete函数,由此函数来完成自动添加动作。 3.TIWEmailEdit

(1)Flat:Boolean类型。是否令EmailEdit具有平面表现形式。 (2)ErrorMessage:String类型。用于设置当EmailEdit输入框的值不正确时显示的错误信息。默认的值

是“Please enter a valid e-mail address”,可以在此属性里对提示信息进行修改。 依据对上一个控件AdvLUEdit的分析,可以看一下IntraWeb生成的HTML源文件。TMS也是利用嵌

入的JavaScript来检查客户端输入的是否为有效的邮件地址。 4.TTIWAdvSpinEdit

Page 358: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 358页/共 376页

TTIWAdvSpinEdit具备的主要属性和TIWAdvEdit基本相同,包括Advance OnRetum、Alignment、BorderColor、BorderWidth、Color、DecimalPoint、Flat、FocusColor、SelectAll、Signed、SubmitOnRetum等。两者同样洐生自TIWCustomEdit,只是TTIWAdvSpinEdit在其右侧加了Spin图标,并对其进行了一些JavaScript编程而已。这里就不一一详述了,大家可以随意生成一个含TTIWAdvSpinEdit控件的小程序,分析一下网页源文件就会了解得很清楚。

5.TTIWPersistentEdit

可处理Cookie的编辑控件。如果Text属性为空,则该控件会试图读取Cookie的值,最后修改的值将会以Cookie的被存储。

6.TIWCCNumEdit

用于信用卡处理的编辑控件。 (1)CreditCardTypes:TCreditCards类型。指明所用信用卡的类型,包括ccMasterCard,万事达卡;ccVISA,

Visa卡;ccAmex,American Express卡;ccDinersClub,DinersClub卡;ccEnRoute,EnRoute卡;ccDiscover,Discover卡;ccJCB,JCB卡;ccUnknown,不知道类型的信用卡等。

(2)ErrorMessage:String类型。设置当在CCNumEdit控件中输入了无效的卡号时显示的提示信息。默认的内容是“Please enter a valid CreditCard Number.”。

(3)Flat:Boolean类型。为真时设置其的外表为平面形式。 7.TIWCCExpEdit

用以验证信用卡使用期限是否有有效的编辑控件。 (1)DesignMode:Boolean类型。如果为真,则设计期在该控件四周有一点划线组成的框。默认值为真。 (2)ErrorMessage:String类型。设置当CCExpEdit控件的值不正确时的错误提示信息。默认值是“Expiry

date should be a date in the future.”。 (3)Month:Integer类型。设置选择的月份。 (4)Year:Interger类型。设置选择的年份。 (5)GetMonthYear:Sting类型。获得所设置的年月。 (6)SetValue(const AValue:string):设置年月。 (7)Submit(const AValue:string):提交Avalue表示的日期,以验证信用卡是否有效。 8.TIWHTMLEdit

是一个典型的客户端小型可视化编辑器。 (1)ContentEditable:Boolean类型。是否允许编辑内容。默认值为真。 (2)Glyphs:TTIWHTMLEdGlyphs类型。是否允许编辑时显示和使用这些编辑功能按钮。包括像格式

排版、字体、字形变化等内容。 (3)Lines:TStrings类型。存储要进行编辑的文本内容。 9.TIWDBAdvEdit

(1)AutoEditable:Boolean类型。是否允许自动编辑。AutoEditable为真,如果DataSource处在编辑或插入状态,则设置Editable为真;如果DataSource不处于编辑或插入状态,则设置Editable为假。默认值为False,即不自动设置Editable的状态。

(2)DataSource:数据源。 (3)DataField:数据字段。

7.2.4 TMS的列表类控件 1.TIWHTMLCheckBox

(1)BaseDir:String类型。设置在设计期的图片路径。 (2)DesignLive:Boolean类型。为真,则在设计期会引用图片、数据表内容等资料。 (3)DesignMode:Boolean类型。如果为真的话,设计期该控件会被一点划线包围。 (4)HTMLText:TStrings类型。可以设置带有HTML标记的文本串。实际上是对Caption进行一些个性

Page 359: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 359页/共 376页

化定制。 2.TIWHTMLList

(1)BaseDir:String类型。设置在设计期的图片路径。 (2)DesignLive:Boolean类型。为真,则在设计期会引用图片、数据表内容等资料。 (3)DesignMode:Boolean类型。如果为真的话,设计期该控件会被一点划线包围。 (4)Items:TStrings类型。包括所设置列表的内容。 像前面提到的HTMLLabel一样,IWHTMLList也提供了一个可视化的编辑对话框。 HTMLList的编辑窗口与HTMLLabel的编辑窗口相似,只不过在左侧多了一个列表框及两个命令按

钮,用以增删列表的项目。 3.TIWHTMLRadioGroup

(1)BaseDir:String类型。设置在设计期的图片路径。 (2)DesignLive:Boolean类型。为真,则在设计期会引用图片、数据表内容等资料。 (3)DesignMode:Boolean类型。如果为真,则设计期该控件会被一点划线包围。 (4)Items:TStrings类型。包括所设置列表的内容,带HTML可视化编辑器。 (5)ItemIndex:Integer类型。设置所选单项按钮的索引值。 4.TIWCountryComboBox

显示包括全部国家在内的一个组织框。 5.TIWListLink

在列表框之间完成移动或者拷贝功能。 (1)CopyLR:TIWButton类型。设置按钮处理客户数据从左侧列表拷贝到右侧列表。 (2)CopyRL:TIWButton类型。设置按钮处理客户数据从右侧列表拷贝到左侧列表。 (3)LList:TIWListBox类型。TTIWListLink控件用其来存放左侧列表数据。 (4)MoveAllLR:TIWButton类型。设置按钮处理客户全部数据从左侧列表移动到右侧列表。 (5)MoveAllRL:TIWButton类型。设置按钮处理客户全部数据从右侧列表移动到左侧列表。 (6)MoveLR:TIWButton类型。设置按钮处理客户数据从左侧列表移动到右侧列表。 (7)MoveRL:TIWButton类型。设置按钮处理客户数据从右侧列表移动到左侧列表。 (8)RList:TIWListBox类型。TTIWListLink组件使其存放右侧列表数据。 (9)Sort:Boolean类型。如为真,则左侧列表及右侧列表的项目将按字母序列排列。 6.TIWComboListLink

在组合框和列表框之间完成移动及拷贝功能。 (1)CopyLR:TIWButton类型。设置按钮处理客户数据从左侧的组合框拷贝数据到右侧列表框。 (2)CopyRL:TIWButton类型。设置按钮处理客户数据从右侧的列表框拷贝数据到左侧组合框。 (3)LCombo:TIWComboBox类型。TTIWComboListLink控件用以存放数据的组合框。 (4)MoveAllLR:TIWButton类型。设置按钮处理客户全部数据从左侧的组合框移动到右侧的列表框。 (5)MoveAllRL:TIWButton类型。设置按钮处理客户全部数据从右侧的列表框移动到左侧的组合框。 (6)MoveLR:TIWButton类型。设置按钮处理客户数据从左侧组合框移动到右侧的列表框。 (7)MoveRL:TIWButton类型。设置按钮处理客户数据从右侧的列表框移动到左侧的组合框。 (8)RList:TIWListBox类型。TTIWComboListLink控件用存放数据的列表框。 (9)Sort:Boolean类型。如为真,则左侧列表及右侧列表的项目将按字母序列排列。 7.TIEditListLink

将编辑控件的内容添加为列表框的一个条目。 (1)DeleteSelectedItem:TIWButton类型。设置按钮删除列表框中的当前选项。 (2)LEdit:TIWEdit类型。TTIWEditListLink控件使用的编辑框。 (3)MoveEditList:TIWButton类型。设置按钮处理客户数据从编辑框添加到列表框中。

Page 360: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 360页/共 376页

(4)RList:TIWListBox类型。指定TTIWEditListLink控件使用的列表框。 (5)Sort:Boolean类型。为真是,列表框中的条目以字母序列排序。 8.TIWColorPicker

颜色选择器。 (1)Button:TIWTMSButton类型。设置颜色选择器标题。可以定制显示的文字、颜色、字体、大小等。 (2)ColCount:Word类型。设置显示的列数,默认值为4。 (3)Color:TColor类型。当所选择的颜色有效时,预览色框的颜色。 (4)Colrs:TIWColors类型。所有可选的有效的颜色。 (5)DefaultColWidth:默认的列宽。 (6)DefaultRowHeight:默认行高。 (7)LineColor:TColor类型。分隔线的颜色。默认为clGray。 (8)LineWidth:Byte类型。分隔线的宽度。默认为1。 (9)PaletteColors:TColor型数组,设置调色板的颜色。 (10)PickerVisible:Boolean类型。为真时,选色器可见。 (11)PreviewVisible:Boolean类型。预览色框是否可见。 (12)RectHeight:选色器的行数。 4.6.5 TMS的日期类控件 1.TIWDateLabel

显示当前日期用的标签。 DateFormat:Sting类型。格式化当前日期的显示样式。默认的选择是“dd/mm/yyyy” 2.TIWClock

显示当前时间用的标签。 3.TIWDateSelector

附带日期选择器的编辑框。 Date:TDateTime类型。以TDataTime格式设置日期选择器的日期。 因为它使用到了TMS的日历控件,日历控件有许多属性,因此将其合并到下部分介绍。 4.TIWCalendar

一个非常漂亮的日历表,如图7-2-2所示。

图 7-2-2 漂亮的日历表

(1)BackgroundImage:TPicture类型。设置日历表的背景图片。 (2)BorderCollapse:Boolean类型。是否消除表框。 (3)BorderColor:TColoer类型。边框的颜色。

Page 361: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 361页/共 376页

(4)BorderWidth:Integer类型。边框的宽度。 (5)Color:TColor类型。边框的颜色。 (6)Date:TDateTime类型。设置日历表的日期。 (7)Day:Integer类型。日历表的日子。 (8)Glyphs:TTIWCalGlyphs类型。定义的四张图片,分别为NextMonth(下一月)、NextYear(下一年)、

PrevMonth(上一月)、PrevYear(上一年)。四张图片代替相应的“<”、“《”、“>”“》”四个符号。 (9)GradientDirection:TTIWGradientDirection类型。设置日历表中包含日期部分渐变色的方向。

TTIWGradientDirection=(gdHorizontal,gdVertical)有两项选择,分别是水平方向渐变和垂直方向渐变。 (10)GradientEndColor:TColor类型。设置渐变颜色的终止色彩。 (11)GradientStartColor: TColor类型。设置渐变颜色的起始色彩。 (12)GridLineColor: TColor类型。设置分隔线的色彩。 (13)GridLineWidth:Integer类型。设置分隔线的宽度。 (14)HintNextMonth:String类型。设置下一月的提示信息。 (15)HintNextYear:String类型。设置下一年的提示信息。 (16)HintPrevMonth:String类型。设置上一月的提示信息。 (17)HintPrevYear:String类型。设置上一年的提示信息。 (18)HoverColor:TColor类型。设置当鼠标移支日期上日期显示的背景颜色。 (19)Month:Integer类型。日历表的月份。 (20)MonthColor:TColor类型。设置月份的颜色。 (21)MonthGradientDirection:TTIWGradientDirection类型。设置日历表中包含月份部分渐变色的方

向。TTIWGradientDirection=(gdHorizontal,gdVertical)有两项选择,分别是水平方向渐变和垂直方向渐变。 (22)MonthGradientEndColor:TColor类型。设置月份部分渐变颜色的终止色彩。 (23)MonthGradientStartColor:TColor类型。设置月份部分渐变颜色的起始色彩。 (24)NameOfDays:TStringList类型。设置星期的显示文字。默认为英文名称。 (25)NameOfMonths:TStringList类型。设置月份的显示文字。默认为英文名称。 (26)ShowNextMonth:Boolean类型。是否显示下一月。 (27)ShowNextYear:Boolean类型。是否显示下一年。 (28)ShowPrevMonth:Boolean类型。是否显示上一月。 (29)ShowPrevYear:Boolean类型。是否显示上一年。 (30)TodayBorder:Boolean类型。当前日期是否加框。 (31)TodayBorderColor:TColor类型。当前日期的边框颜色。 (32)TodayColor:TColor类型。当前日期的背景颜色。 (33)WeekendColor:TColor类型。周末日期的背景颜色。 (34)WeekendTextColor:TColor类型。周末日期文本颜色。 (35)Year:Integer类型。日历表的年份。

5.TIWDatePicker

附带日历表的日期编辑框。通过点击右侧的按钮可以实现日期的选择。

(1)Date:TDateTime类型。所设定的日期。 (2)DateFormat:TTIWDatePickerFormat类型。所设定日期的格式。 TTIWDatePickerFormat=(dfEU,dfUS)类型,包括两种不同的日期格式:dfEU,欧洲日期格式

dd/mm/yyyy; dfUS,美国日期格式mm/dd/yyyy。 (3)DateSeparator:char类型。设置用以分隔日-月-年各部分的分隔符。默认为“/”。 6.TIWDBCalendar

与普通的Calendar相比,只是多了几个与数据表操作相关的属性。

Page 362: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 362页/共 376页

(1)AutoEditable:Boolean类型。是否允许自动编辑。AutoEditable为真,如果DataSource处在编辑或插入状态,则设置Editable为真;如果DataSource不处于编辑或插入状态,则设置Editable为假。默认值为False,郰不自动设置Editable的状态。

(2)DataSource:数据源。 (3)DataField:数据字段。 7.TIWDBDatePicker

与普通的DatePicker相比,只是多了几个与数据表操作相关的属性。 (1)AutoEditable:Boolean类型。是否允许自动编辑。AutoEditable为真,如果DataSource处在编辑或

插入状态,则设置Editable为真;如果DataSource不处于编辑或插入状态,则设置Editable为假。默认值为False,即不自动设置Editable的状态。

(2)DataSource:数据源。 (3)DataField:数据字段。

7.2.6 TMS的菜单类控件 1.TIWStaticMenu

水平或垂直方向的静态菜单。 (1)DesignLive:Boolean类型。如为真,则在设计期时,如果连接了Internet则会引用那些图片。例

如,在HTML编辑器中使用了如下的代码: <IMG src="http://www.51delphi.com/image/logo.jpg"> 并且设置了DesignLive=true,那么在IntraWeb的窗体内即会显示该图片。 (2)BaseDir:string类型。设置在设计期要引用图片的路径。 (3)BorderColor:TColor类型。设置菜单条目的边框颜色。 (4)Color:TColor类型。设置菜单的背景颜色。 (5)DesignMode:Boolean类型。如为真,则在设计期会有一点划线包围该控件。 (6)HoverBorderColor:TColor类型。当鼠标移到菜单条目之上时,其边框的颜色。 (7)HoverFontColor:TColor类型。当鼠标移到菜单条目之上时,其字体的颜色。 (8)Items:TstringList类型。用以存放菜单条目。 (9)Layout:TstaticMenuLayout类型。TstaticMenuLayout=(smlVertical,smlHorizontal)定义了静态菜单的

表现形式,包括垂直摆放及水平摆放两类。 2.TIWMainMenu

下拉菜单控件。 (1)Border:Boolean类型。是否需要边框。 (2)BorderColor:TColor类型。如果Border属性为真,则设置正常菜单状态下边框的颜色。 (3)DesignMode:Boolean类型。如果为真,则在设计期会有一点划线包围该控件。 (4)HoverBorderColor:TColor类型。当鼠标移动到菜单条目上时,其边框的颜色。 (5)HoverColor:TColor类型。当鼠标移动到菜单条目上时,其背景颜色。 (6)HoverFontColor: TColor类型。当鼠标移动到菜单条目上时,其字体的颜色。 (7)ItemSpacing:Integer类型。菜单条目之间的空白。 (8)Menu:Tmenu类型。一个标准的TMainMenu控件。如果菜单条目调用了JavaScript程序,则

MenuItem.Caption:='Captiontext|ScriptCode`。例如:MenuItem.Caption:='Showalert|alert('在Delphi窑洞欢迎您!`)`。

(9)Open:TIWMenuOpen类型。TIWMenuOpen=(moHover,moClick)包括两个选项,一个当鼠标移到菜单条目上就打开子菜单,一个当鼠标点击有子菜单的条件才打开子菜单。

(10)SubMenuGlyph:TIPicture类型。设置表示菜单条目有子菜单的小图形。如果为空,则使用“>”表示。

Page 363: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 363页/共 376页

3.TIMSideMenu

垂直菜单控件。 (1)Border:Boolean类型。是否需要边框。 (2)DesignMode:Boolean类型。如果为真,则在设计期会有一点划线包围该控件。 (3)HoverBorderColor:TColor类型。当鼠标移动到菜单条目上时,其边框的颜色。 (4)HoverColor:TColor类型。当鼠标移动到菜单条目上时,其背景颜色。 (5)HoverFontColor: TColor类型。当鼠标移动到菜单条目上时,其字体的颜色。 (6)ItemSpacing:Integer类型。菜单条目之间的空白。默认值为3。 (7)Menu:Tmenu类型。一个标准的TMainMenu控件。如果菜单条目调用了JavaScript程序,则

MenuItem.Caption:='Captiontext|ScriptCode`。例如:MenuItem.Caption:='Showalert|alert('在Delphi窑洞欢迎您!`)`。

(8)SubMenuGlyph:TIPicture类型。设置表示菜单条目有子菜单的小图形。如果为空,则使用“>”表示。

4.TIWPopupMenuButton

带按钮的弹出式菜单。 (1)ButtonColor:TColor类型。设置按钮的颜色。默认值是clSilver。 (2)ButtonFont:TIWfont类型。设置按钮的字体。 (3)Border:Boolean类型。是否需要边框。 (4)BorderColor:TColor类型。如果Border属性为真,则设置正常菜单状态下边框的颜色。 (5)DesignMode:Boolean类型。如果为真,则在设计期会有一点划线包围该控件。 (6)HoverBorderColor:TColor类型。当鼠标移动到菜单条目上时,其边框的颜色。 (7)HoverColor:TColor类型。当鼠标移动到菜单条目上时,其背景颜色。 (8)HoverFontColor: TColor类型。当鼠标移动到菜单条目上时,其字体的颜色。 (9)ItemSpacing:Integer类型。菜单条目之间的空白。 (10)Menu:Tmenu类型。一个标准的TMainMenu控件。如果菜单条目调用了JavaScript程序,则

MenuItem.Caption:='Captiontext|ScriptCode`。例如:MenuItem.Caption:='Showalert|alert('在Delphi窑洞欢迎您!`)`。

(11)Open:TIWMenuOpen类型。TIWMenuOpen=(moHover,moClick)包括两个选项,一个当鼠标移到菜单条目上就打开子菜单,一个当鼠标点击有子菜单的条件才打开子菜单。

(12)SubMenuGlyph:TIPicture类型。设置表示菜单条目有子菜单的小图形。如果为空,则使用“>”表示。

5.TIWPopupMenuLabel

除了Button换成了Label之外,其他的属性都一样。 (1)LabelColor:TColor类型。设置标签的颜色。默认值是clWhite. (2)LabelFont:TIWfont类型。设置标签的字体。

7.2.7 TMS的图形类控件 1.TIWAdvlmage

高级图形控件可以捕获鼠标事件从而改变图形。 (1)AltText:String类型。当浏览器不接受图形时显示的信息。 (2)HotPicture:TIPicture类型。当鼠标移动到图形上时要显示的图形。 (3)Picture:TIPicture类型。当鼠标不在图形上要显示的图形。 (4)UseBorder:Boolean类型。为真时,图形使用有一个边框。 (5)UseSize:Boolean类型。为真时,图形的真实大小改变成可用的大小,因此图形可以完整地显示。

为假时,如果可用的大小小于图片的真实大小,则只能有部分图片可以看得到。

Page 364: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 364页/共 376页

2.TIWFadelmage

渐变图形控件可以因鼠标事件而改变图形的亮度。 (1)AltText:String类型。当浏览器不接受图形时显示的信息。 (2)Opacity:Integer类型。当鼠标不在图形上时图片的亮度。默认值是40。 (3)Picture:Tpicture类型。要显示的图片。 (4)Speed:Integer类型。当鼠标在图片上,图片变成真实模样的速度。默认值是40。 (5)UseBorder:Boolean类型。为真时,图形使用有一个边框。 (6)UseSize:Boolean类型。为真时,图形的真实大小改变成可用的大小,因此图形可以完整地显示。

为假时,如果可用的大小小于图片的真实大小,则只能有部分图片可以看得到。 3.TIWHotSpotlmage

热点图形控件可以捕获鼠标事件从而改变图形。 (1)AltText:String类型。当浏览器不接受图形时显示的信息。 (2)HotSpots:ThotSpots类型。为一个图形定义热点区域。ThotSpots是一个集合类型,包括了所定义

的图形的热点区域。其中主要属性Items是包括了各热点区域定义的数组。 ThotSpot包括的主要属性如下。 Angle:Integer类型。设置热点区域的旋转角度。 Height:Integer类型。设置热点区域的高度。 Hint:String类型。鼠标移动到热点区域上时的提示信息。 ID:integer类型。热点区域惟一标识符。 Name:String类型。热点区域的名字。 ShapeType:TspotShapeType类型。热点区域的类型。TspotShapeType=(stRectangle,stEllipse, stPolygon)包括长方形、椭圆形及多边形。 Width:Integer类型。定义热点区域的宽度。 X:Integer类型。定义热点区域的X坐标。 Y:Integer类型。定义热点区域的Y坐标。 另外,像ClickImage、Clipped、Down及HotImage等属性TMS并不支持。 (3)Picture:TIPicture类型。当鼠标不在图形上要显示的图形。 (4)UseBorder:Boolean类型。为真时,图形使用有一个边框。 4.TIWPaintBox

绘画盒控件。 Canvas:Tcanvas类型。设置绘画区域。 5.TIWAdvlmageButton

高级图形按钮控件。包括三种类型图片: 当鼠标不在按钮上或没有鼠标点击事件时的图片;当鼠标在按钮上时的图片;当鼠标点击事件发

生时的图片。 (1)AltText:String类型。当浏览器不接受图形时显示的信息。 (2)DownPicture:TIPicture类型。当点击按钮时的图片。 (3)HotPicture:TIPicture类型。当鼠标在按钮上时的图片。 (4)Picture:TIPicture类型。当鼠标不在按钮上或没有点击事件发生时的图片。 (5)UseBorder:Boolean类型。为真时,图形使用有一个边框。 (6)UseSize:Boolean类型。为真时,图形的真实大小改变成可用的大小,因此图形可以完整地显示。

为假时,如果可用的大小小于图片的真实大小,则只能有部分图片可以看得到。 7.2.8 TMS的面板类控件

Page 365: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 365页/共 376页

1.TIWScrollPanel

可对文本实现上下滚动的面板。 (1)AutoScroll:TIWGridBorderColors类型。为真时,在鼠标点击之后开始滚动,到文本结束或另一

个新的鼠标点击事件发生时结束。 (2)BorderColors:TIWGridBorderColors类型。设置边框的颜色。 (3)BorderSize:Integer类型。边框的宽度。默认值为2。 (4)Color:TColor类型。设置滚动区域的背景颜色。 (5)Font:TIWfont类型。设置滚动区域的字体。 (6)ScrollbuttonColor:TColor类型。设置上下滚动按钮区的背景颜色。 (7)ScrollButtonFont:TIWFont类型。设置上下滚动按钮区的字体。 (8)ScrollButtonGlyphDown:TBitmap类型。设置下滚动按钮的图形。 (9)ScrollButtonGlyphUp:TBitmap类型。设置上游动按钮的图形。 (10)ScrollButtonTextDown:string类型。设置下滚动按钮的文本。 (11)ScrollButtonTextUp:string类型。设置上滚动按钮的文本。 (12)ScrollStyle:TScrollStyle类型。设置鼠标点击还是鼠标滑过开始滚动。TScrollStyle=(ssHover,

ssClick),默认是鼠标点击开始滚动。 (13)Speed:Integer类型。设置滚动的速度。默认值为4。 (14)Text:TStringList类型。设置滚动区域文本的内容。 (15)WordWrap:Boolean类型。如果为真,则滚动区域的文本折行。 2.TIWTickerPanel

(1)BorderColor:TColor类型。设置边框的颜色。 (2)ButtonCollapsGlyph:TBitmap类型。设置折叠按钮的图形。 (3)ButtonColor:TColor类型。设置展开、折叠按钮的背景颜色。 (4)ButtonExpandGlyph:TBitmap类型。设置展开按钮的图形。 (5)ButtonWidth:integer类型。设置展开、折叠按钮的宽度。 (6)CaptionColor:TColor类型。设置面板表头的背景颜色。 (7)CaptionFont:TIWFont类型。设置面板表头的字体。 (8)Font:TIWFont类型。设置打开面板时,其打开区域的字体。 (9)Lines:TStringList类型。面板中所包含的文本信息。 (10)RotateTime:Integer类型。设置展开、折叠转换时的速度。 (11)ShowButton:Boolean类型。如为真,则展开、折叠按钮被显示。 (12)State:IWTickerPanelState类型。展开或折叠的状态。 IWTickerPanelState=(stExpanded,stCollapsed)类型共有两个选项,stExpanded代表面板展开,而

stCollapsed代表面板折叠。 3.TIWSmartPanel

带展开、折叠按钮的面板。 (1)BorderColor:TColor类型。设置边框的颜色。 (2)ButtonCollapsGlyph:TBitmap类型。设置折叠按钮的图形。 (3)ButtonColor:TColor类型。设置展开、折叠按钮的背景颜色。 (4)ButtonExpandGlyph:TBitmap类型。设置展开按钮的图形。 (5)ButtonWidth:integer类型。设置展开、折叠按钮的宽度。 (6)Caption:string类型。设置面板的标题。 (7)CaptionCollapsColor:TColor类型。折叠状态标题的颜色。 (8)CaptionCollapsFontColor:TColor类型。折叠状态标题的字体颜色。

Page 366: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 366页/共 376页

(9)CaptionExpandColor:TColor类型。展开状态标题的颜色。 (10)CaptionExpandFontColor:TColor类型。展开状态标题的字体颜色。 (11)CaptionFont:TIWFont类型。面板标题的字体。 (12)Font:TIWFont类型。设置打开面板时,其打开区域的字体。 (13)Lines:TStringList类型。面板中所包含的文本信息。 (14)State:IWTickerPanelState类型。展开或折叠的状态。 IWTickerPanelState=(stExpanded,stCollapsed)共有两个选项,stExpanded代表面板展开,而

stCollapsed代表面板折叠。 4.TIWOutlookBar

OutLook式样的面板。 (1)ArrowSlideSpeed:Integer类型。设置OutlookBar面板内部滚动的速度。默认值为8。 (2)BorderColor:TColor类型。设置OutlookBar控件的边框颜色。默认值为$dddddd。 (3)BorderSize:Integer类型。设置OutlookBar控件的边框宽度。默认值为3。 (4)ButtonFont:TIWfont类型。设置OutlookBar控件面板内按钮所使用的字体。 (5)Color:TColor类型。设置OutlookBar控件的背景颜色。默认值为clBlack。 (6)ImageMargin:integer类型。设置面板顶端与OutlookBar项目图片之间的距离。默认值为4。 (7)Images:TImageList类型。设置OutlookBar所使用到的图片列表。 (8)ItemHeight:integer类型。设置OutlookBar项目的高度。默认值为12。 (9)ItemSpace:integer类型。设置面板内项目之间的空白。默认值为8。 (10)ItemWidth:integer类型。设置面板内项目的宽度。默认值为32。 (11)LabelFont:TIWfont类型。设置面板内文本标签的字体。 (12)LabelMargin:Integer类型。设置面板内图片与项目标题之间的距离。默认值为3。 (13)PanelHeight:Integer类型。设置OutlookBar面板标题按钮的高度以。默认值为25。 (14)Panels:TIWOutlookPanels类型。OutlookBar使用到的面板集合。TIWOutlookPanel类型包括如

下主要属性。 Caption:string类型。设置面板按钮标题。 ImageIndex:integer类型。面板图片的索引值。默认值为-1。 Items:TIWOutlookItems类型。OutlookBar面板内条目集合。 (15)ScrollButtonGlyphDown:TBitmap类型。OutlookBar面板内向下滚动按钮的图片。 (16)ScrollbuttonGlyphUp:Tbitmap类型。Outlookar面板内向上滚动按钮的图片。 (17)SlideSpeed:real类型。设置面板打开及关闭时的速度。

7.2.9 TMS表格类控件 TMS公司以专门发行了关于表格控件使用的PDF。翻译如下。

7.2.9.1 TMS表格的结构样式 TTIWAdvWebGrid及TTIWDBAdvWebGrid主要由以下四大部分构成,如图7-2-3所示。

Page 367: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 367页/共 376页

图 7-2-3 TMS表格的结构组成

第一部分是控制部分(Controller),主要用于完成翻页控制及不同页面的选择。可有多种选项来定制个性化的页面控制。

第二部分是表头部分(Header),通过表头使用一行或两行来表示。在大多数简单的窗体里面,表头用以表明显示在每一列的数据,另外它还可以用于对某一列进行排列操作,执行一个过滤条件,改变列的

宽度或者通过合并多个不同的列进行逻辑分组等功能。 第三部分是列(Columns),表格的实际数据被显示在各个不同的列中,在AdvWebGrid中每一列的外

表及类型都可以被定义。 第四部分是脚注(Footer),脚注常常用来显示文本信息,静态、动态列的合计情况等。 4.7.2 页面控制(Controller) AdvWebGrid的页面控制可以对表格内的数据进行分页管理。一页包含RowCount行,对于数据敏感

的表格来说,总的页数等于一个数据表内的总行数除以RowCount,面对于非数据敏感的表格来说,总行数等于TotalRows属性所设置的值。它可以提供诸如像前面、后页及直接转到某页的链接等形式来对页面进行控制,并通过以下属性及子属性来实现这些功能。

1.页面控制的主要属性

(1)对齐(Alignment):设置在Controller中显示文本的对齐方向。 (2)标题(Caption):设置在Controller中显示的标题,像表格的名称之类的东西。 (3)颜色(Color):设置Controller的背景颜色。如果指定clNone,则使用默认的浏览器背景色。 (4)字体(Font):设置Controller使用的字体。如果不进行设置,则使用默认的浏览器字体。 (5)渐变1(Gradient1):设置Controller中渐变的开始颜色。如果使用clNone,则不使用渐变色。渐变色

需要IE6支持。 (6)渐变2(Gradient2):设置Controller中渐变的结束颜色。 (7)渐变方向(GradientDirection):设置渐变的方面为水平或垂直方向。 (8)高度(Height):设置Controller的高度。如果高度为0,Controller的高度将自动适应Controller内部

元素的高度。 (9)首页提示(HintFirst):设置首页按钮的浮动提示。 (10)末页提示(HintLast):设置末页按钮的浮动提示。 (11)下页提示(HintNext):设置下一页按钮的浮动提示。 (12)上页提示(HintPrev):设置上一页按钮的浮动提示。

Page 368: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 368页/共 376页

(13)首页图形(ImgFirst):设置跳到首页的图形。可以是GIF、JPEG或BMP文件。只有当PagerType设置为cptimage的时候,这些图形才会被使用。

(14)末页图形(ImgLast):设置跳到末页的图形。 (15)下页图形(ImgNext):设置跳到下页的图形。 (16)上页图形(ImgPrev):设置跳到上页的图形。 (17)指示器格式(IndicatorFormat):设置Controller中浏览页的格式。这是一个标准的Delphi格式化串,

使用文本和数字。数字可以是记录号或者页号。 (18)设置IndicatorType为itpageNr,并置IndicatorFormat为‘(Page %d of %d)’,如果表格有12页的话,

将在Controller中显示为‘(Page 1 of 12)’。设置IndicatorType为itRecordNr,并置IndicatorFormato为‘This is record number %d’,将在Controller中为第一条记录显示为‘This is record number1’。

(19)指示器类型(IndicatorType):设置为itRecordNr,指示当前记录的索引号和总的记录数。如果置成itPageNr则标示当前页。如果IndicatorType置成itNone,则不显示指示器。

(20)最大页数(MaxPages):设置在Controller中显示的最大页,Controller会显示从当前所选的页到最大页数这样一个范围。

(21)页显示方式(Pager):选择页显示的外观。包括以下定义的值: 字母序列显示(cpAlphaList):十分可惜,尚未实现。 页列表显示(cpPageList):通过点击页号来完成翻页动作。 显示上一页、下一页(cpPrevNext):通过前一页、后一页链接来完成翻页动作。 显示首页、上页、下页、尾页(cpPrevNextFirstLast):通过首页、上页、下页、尾页链接来完成翻页。 (22)页显示类型(PagerType):通过以下参数设置页显示外观。 链接样式(cptLink):通过链接方式完成页的选择或者前、后翻页动作。 按钮样式(cptButton):通过按钮方式完成页的选择或者前、后翻页动作。 图像样式(cptImage):首页、尾页、前翻、后翻的外观由在ImgFirst、ImgLast、ImgPrev、ImgNext

属性中指定的图像表示,不这,该属性不能与Pager当中的cpPageList(页列表方式)互用。 (23)位置(Position):设置Controller在表格中的位置,可以取以下值。 上端(cpTop):Controller在表格的上端。 不显示(cpNone):不显示。 下端(cpBotton):Controller在表格的下部显示。 (24)首页提示文本(TextFirst):为首页按钮或链接设置提示文本。默认值是“First”。 (25)尾页提示文本(TextLast):为尾页按钮或链接设置提示文本。默认值是“Last”。 (26)下页提示文本(TextNext):为下页按钮或链接设置提示文本。默认值是“Next”。 (27)上页提示文本(TextPrev):为上页按钮或链接设置提示文本。默认值是“Prev”。 2.页面控制的相关事件

(1) OnGotopage:如果Controller的pager被设置成cpPageList,当用户选择一给定的页时该事件发生。 (2) OnFirstpage:如果Controller的pager被设置成cpPrevNext或者cpPrevNextFirstLast,,当用户选择转

向首页时该事件发生。 (3) OnLastPage:如果Controller的pager被设置成cpPrevNext或者cpPrevNextFirstLast,,当用户选择转

向尾页时该事件发生。 (4) OnNextPage:如果Controller的pager被设置成cpPrevNext或者cpPrevNextFirstLast,,当用户选择

转向下一页时该事件发生。 (5) OnPrevPage:如果Controller的pager被设置成cpPrevNext或者cpPrevNextFirstLast,,当用户选择

转向上一页时该事件发生。 3.与页面控制相关的几个杂项

(1) Page:供编辑使用的显示页数,可读写。

Page 369: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 369页/共 376页

(2) RowOffset:只读属性,当前页显示的第一条记录的行索引值,相关于页数(Page)乘以每页行数(RowCount)。

(3) Row:只读属性,当前行在页中的偏移值,从0开始计算。要得到数据表中实际的行索引值,可以用(RowOffset* RowCount)+ Row。对于非数据敏感的表格为讲,没有数据表中的当前行概念,因此,在非数据敏感表格中,当前行被一个公开属性ActiveRow所代替。

(4) RowTot:只读属性。在数据敏感表格中反映行的总数主,在非数据敏感表格中,可通过属性TotalRows存取。 7.2.9.2 表头控制(Header)

ShowColumnHeaders属性控制列头的显示与否,其他所有与列表头关联的内容通过Columns属性控制。Columns属性是一个TTWWebGirdColumn对象的集合,它控制着表格中每一列的表现形式。

当全局性的属性ShowColumnHeaders为真时,以下这些列的属性决定在浏览器中列表头的表现形式:

(1) ColumnHeaderAlignment:设置列头文本的对齐方式。 (2) ColumnHeaderCheckBox:为真时,在表头显示一个检查框。当然,只有当一个列的类型是

ctCheckBox的时候,才能在列头使用检查框。如果一个检查框在列头中显示,选择它将选择该列所有的检查框,同样,取消它也将取消该列所有的选择。

(3) ColumnHeaderClick:为真时,列头中的文本以链接的形式显示,点击该链接会执行ColumnHeaderClick事件。大多数情况下,多用于在一个数据敏感表格中,比如通过SQL语句来执行排序等处理。对于非数据敏感表格,如果SortSettings.sort属性为真的话,排序将是自动进行的。

(4) ColumnHeaderColor:为列头设置背景颜色。 (5) ColumnHeaderFont:为列头设置字体样式。 (6) ColumnHeaderGradientl:为列头指定一个渐变颜色的起始色。如果clNone被设置,则不使用渐

变色。注意,渐变特性只能用在IE6里面。 (7) ColumnHeaderGradient2:指定渐变颜色的终止色。 (8) ColumnHeaderGradientDirection:设置渐变渐变的方向为水平或垂直。 (9) Filter:为真时,FilterList会在列头中以组合框的形式显示出来。FilterIndex属性表示在组合框中

的选择值,如果一个数据表的过滤属性被设置,则在组合框中改变选择会产生OnFilterSelect事件。 (10) FilterIndex:表示在FilterList中的选择值。 (11) FilterList:在列头显示的供选择的值的列表。 (12) SubTitle:设置从表头中的文本。如果想建立从表头,则该属性不能为空。 (13) SubTitleSpan:设置子表头所跨单元格的数目。如果SubTitleSpan被置成2或更大的值,则在连

续列中的SubTitle属性被忽略。 (14) SubTitleValign:设置子表头垂直对齐属性。 (15) Title:设置主表头行的文本。 (16) TitleRowSpan:如果主表头与子表头显示在一个单元格内,设置该属性为真。 (17) TitleSpan:设置表头跨度的单元格数目。如果其值大于2或者更多,连续列中的Title属性将被

忽略。 (18) TitleValign:设置主表头的垂直对齐属性。

7.2.9.3 列的控制(Columns) TTIWDBAdvWebGrid和TTIWAdvWebGrid允许显示来自数据表或单元格内容的信息以及多种不同

的表格控制元素,像简单的文本单元格、带行号的超级链接、数据表编辑、保存、放弃按钮等等。 总是静态的单元格:这类型的单元格不能被编辑及显示混合数据。 动作单元格:为类型的单元允许一个固定的动作,比如处理一个按钮的点击事件。 可编辑的单元格:当表格在编辑状态时,一个单元格编辑器会显示该单元格内的数据。注意,设

Page 370: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 370页/共 376页

置一个表格进入编辑状态,同时也就整个行进入编辑状态。基于此,到服务器的联接限于从每个行的编

辑开始到结束期间。该行的所有单元格以一个单一的动作在编辑完成时也完成更新。 动态单元格:这类型的单元格始终处在编辑状态并显示客户端的计算值。 以上四种类型的单元格通过每列的Column.ColumnType属性设置,具体的属性见下面的介绍。 (1)ctNormal:包含普通文本单元格的列。它的Editor属性决定该可否进行编辑,以及哪种类型的编

辑被使用。 (2)ctCheckBox:包含用于行选择功能检查框的列。 (3)ctButton:包含按钮的列。按钮的标题通过ButtonText属性来进行设置。 (4)ctRowIndicator: 包含指标性图标的列。该图标可以显示当前行的浏览、编辑及插入三种状态。 (5)ctRowNumber: 显示行号的列。 (6)ctScroll: 文本显示在一个滚动盒中,适合应用于备注字段。 (7)ctPopup: 在单元格内显示文本的同时也显示一个按钮,点击该按钮则在一弹出窗口显示文本。 (8)ctPopupImage: 当鼠标移到图片上时,图片以完整大小显示出来,否则,图片的高度被限制在行

高以内。 (9)ctProgress: 列值(0到100之间)以一个光棒的样子显示出来,比如,用在对投票如果的分析上面等。 (10)ctLinkField: 以超级链接显示文本的列。点击超级链接则移动当前行到被点击的行上。 (11)ctLinkRowNumber: 以超级链接方式显示行号。点击该超级链接移动当前行到被点击的行上。 (12)ctDataCheckbox: 检查框的状态会影响单元格的行。检查框被选中时,单元格的值为

(13)CheckTrue,,未被选中时,单元格的值为CheckFalse。 (14)ctImage: 显示被赋值的ImageList中的图片。通过更改Imageindex属性的值来选择不同的图片。 (15)ctImageCheckbox: 显示检查框的列,检查框所使用的图片可以通过CheckTruePicture和

CheckFalsePicture属性进行定制。 (16)ctDatalmage: 显示被赋值的ImageList中的图片。通过更改单元格的值来选择不同的图片。 (17)ctURL; 以超级链接形式显示文本的列。如果文本没有http://前缀,其可以自动插入该前缀。 (18)ctEmail: 以电子邮件形式显示文本的列。mailto:前缀可被自动地加入。 (19)ctDataButton: 在当前行显示编辑、保存、中止按钮的列,显示的按钮依赖于数据表的状态。 (20)ctRadioButton: 显示收音机按钮的列。只有一个收音机按钮选择每列,允许通过其来选择行。 (21)ctDynEdit: 在该列所有单元格中显示编辑控件的列。显示的编辑控件的类型决定于DynEditor

属性的设置。 (22)ctDynText:在该列所有单元格中显示动态文本的列。动态文本的值由Formula属性计算而来。 (23)ctDynCheckbox:在该列所有单元格中显示检查框的列。检查框的改变引起动态值的更新。检查

框的状态可以在formula属性中使用,1代表选中检查框,0代表没有选中。 (24)ctDynCombo:在该列所有单元格中显示组合框的列。组合框的条目由ComboItems属性来设置。

组合框选择的变化引起动态值的更新。 (25)ctNode:该列显示一个结点,用于隐藏或显示明细行。通过表格的Nodes属性来进行设置。 2.内嵌编辑器

对数据敏感表格,当前数据表的当前行在内嵌编辑器显示;对于非数据敏感表格来说,ActiveRow被显示。

(1)edNone:在该列没有使用编辑器。换句话说,即该列是只读的。 (2)edEdit:该列的内嵌编辑器允许任意文本的输入。 (3)edPassword:内嵌编辑器为密码编辑样式。 (4)edCombe:内嵌编辑器为组合框样式。组合框的值通过ComboItems来设置。 (5)edMemo:内嵌编辑器为文本区编辑样式。 (6)edCheckbox:内嵌编辑器为检查框编辑样式。

Page 371: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 371页/共 376页

(7)edEditNumberic:内嵌编辑器为只能接受字符0~9的编辑控件。 (8)edEditFloat:内嵌编辑器为只能接受字符0~9及小数点分隔符的编辑控件。上数点分隔符由

DecimalSeparator属性设置。 (9)edEditLower:内嵌编辑器为自动转换输入字符为小写状态的编辑控件。 (10)edEditUpper:内嵌编辑器为自动转换输入字符为大写状态的编辑控件。 (11)edEditHex:内嵌编辑器为只能授受0~9及A~F字符的十六进制编辑控件。 (12)edDatePicker:内嵌编辑器为一个日期选择器。其显示格式与日期分隔符由DateFormat和

DateSeparator来确定。 (13)edSpinEdit:内嵌编辑器是一个调节编辑控件。 3.动态编辑

动态编辑列和动态文本列均可用于数据敏感及非敏感表格,只在客户端执行计算。看下面的例子,

数量(Quantity)列包含动态编辑控制,税(Tax)列和合计(Total)列包含动态文本,动态文本列的值依赖于ListPrice列和Quantity列中的值。如图7-2-4所示。

图 7-2-4 TMS表格的动态编辑

Tax和Ttoal的公式定义为: Tax=0.16*Quantity*ListPrice Total=1.16*Quantity*ListPrice 在TTIWDBAdvWebGrid(或者在TTIWDBAdvWebGrid)中设置Quantity列的列类型为ctDynEdit,设置

Tax和Total列类型为ctDynText。然后通过每列的Formula属性为动态文本列设置计算公式。在公式的设置过程中可以用C1,C2,…Cn表示某一列的值。

在此例中,为Tax列设置Formula:=C3*C2/100*16;为Total列设置Fonrmula:=C2*C3*1.16。 DynEdit属性控制动态文本输入,包含以下几个不同的选择。 deText:允许以动态形式输入任何文本。 deUnsigned:允许输入无符号数字。 deSigned: 允许输入有符号数字。 deFloatUnsigned: 允许输入无符号浮点数字。 deFloatSigned: 允许输入有符号浮点数字。 DynPrecision属性控制动态文本计算结果中的显示位数。 Grid,DynEdits[A Column, ARow]属性返回一个字符串,可以设置或返回数据表格中对应行列位置的

动态编辑器的值。例如,设置3列7行的值可以使用:Grid.DynEdit[2,6]:=’1234’。注意:行列索引均是以0开始计数的。

4.基于数据字段组合及动态数据的模板

Page 372: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 372页/共 376页

此特性只能用于TTIWDBAdvWebGrid。正常情况下,为一个列选择数据表是通过设置DataField属性来实现的,使用模板允许组织多个字段及在一个列中对其进行格式化。点击Columns中的Template属性,打开HTML编辑器,如图7-2-5所示。

图 7-2-5 TMS表格的 HTML编辑器

通过上面的例子可以看出,格式化的 HTML文本通过(#字段名)来引用数据表的字段内容。当产生

表格时,TTIWDBAdvWebGrid会自动替换标志串(#字段名)为对应的数据表中字段的内容。 为更好地使用模板,可以利用事件句柄 OnGetCellData 通过编程更加灵活地来改变或者生成列。

该事件的定义如下: GetCellData(Sender:TObject;RowIndex,ColumnIndex:Integer;var AValue:String); 此事件在浏览器重画每个单元格时被触发,允许在服务器发送数据到浏览器之前改变动态数据。

下面的例子为第四列模拟显示Windows式样的小圆点: Procedure TformMain.TIWDBAdvWebGridlGellData(Sender:TObject;RowIndex, ColumnIndex:Integer;var AValue:string); begin if(ColumnIndex=4)then

if Length(AValue)>15then AValue:=Copy(AValue,1,15)+‘…’

end; 5.列的宽度控制

可以通过不同的标识符来限定列的宽度:none、percent、absolute,绝对宽度标识符可以像 Delphi或 C++Builder 窗体中的其他控件一样在表格中被精确地定位。当设置列的宽度为 wsAbsolute 时,宽度以像素为单位通过Width属性来设置,对于用 wsAbsolute定义的列宽类型,设置 AllowSizing为真或者对全局属性 ColumnSizing赋真值,都可允许用户在浏览器中调整列的宽度。 7.2.9.4 脚注控制(Footer)

表格的脚注非常类似表头的功能,ShowFooter属性为真时,显示脚注。通过在 Columns中的每列

Page 373: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 373页/共 376页

的肢注属性来设置其式样。 (1)FooterAlignment:为脚注文本设置对齐方向。 (2)FooterFormat:为计算脚注值设置一个格式化串。 (3)FooterText:脚注显示的文本。 (4)FooterType:脚注的类型,包括以下几类: ftText:包含静态文本的脚注。 ftPageSum:脚注包含服务器端该列单元格值的和。 ftPageMin:脚注包含服务器端该列单元格值中的最小值。 ftPageMax:脚注包括服务器端该列单元格值中的最小值。 ftPageAvg:脚注包含服务器端该列单元格值的平均值。 ftNone:空的脚注。 ftDynSum:脚注包含客户端该列单元格值的和。 ftDynMin:脚注包含客户端该列单元格值中的最小值。 ftDynMax:脚注包含客户端该列单元格值中的最大值。 ftDynAvg:脚注包含客户端该列单元格值的平均值。 动态产生的值只能对包含 ctDynText或 ctDynEdit式样的列起作用,对其他列类型的值不能够在浏

览器中被更新。另外,服务器端的脚注计算结果的格式设置要通过 FooterFormat属性来设置。例如:FooterFormat:=‘平均值为%.2f’,此格式串将对 ftPagAvg类型的脚注产生一个 2 位小数的输出,对于 ftPagAvg来说,将由 DynPrecision决定要显示的小数位数。 7.2..9.5 TMS表格的高级应用 在本节中,主要介绍了对于 TMS 高级表格控件 TTIWDBAdvWebGrid(或者 TTIWAdvWebGrid)应用中所涉及到的单元格(行)的选择操作、如何控制行的颜色、如何使用明细行、定制表格及使用客户端事件等内容。

1.单元格及行的选择

(1)利用检查框实现多行的选择 在Web应用中,对于表格中行的选择,直觉或者熟悉的界面是像在 HotMail中选择信件那种基于

检查框的操作。这种操作在 TTIWDBAdvWebGrid 和 TTIWAdvWebGrid 中通过添加一个 ctCheckBox类型的列来实现,如果检查框被选择,在列表头的 ColumnHeaderCheckbox 为真,则选择行且以SelectColor/SelectFontColor 显示它,选择的主动权完全掌握在客户端,服务器端的应用可以通过行的属 性 RowSelect[RowIndex:Integer]:Boolean 来 获 取 被 选 行 的 状 态 。 如 果 在 表 头 设 置 了

ColumnHeaderCheckbox的话,通过它可以全选或全消每行的检查框。 以下的代码显示了如果选择行并删除行的操作: Var i,numde1:=0; begin

numdel:=0; //对页数中的所有行循环操作 for i:=1 to TIWDBAdvWebgrid1.RowCount do begin //对页内行的状态 if TIWDBAdvWebGrid1.RowSelect[TIWDBAdvWebGrid1.RowOffset+i-1]then begin

//在数据表中找到行并删除它 Table1.First;

Page 374: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 374页/共 376页

Table1.MoveBy(TIWDBAdvWebGrid1.RowOffset+i-1-numdel); Table1.Delete; Inc (numdel);

End; End;

End; 除非是 SelectPersistent 属性为真,否则被选择的行不会被记忆,如果置成真的话,表格会为所有

页记忆被选择的行,并允许通过 RowSelect[RowIndex:Integer]属性预置选择。 当点击检查框时,OnCheckClick事件被触发,若事件句柄已赋值,则会为每个检查框的点击事件

产生一个到服务器的连接。 (2)通过在单元格上的鼠标点击来选择。 使用检查框来选择行不是惟一的办法,使用属性MouseSelect,也可以实现行的选择。该属性有以

下几个选项: msRow:单击选择行,再一次单击取消当前行的选择而选择另一新行。 msSingleCell:单击选择一个单元格,并取消先前被选的单元格,OnCellClick事件同时被触发,如

果事件处理句柄被赋值的话,每一次点击会产生一个到服务器的连接。 msRowCheck:同检查框类似,单击选择一个行。如果SelectPersistent为真,被选择行的状态会记录

下来,且可以通过Grid.RowSelect[RowIndex:Integer]:Boolean来存取。 msMove:单击将移动数据表游标到被击行。 提示:如果Grid的AutoEdit属性为真的话,当鼠标点击事件发生在一个已被选的行上,则表格会自

动转到编辑状态。 2.控制行的颜色

通常情况下,单元格的颜色通过每列的Color属性设置。作为扩展应用,onGetCellProp事件允许动态地来改变行及单元格的颜色,对于快速应用某些常用的色彩方案,这是相当方便的。在

TTIWDBAdvWebGrid中,通过交替色彩光条、被选色、编辑色及鼠标悬停时的颜色来实现。 (1)交替色彩光条:通常用于交替相邻的行。Grid.Bands.Active设备是否显示交替色彩光条,

Grid.Bands.PrimaryColor 和Grid.Bands.SecondaryColor来设置光条的颜色。 (2)被选色:如果ShowSelect为真的话,被选择的行会以SelectColor和SelectFontColor属性中指定的

颜色来显示。 (3)编辑表格处在编辑状态时,正被编辑的行会以EditColor中指定的颜色来显示。 (4)鼠标悬停时的颜色:当鼠标悬停在某行时,该行则会以HoverColor和HoverFontColor中指定的颜

色来显示。 提示:如果这些颜色属性被置成cINone,以上这些行的颜色方案则不会被使用。 3.排序控制

TTIVSBA dvWebGrid没有内建的排序机制,其排序是通过设置不同的查询条件来实现的。TTIVSBA dvWebGrid的内建查询由全局的Gird.SortSettings.Show为真来控制。如想进一步对某些列进行排序控制,可对这些列的ColurnnHeaderClick置真来实现。

对于TTIVSBA dvWebGrid,为OnColumnHeaderClick事件建立一个普通的排序例程,在这个事件处理中改变查询条件,为被点击的列进行排序,或者是为先前已排序的列改变排序方向。表格会为排

序的列在其表头显示一个向上或向下的箭头为表示增减序。 TTIWAdvWebGrid具有同样的实现原理,其差异在于TTIWAdvWebGrid对排序的执行是内部的,决

定于更新排序列的SortSetting属性,每次在列表头的点击均会引起增减序的改变,显示在每列的数据类型要有正确的比较过程才能完成其自身的排序。

TTIWdvWebGrid中的属性SortFormat可以取以下值:

Page 375: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 375页/共 376页

sfAlphabetic:字母序列。 sfNumerc:整形及浮点数序列。 stDate:日期序列。 4.使用明细行

明细行功能提供了只有当用户选择打开它时才显示记录的创加信息的能力。有以下主要属性: (1) DetaiRowHeight:设置明细地的高度。如果其值是0,则明细行高度自适应明细行内的信息。 (2) DetaiRowShow:选择明细显示的方法。正常类型是每个打开的明细行不影响其他的明细行;另

外一种情况是打开一个明细行会自动关闭其他已打开的明细行。 (3) DetaiColor:在当前列设置明细行的背景颜色。 (4) DetaiSpan:从当前列设置明细行的跨栏数目。 (5)DetaiTemplane:为在明细行内显示的信息设置一个模板。其工作方式类似前面介绍的在列中显

示组合数据字段的模式。例如:<FONT size=“2” face=Verdana>(#Notes)</FONT>,此模板将在明细行信息会触发OnGetCellDetail事件句柄处理程序。

5.定制自己的表格

在表格中可以为每一列加入列更多的属性及约束条件,这使得程序更加具有灵活性。要想实现个

性化定制表格,首先要从TTIWWebGridColumn及TTIWWebGridColumns中创建继承类。在TTIWWebGridColumn中要加入新的属性,而在TTIWWebGridColumns中重载某些方法,诸如GetltemClass,Add,Insert及公开的条目属性。例如:

TTIWMyWebGridColumn=class(TTIWWebGridColumn) Private FMyProperty:string; Procedure SetMyProperty(const Value:string); Published Property MyProperty:string read FMyProperty writeSetMyProperty; End; TTIWMy WebGeidColumns=class(TTIWWebGridColumns) Private function Getlten(Index:Integer):TTIWWebGridColumn; procedure Setltem (Index:Integer,const Value:TTIWMy WebGridColumn); public function GetltemClass:TCollectionItemClass;overider; function Add:TTIWMy WebGridColumn; function Insert (index:Integer):TTIWMy WebGridCohumn; property Items[Index:Integer]:TTIWMy WebGridColumn property Items[Index:Integer]:TTIWMy WebGridColumn read Getltem Write Setltem;default; end; 创建一个自己的表格,并且创建刚才定义的TTIWMy WebGrid Columns集合。 TTIWMyAdv WebGrid=class(TTIWCastomWebGrid) Private Public Function CteateCohumns:TTIWMy WebGridColumnd;override; Published End; 对CreateColumns方法进行重载。

Page 376: Delphi(7 2007) 下 用 IntraWeb 开发 WEB 程序应用实战read.pudn.com/downloads537/ebook/2220118/Delphi_Intraweb... · 2009-03-08 · 1.8 Intraweb 与Ajax 技术 ... 《Delphi

《Delphi 下用 IntraWeb 开发WEB程序应用实战》 7.2 TMS For IntraWeb控件简介 作者:高勇

版权为作者所有 集结出版请与作者联系地址:西安市金花北路 16号 邮编:710032 电话:029-84755132,13572934967 索要所有源代码请与作者联系 [email protected] 博客: http://blog.163.com/you888@188

第 376页/共 376页

Function TTIWMyAdvWebGrid.CreateColumns;TTIEWebGridColumns; Begin Result=TTIWMyWebGridColumns.Create(Self); End; 在Unit片段里加入 上代码,安装TTIWMyAdvWebGrid控件时新的属性也会被加入。 6.使用客户端事件

书写JavaScript代码并处理浏览器中的如下事件:Button点击、Image点击、Cell点击及文本编辑。JavaScipt代码以TStringList的形式加入到ClientEvent属性中,这些代码插入到事件处理句柄内部并在浏览器中被执行。在JavaScipt代码中任何错误都有可能潜在地引起表格不再正常工作,而脚本错误会显示在浏览器中。

在JavaScript中,有许多可以执行的功能模块,要想调用这些方法必须在所有的功能模块前加上“Gx”前缀。x指的是表格的ID属性。可用的方法包括:

(1) GxGetEditRow(): 返回当前被编辑行的索引。 (2) GxIsEditing():如果一个表格在编辑状态,则返回真。 (3) GxGetCelIValue (c,r):返回单元格(c,r)的值。只对文本格式的单元格有效,不能对有控件或图像

的单元格使用。 (4) GxSetCelIValue (c,r,value):设置单元格 (c,r)的值。 (5) GxGetEditValue (c,r): 返回单元格(c,r)中编辑控件的值。 (6) GxSetEditValue (c,r,value): 设置单元格 (c,r)中编辑控件的值。 当ButtonClick、ImageClick、CellClick、EditDown等事件被调用的时候,变量c、r指明引起事件触

发的单元格。例如下列代码先检查表格是否处于编辑模式,如果是的话,预设内嵌编辑器的值。 If (!G0IsEditing()) { Alert(“不在编辑模式下,不能对单元格中编辑控件预设值”); Return; } i=G0GetEditRow(); G0SetEditValue(3,i,“Danny”); G0SetEditValue(4,i,“Thorpe”); G0SetEditValue(5,i,“Borland”); 在上面的JavaScript代码里,G0IsEditing、G0setEditValue函数中的0指的是表格的ID属性。 提示:因为JavaScript是大小写敏感的,当出现JavaScript错误时,首先考虑的一点是自己的拼写错

误。