使用 IntraWeb (45) - 活用 IntraWeb

asp.net 刚开始时, 也是拖拉控件, 但后来有了 MVC、xNext.

换个思路使用 IntraWeb 吧:
界面全部用 html+js+css 实现(除了动态生成的), 然后用 js 通过 Ajax 调用 Delphi 的方法.


测试程序要使用的模板 IWForm1.html:

添加
删除

{%IWLabel1%}

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); //注册回调

  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, ‘‘); //呈现; 

  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

时间: 2024-10-13 00:49:57

使用 IntraWeb (45) - 活用 IntraWeb的相关文章

用做网页开发经历了三个阶段(附长篇讨论) good

用做网页开发经历了三个阶段:第一阶:傻干阶段使用Intraweb,傻瓜型,无需知道javascript,html,css,会pascal就可以了. 第二阶:困惑阶段使用Intraweb,有很多限制,比如资料少,界面不容易做漂亮,没有源代码等等.于是转向研究其他开发工具.首先吸引眼球的是Nodejs,前后台用一种语言Javascript,爽,运行速度也不赖.随着PHP7的发布,注意力也被PHP7的高性能所吸引,玩了一阵PHP7.当然还有以前摸过的Tomcat/asp.net,各种框架一大堆.还有,

Delphi7目录结构

打开Delphi的安装目录,如C:\Program Files\Borland\Delphi7,你将会看到目录下包含了一些文件和文件夹:Source:存放的是Delpi提供的所有源码,包括VCL.WEBSNAP.IntraWeb.ToolsAPI等的源码,我们平时要查找delphi的源码就可以到这里查找.还有一些Delphi提供的工具的源码也放在其下,如borland socket server(ScktSrvr.exe)的源码.IntraWeb的调试用的Web服务器(HTTPSrvr.dpr)

豆瓣电影TOP250

for ($start = 0; $start < 250; $start += 25) {     $url = "http://movie.douban.com/top250?start=$start&filter=&type=";     $titles = parsePage($url);     if ($titles === false) {         echo $url, "\n";     } else {        

使用 IntraWeb (31) - IntraWeb 的 Xml 操作使用的是 NativeXml

在 IWNativeXml 单元. 知道了这个, 以后在其他 Delphi 程序中也可以直接 Uses IWNativeXml 了. TNativeXml (IWNativeXml.TNativeXml property AbortParsing: Boolean property BinaryEncoding: TBinaryEncodingType property CommentString: UTF8String property DropCommentsOnParse: Boolean

使用delphi+intraweb进行微信开发2—intraweb以.net方式发布(以asp.net mvc4模式部署)在IIS(.net虚拟主机)上

在第一讲使用delphi+intraweb进行微信开发1--微信平台接入中我们编写了一个简单的微信接口程序,这个程序我是用Stand Alone Server / Service 方式编译的程序,并且将端口设置成80进行的微信接口测试,但是实际使用时为了更好的服务器性能我们一般采用iis作为web服务器,以往的情况下iw需要编译成isapi部署在iis上.但是由于自打iis7以后iis对isapi的态度发生了很大变化(推荐使用fastcgi了)导致编译好的isapi很难在iis7.5上部署成功,

关于INTRAWEB ISAPI DLL发布

DELPHI XE7自带的INTRAWEB 14开发的EXE程序不能在IE 11浏览器里面运行,不兼容,同一个程序在CHROME里面却运行正常. 编译的ISAPI程序,在两种浏览器里都不能执行,在IIS管理器的设置正确的前提下. 看来INTRAWEB程序的发布兼容何种浏览器的何种版本是一个大问题. 怎样将Stand Alone App变为ISAPI Dll? 一是将工程文件中的program改成library,二是将uses里的IWInitStandAlone改成IWInitISAPI,没有该文

使用 IntraWeb (38) - TIWAppForm、TIWForm、TIWBaseHTMLForm、TIWBaseForm

窗体 TIWAppForm 所在单元及继承链: IWAppForm.TIWAppForm 主要成员: property OnURLRequest: TOnURLRequest //响应下面的 DoURLRequest 方法 procedure DoURLRequest(aRequest: THttpRequest) //执行 OnURLRequest 事件; 如: DoURLRequest(WebApplication.Request); function MessageForm: TIWMes

使用 IntraWeb (28) - 基本控件之 TIWTemplateProcessorHTML、TIWLayoutMgrHTML、TIWLayoutMgrForm

TIWTemplateProcessorHTML //使用外部的 html 文件做模板 TIWLayoutMgrHTML //直接输入 Html 文本做模板 TIWLayoutMgrForm //这应该只是内部使用的东西, 对用户没有意义 {需要把它们关联到窗体的 LayoutMgr 属性; 主模板需要通过 IWServerController.MasterTemplate 指定} TIWTemplateProcessorHTML 所在单元及继承链: IWTemplateProcessorHTM

使用 IntraWeb (26) - 基本控件之 TIWMenu

TIWMenu 的任务是让原来的 TMainMenu 呈现在网页上, 通过其 AttachedMenu 属性关联一个 TMainMenu 是必需的. TIWMenu 所在单元及继承链: IWCompMenu.TIWMenu 主要成员: property TextOffset: Integer //菜单文本偏移(只读) property AttachedMenu: TMainMenu //指定要包装的 TMainMenu property ItemSpacing: TIWSpaceItems //