使用 IntraWeb (45) - 活用 IntraWeb
asp.net 刚开始时, 也是拖拉控件, 但后来有了 MVC、xNext.
换个思路使用 IntraWeb 吧:
界面全部用 html+js+css 实现(有些会是用 Delphi 动态生成), 然后用 js 通过 Ajax 调用 Delphi 的方法.
测试程序要使用的模板 IWForm1.html:
1、在程序所在目录建立 Templates 文件夹, 把 IWForm1.html 放其中.
2、在程序所在目录建立 wwwroot 文件夹, 把模板中用到的 IWForm1.js 和 IWForm1.css 放其中.
3、其中的 AjaxFun1() 方法是在 IWForm1.js 中实现的; 这里两次调用参数分别是 1、2
4、{%IWLabel1%} 中的 IWLabel1 是在 Delphi 中添加的控件, 它用来返回数据结果.
IWForm1.js:
function AjaxFun1(n) {
executeAjaxEvent("&x="+n, null, "IWCallBack1", false, null, false);
}
1、executeAjaxEvent 或 processAjaxEven 方法是 IntraWeb 内置的 IWLib.js 提供的; 其第三个参数决定了它将调用 Delphi 中的 IWCallBack1 方法.
2、Delphi 收到的参数将是一个 TStringList, 上面的 n 是将要传递的参数, x 是随意命名的参数标示.
IWForm1.css:
div { padding: 16px; }
#div2 { background-color: green; color: #fff; }
#IWLABEL1 { font-size: large; }
这是随意定义的; IWLABEL1 对应的是在 Delphi 添加的 IWLabel1.
//在新建 IW 主窗体上放置 IWTemplateProcessorHTML1、IWLabel1 两个控件. unit Unit1; interface uses
Classes, SysUtils, IWAppForm, IWApplication, IWColor, IWTypes, IWVCLComponent, IWBaseLayoutComponent, IWBaseContainerLayout, IWContainerLayout,
IWTemplateProcessorHTML, IWCompLabel, Vcl.Controls, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompButton, IWCompEdit; type
TIWForm1 = class(TIWAppForm)
IWLabel1: TIWLabel;
IWTemplateProcessorHTML1: TIWTemplateProcessorHTML;
procedure IWAppFormCreate(Sender: TObject);
public
procedure DoCallBack1(EventParams: TStringList); //这是 IWForm1.js 将要调用的方法; 下面还需要通过 WebApplication.RegisterCallBack 注册一下
end; implementation {$R *.dfm} uses IW.Common.AppInfo; //获取路径需要 var gPath: string; procedure TIWForm1.IWAppFormCreate(Sender: TObject);
begin
LayoutMgr := IWTemplateProcessorHTML1; //关联模板(IWForm1.html)
IWTemplateProcessorHTML1.RenderStyles := False; //禁用 IW 的样式设置 WebApplication.RegisterCallBack('IWCallBack1', DoCallBack1); //注册回调; js 将通过指定名称("IWCallBack1")调用这里的 DoCallBack1 方法 gPath := TIWAppInfo.GetAppPath + 'Data.txt'; //用于测试文件的路径 if not FileExists(gPath) then //初始化测试文件
begin
with TStringList.Create do begin
Add(DateTimeToStr(Now));
SaveToFile(gPath, TEncoding.UTF8);
Free;
end;
end; IWLabel1.RawText := True; //指定以 Html 的方式呈现其内容; 具有 RawText 属性的几个控件中, 发现 IWLabel1 最灵活.
IWLabel1.StyleRenderOptions.RenderSize := False; //既然前面已经指定了 IWTemplateProcessorHTML1.RenderStyles := False; 下面这些就应该不需要了, 但在 IE 下不行
IWLabel1.StyleRenderOptions.RenderPosition := False;
IWLabel1.StyleRenderOptions.RenderFont := False;
IWLabel1.StyleRenderOptions.RenderZIndex := False;
IWLabel1.StyleRenderOptions.RenderVisibility := False;
IWLabel1.StyleRenderOptions.RenderStatus := False;
IWLabel1.StyleRenderOptions.RenderAbsolute := False;
IWLabel1.StyleRenderOptions.RenderPadding := False;
IWLabel1.StyleRenderOptions.RenderBorder := False;
end; procedure TIWForm1.DoCallBack1(EventParams: TStringList);
var
List: TStringList;
x: Integer;
begin
x := EventParams.Values['x'].ToInteger; //获取 js 传来的参数 List := TStringList.Create;
List.LoadFromFile(gPath, TEncoding.UTF8); case x of
1: List.Add(DateTimeToStr(Now)); //参数是 1 表示添加
2: if List.Count > 0 then List.Delete(0); //参数是 2 表示删除
end; IWLabel1.Text := List.Text.Replace(sLineBreak, '<br/>'); //呈现; List.SaveToFile(gPath, TEncoding.UTF8);
List.Free;
end; initialization
TIWForm1.SetAsMainForm; end.
思路很简单, 在实践中可能会碰到一些小问题, 譬如:
1、如果真传到服务器, 那个 Data.txt 修改其属性为可写;
2、通过 executeAjaxEvent 传递中文参数时, 我在本机没发现问题, 但传到服务器不行了, 最后自己写了一个编码(js)、解码(Delphi)函数; 如果你需要可以告诉我.
不过都是小问题.
测试源文件(IW_MVC_Test.rar), 传到 "intraweb交流群 319037363" 了; 欢迎指正!
使用 IntraWeb (45) - 活用 IntraWeb的更多相关文章
- 用做网页开发经历了三个阶段(附长篇讨论) good
用做网页开发经历了三个阶段:第一阶:傻干阶段使用Intraweb,傻瓜型,无需知道javascript,html,css,会pascal就可以了. 第二阶:困惑阶段使用Intraweb,有很多限制,比 ...
- Delphi7目录结构----初学者参考
打开Delphi的安装目录,如C:\Program Files\Borland\Delphi7,你将会看到目录下包含了一些文件和文件夹: ² Source:存放的是Delpi提供的所有源 ...
- Delphi7目录结构
Delphi7目录结构 打开Delphi的安装目录,如C:\Program Files\Borland\Delphi7,你将会看到目录下包含了一些文件和文件夹:Source:存放的是Delpi提供的所 ...
- 使用delphi+intraweb进行微信开发4—微信消息加解密
示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. 在上一讲当中我做了个简单的微信文本消 ...
- 使用delphi+intraweb进行微信开发3—微信消息处理
示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. 在第二讲使用delphi+intra ...
- 使用delphi+intraweb进行微信开发2—intraweb以.net方式发布(以asp.net mvc4模式部署)在IIS(.net虚拟主机)上
在第一讲使用delphi+intraweb进行微信开发1--微信平台接入中我们编写了一个简单的微信接口程序,这个程序我是用Stand Alone Server / Service 方式编译的程序,并且 ...
- 使用delphi+intraweb进行微信开发1--微信平台接入
示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. iw14.0.50来了,在新的版本中 ...
- 使用 IntraWeb (42) - 测试读取 SqLite (一)
为通过 FireDAC(XE5开始支持的) 使用 SqLite, 现在已换成 XE6 + IntraWeb v14.0.32 Ultimate. 首先把官方提供的 C:\Users\Public\Do ...
- 使用 IntraWeb (39) - THttpRequest、THttpReply
在其它服务器脚本语言中熟悉的 Request.Response(THttpRequest.THttpReply) 在 IntraWeb 中算是幕后英雄了, 用户基本不需要直接操作它们了. IW 默认 ...
随机推荐
- MYSQL EXPLAIN 很慢的原因
今天同事在查看一个SQL的执行计划的时候,EXPLAIN语句跑了2分钟.SQL命令类似: SELECT * FROM (SELECT USERID,COUNT(*) FROM TBNAME GROUP ...
- python xlwt,xlutils 在excel里面如何插入一行数据
就是把插入行之后值重新输出来. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import xl ...
- (C++) CreateThread
先理解一下函数原型: HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, // 指向SECUR ...
- Linux Bash 使用$?来防止一些误删操作
在shell脚本中如果不加任何检查机制,很有可能导致误删的出现,例如: cd $remove_directory rm * 这段代码的目的是删除目标目录下所有的文件.但是如果目标目录由于输入错误等原因 ...
- 【转】C#环形队列
概述 看了一个数据结构的教程,是用C++写的,可自己C#还是一个菜鸟,更别说C++了,但还是大胆尝试用C#将其中的环形队列的实现写出来,先上代码: 1 public class MyQueue< ...
- PHP基础课程学习总结
时间过得很快,不知不觉中过去了一个月,PHP基础课程已经学完了.休息这几天中,睡觉起来,整理下笔记,几天的假期又过去了,明天正式开始PHP的专业课程,新的征途又要开始了.开发整站时发现,过去整站做得太 ...
- 7.arm汇编 bic和orr指令
1. bic BIC指令的格式为: BIC{条件}{S} 目的寄存器,操作数1,操作数2 BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中. 操作数1应是一个寄存器, 操作数2可以是一 ...
- SqlDataReader的使用
1.建立数据库连接: 2.设置数据库指令: 3.数据拾取器接收输出的数据: 4.遍历打印数据: using System; using System.Collections.Generic; usin ...
- 窗口 超类化 子类化 HOOK
body { font-family: Bitstream Vera Sans Mono; font-size: 11pt; line-height: 1.5; } html, body { colo ...
- EMR,电子病历(Electronic Medical Record)
电子病历 电子病历(EMR,Electronic Medical Record),也叫计算机化的病案系统或称基于计算机的病人记录(CPR,Computer-Based Patient Record). ...