欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

[QMacros]示例:使用 QMacros 玩转 HTML 模板_html/css_WEB-ITnose

程序员文章站 2022-05-17 21:50:49
...
我们在实际开发中,由于各种各样的原因,可能会结合浏览器来实现一些 Delphi 本身不好实现的效果。而如果网页是靠拼字符串来完成,显然其效率不是太理想。而如果结合 QMacros ,你会发现一切都变的那么简单。QMacros 的示例中包含了一个新的 HTML 模板示例代码,我们来解读其中与 QMacros 相关的部分,来看看如何玩转 HTML 模板。

首先,我们在窗体上包含了一个数据集,数据集中有两个字段:Id 和 Name,由于在设计期添加了这两个字段,所以在定义中我们可以看到它们分别是 adsDataId 和 adsDataName。为了演示方便,我们在窗体的构造函数中生成了10条测试数据。

接下来,我们来看剩下的源码:

procedure TForm1.Button1Click(Sender: TObject);const  STableTemplate: QStringW = '' + //    '这是一个表格
'+ // '' + // '")%>' + // '
编号 姓名
%Id% %Name%
';var AMacros: TQMacroManager; AHtmlFile: String;begin AMacros := TQMacroManager.Create; try AMacros.Push('Title', 'QMacros HTML表格'); AMacros.Push('Rows', DoReplaceRows); AHtmlFile := ExtractFilePath(Application.ExeName) + 'index.html'; SaveTextW(AHtmlFile, AMacros.Replace(STableTemplate, '', MRF_PARSE_PARAMS)); WebBrowser1.Navigate('file:///' + StringReplaceW(AHtmlFile, '\', '/', [rfReplaceAll])); finally FreeAndNil(AMacros); end;end; procedure TForm1.DoReplaceRows(AMacro: TQMacroItem; const AQuoter: QCharW);var AMacros: TQMacroManager; AReplace: TQMacroComplied; AHelper: TQStringCatHelperW;begin AMacros := TQMacroManager.Create; AHelper := TQStringCatHelperW.Create; adsData.DisableControls; try AMacros.Push(adsData, ''); adsData.First; AReplace := AMacros.Complie(AMacro.Params[0].AsString, '%', '%'); while not adsData.Eof do begin AHelper.Cat(AReplace.Replace); adsData.Next; end; AMacro.Value.Value := AHelper.Value; finally FreeAndNil(AMacros); FreeAndNil(AHelper); FreeAndNil(AReplace); adsData.EnableControls; end;end;

好了,我们来说明一点,我们在示例中直接定义了一个常量字符串STableTemplate,实际上这个东西你完全可以定义到外部文件中,然后在运行时用 LoadTextW 加载。后面的步骤就和这个示例一样了。

我们来看 Button1Click 都做了啥:

  • 创建 TQMacroManager 对象实例 AMacros;
  • 入栈了两个宏:
    • Title :用来做为表格标题
    • Rows :一个带参数的宏,参数是要重复的HTML内容
  • 执行 AMacros 的替换,并将替换结果保存到当前程序下,命名为 index.html。
  • 用 Navigate 函数加载保存的网页,以显示生成的 HTML 内容。

在这里,宏 Title 是一个固定值,而 Rows 是一个函数式的宏,由 DoReplaceRows 来提供进一步处理:

  1. 创建必要的实例;
  2. 将 adsData 数据集的字段入栈;
  3. 预编译 Rows 宏的参数,以便后面重复替换;
  4. 循环 adsData 生成,替换的每一步结果追加到 AHelper 中;
  5. 设置宏当前的值为 AHelper.Value;
  6. 清理局部变量的值;

OK,这样子,就完成了上面的模板的替换工作。这里注意,我创建了一个局部的 TQMacroManager 对象的实例,当然你也可以用 Button1Click 里的 AMacros,那样,宏 Title 、Rows 的值也会被嵌入。

我们看一下实际的运行结果: