|
第三,也是最值得研究的是IWGrid组件转换成了带框架和不带框架的HTML表格。这是表格中的一行HTML代码片断: <tr> <td valign="middle" align="left" NOWRAP> <font style="font-size:10pt;">Row 2</font> </td> <td valign="middle" align="left" NOWRAP> <font style="font-size:10pt;">IWTwoForms by Marco Cantù</font> </td> <td valign="middle" align="left" NOWRAP> <font style="font-size:10pt;"></font> <a href="#" onclick="parent.LoadURL(''''http://www.marcocantu.com'''')" id="TIWURL1" name="TIWURL1" style="z-index:100;font-style:normal;font-size:10pt;text-decoration:none;"> Click here</a> </td> </tr> 提示:在上面的代码清单中,我们注意到URL是通过JavaScript来激活链接的,而不是直接的超链接。由于IntraWeb允许客户端所有动作,比如确认、检查和提交,而这些动作都依赖于JavaScript。例如,如果你把一个组件的Required设成true,则该组件如果没有任何数据就不能提交,此时如果提交将会看到一个JavaScript错误信息(使用组件的FriendlyName属性来定制的消息框)。
本例的核心特性是它显示第二个页面的能力。为了实现这一点,首先需要给程序添加一个IntraWeb页,方法是单击File->New->Other…,启动Delphi的New Items对话框,翻到IntraWeb页,选择Application Form,单击“Ok”按钮完成添加工作。接着向该窗体上放一些组件,然后在主窗口中放置一个按钮或其他控件用来显示第二个窗体: procedure TformMain.btnShowGraphicClick(Sender: TObject); begin anotherform := TAnotherForm.Create(WebApplication); anotherform.Show; end;
即使程序调用了Show方法,也会被看成是调用了ShowModal。这是因为IntraWeb把页面当成堆栈来处理。最后显示的页面在栈顶,同时显示在浏览器上。如果关闭该页(隐藏或销毁),就会显示该页的前一页。在本例中,第二页的关闭是通过调用Release方法,该方法在VCL程序中是结束正在运行的窗体的恰当方法。你也可以隐藏第二个窗体然后再显示它从而避免每次都重建窗体的实例。
警告:在例程中的主窗体上放置了一个Close按钮,但该按钮没有调用Release方法,而是调用了WebApplication对象的Terminate方法。该方法可以传递输出信息,如WebApplication.Terminate(‘goodbye’);例程中使用了另一种替换方法:TerminateAndRedirect。
现在已经知道如何创建带有两个窗体的IntraWeb程序,接着我们简要地考查一下IntraWeb是如何创建主窗体的。当创建一个新程序时,在项目文件里有由IntraWeb向导产生的相关代码: begin IWRun(TFormMain, TIWServerController);
这一行不同于Delphi的标准项目文件,因为它调用了一个全局函数而不是应用全局对象的方法。函数的两个参数分别是主窗体的类和IntraWeb控制器的类。该控制器能够处理会话期和许多特性,稍后就会介绍。
例程中的第二个窗体显示了IntraWeb另外一个有趣的特性:图形支持。该窗体有一个显示雅典娜神像的图形组件,这是通过把一个位图装载进一个IWImage组件中实现的:Intraweb把这个位图转换成JPEG格式,并存到创建于程序所在文件夹内的cache文件夹中,然后再返回该JPEG文件的引用。其相应HTML代码如下: <img src="/cache/JPG1.tmp" name="IWIMAGE1" border="0" width="153" height="139">
该例程使用的IntraWeb另外一个特性是用户可以用鼠标点击图像,并通过运行服务器端代码来实现修改图像的功能。在本例中,修改的结果是画绿色的小圆圈。

代码如下: procedure Tanotherform.IWImage1MouseDown(ASender: TObject; const AX, AY: Integer); var aCanvas: TCanvas; begin aCanvas := IWImage1.Picture.Bitmap.Canvas; aCanvas.Pen.Width := 8; aCanvas.Pen.Color := clGreen; aCanvas.Ellipse(Ax - 10, Ay - 10, Ax + 10, Ay + 10); end; 警告:绘制操作是发生在位图的画布(canvas)上。不要使用Image组件的画布(在VCL组件Image中是可以这样做的),也不要使用JPEG图像,否则不是没有响应就是出运行错误。
会话期管理
注:Session就是通话、话路。在打电话的时候,通常情况下每一对用户拥有一个话路,否则就会“窜线”了。在本章中,Session就是指客户端的一个用户和服务器交互的话路,或者称为交互通道。由于其他书籍中把Session译作“会话期”,这里沿用该译法。——译者。
如果你有一些Web编程经验,就会知道会话期管理是一个复杂的话题。IntraWeb提供预定义的会话期管理并且简化使用会话期的方法。如果在一个指定的窗体中需要会话数据,需要做的是给该窗体加一个域。IntraWeb窗体和组件会为每一个会话期创建一个实例。比如,在例程IWSession中,我给窗体添加一个域叫做FormCount,为了对比,我又在全局单元里声明一个全局变量GlobalCount,这个变量会被程序的所有实例所共享。
为了加强对会话数据的控制同时让多个窗体共享它,可以定制TuserSession类,该类是IntraWeb应用程序向导在ServerController单元中自动产生的。在例程IWSession中,我是这样定制的: type TUserSession = class public UserCount: Integer; end;
IntraWeb 为每个新的会话期创建对象的实例,参阅ServerController单元中TIWServerController类的IWServerControllerBaseNewSession方法: procedure TIWServerController.IWServerControllerBaseNewSession( ASession: TIWApplication; var VMainForm: TIWAppForm); begin ASession.Data := TUserSession.Create; end;
在代码中,会话期对象可以通过访问RwebApplication这个全局变量的Data域来引用,这个变量通常用来访问当前用户的会话期。
提示:RwebApplication是线程变量,在IWInit单元中定义。她提供了访问会话期数据的线程安全方法:在多线程环境下访问它需要倍加小心。该变量可以在窗体和控件之外使用(基于线程的),这就是为什么主要用在数据模块、全局程序和非IntraWeb类内的原因。
此外,默认的ServerController单元提供一个可用的辅助函数: function UserSession: TUserSession; begin Result := TUserSession(RWebApplication.Data); end;
因为大多数代码已经自动产生了,像下面从例程IWSession中提取的代码那样,只需给TuserSession类添加数据,就可用通过UserSession函数简单地应用了。在例程中,单击按钮,程序会累加几个计数器(一个全局变量,两个会话期指定的)并通过标签显示它们的值: procedure TformMain.IWButton1Click(Sender: TObject); begin InterlockedIncrement (GlobalCount); Inc (FormCount); Inc (UserSession.UserCount); IWLabel1.Text := ''''Global: '''' + IntToStr (GlobalCount); IWLabel2.Text := ''''Form: '''' + IntToStr (FormCount); IWLabel3.Text := ''''User: '''' + IntToStr (UserSession.UserCount); end;
注意,程序通过调用Windows的InterlockedIncrement来避免被多线程所共享的全局变量发生访问冲突。也可以通过使用critical section或者是TidThreadSafeInteger(见于IdThreadsafe单元)来避免这种情况。
上一页 [1] [2] [3] 下一页 [聊天工具]Gmail推出新功能:Web Clip__天极Yesky [聊天工具]Web MSN你玩了吗__天极Yesky [系统软件]Web Browser Express 概述 [系统软件]对Internet Explorer Web 控件做一点修改 [常用软件]小技巧:三步实现Web迅雷录制PPLive节目 [常用软件]天网防火墙:打开WEB和FTP服务 [VB.NET程序]使用VB.Net做一个配置web.config功能的WinForm(原… [VB.NET程序]vb.net控件、web service简述 [VB.NET程序]使用vbscript脚本调用web服务 [VB.NET程序]*** Web 存储系统窗体:窗体注册表 (new)***
|