Delphi 启示 #1 – kbmMW Smart client on NextGen (Android) – 作用域问题

以更高级的方式使用kbmMW smart client,在Android设备上,我遇到了问题。

通过继承TInvokeableVariantType,kbmMW smart client可以使用Delphi支持的特殊类型的自定义Variant,从而可以写在项目中不存在的过程/方法/函数的调用代码。

这是一种很好的方法,允许使用几乎正常的Delphi语法直接“嵌入”脚本功能,或者在kbmMW的情况下允许调用服务器端方法而不必编写stub/skeleton代码。

以下代码是从kbmMW客户端到kbmMW服务器中的服务(someservice)的调用。该调用接受4个参数,一个ID(字符串),一个整数(100)和两个通用TObjectLists(x.List1和x.List2)。

使用TInvokableVariantType的一个注意事项是,只能使用可存储在变体中的参数。所有常规类型,整数,int64,字符串,浮点数等都可以使用,但是不做转换的情况下,对象是不能自动传递。在这种情况下,使用Use.AsVariant(...)语法返回一种特殊类型的Variant变量,kbmMW就神奇的将对象实例“转换”为自定义Variant类型,同时,该类型也支持控制对象的所有权。

这些在所有平台上都可以正常工作......只要参数列表中使用Use.AsVariant即可。

在Android上(我一般假设是NextGen),变量在实际调用之前被释放,因此使保存相关数据的记录结构的内容无效,运行时抛出“Invalid variant type”异常。

var
cli:IkbmMWSmartClient;
begin
cli:=TkbmMWSmartRemoteClientFactory.GetClient(transport,'someservice'); cli.Service.SomeMethod(x.ID,,Use.AsVariant(x.List1,false),Use.AsVariant(x.List2,false));
...
end;

这该怎么办呢?方法有多个...其中一个是将List1和List2组合在一个对象中并发送他到服务端......但是这需要服务端也要更新,以支持接收这个组合对象。

幸运的是,还有一种更简单的解决方案:

var
cli:IkbmMWSmartClient;
v1,v2:variant
begin
cli:=TkbmMWSmartRemoteClientFactory.GetClient(transport,'someservice'); v1:=Use.AsVariant(x.List1,false);
v2:=Use.AsVariant(x.List2,false);
cli.Service.SomeMethod(x.ID,,v1,v2);
...
end;

将变量定义为局部变量,以防止编译器过早释放variant变量的值。现在,在NextGen上一切正常。

如何在客户端与服务端传输对象,请参考xalion写的:kbmmw中向服务器端传递对象的一种简单方式。

Delphi revelations #1 – kbmMW Smart client on NextGen (Android) – Scope problems的更多相关文章

  1. Smart Client Software Factory安装

    首先要安装 Visual Studio 2010 SDK 不然无法安装 Smart Client Software Factory 2010 然后按顺序安装 GAX 2010 http://visua ...

  2. Smart Client技术简要总结

    摘要:Smart Client简称智能客户端,是Microsoft推出的一种将B/S(瘦客户端)和C/S(胖客户端)结合在一起的一种技术.Smart Client结合了B/S和C/S的优势,具有新的特 ...

  3. Introduction To The Smart Client Software Factory (CAB/SCSF Part 18)

    1. Shell This is the start-up project for the solution. It is very similar to the start-up projects ...

  4. 修改Delphi 10.1.2 edit控件在android的复制、剪切和粘贴样式

    Delphi 10.1.2 edit控件在android默认的复制.剪切和粘贴样式太丑,经悟能-DelphiTeacher的提示,用最简单的代码修改后稍有改观. 默认的样式: 修改后的样式: 修改FM ...

  5. 使用delphi-cross-socket 开发kbmmw smart http service

    前几天我说了使用delphi-cross-socket 扩展kbmmw 的跨平台支持,今天我说一下使用 kbmMWCrossScoketHttpServerTransport 在linux 下支持 k ...

  6. 使用kbmmw smart service 属性时的一个注意事项

    kbmmw 5.0 以后支持smart service, 这个用起来非常方便,kbmmw 通过 定制属性来简化编程,可以参考我以前的文章.但是这个意味着使用单元引用一定要小心, 否则出了问题,都不知道 ...

  7. Delphi XE8如何同Eclipse使用相同的Android SDK?

    我的Android SDK是单独安装的:Eclipse也是最新版的,并不是谷歌提供的集成了SDK的那个Eclipse:Delphi XE8安装后,我并没有通过XE8里面下载Android SDK到XE ...

  8. C++ 的写好库编译好,DELPHI或者Java做界面,iOS 和 Android 就都搞定。

    当然也可以使用BCB和相关的开发库来开发App,只是别人没法帮助你. 摘自<想到做到-Android开发关键技术与精彩案例>.(詹建飞) p40

  9. 一窥kbmmw中的 smart service

    在kbmmw 的新版中(还没有发布),将会有一个叫做smart service 的服务.这种服务的属性基于服务器端,并且可以自动注册服务名,下面就是一个简单例子代码.这个服务里面有有三个发布的函数:e ...

随机推荐

  1. Linux中man手册的使用

    Linux中man手册的使用 ——以CentOS6.8为例 本文旨在介绍在Linux中如何快速入手新命令,毕竟在Linux系统中,可以通过命令完成一切操作. 相关命令:help man whatis ...

  2. python记录_day02 while循环 格式化 基本运算符

    一.流程控制之while循环 语法: while 条件: 循环体 else: else语句(当条件不成立的时候执行这里 和break没关系) 判断条件是否成立. 如果成立执行循环体.然后再次判断条件, ...

  3. Oracle 三大范式

    范式:数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系.所以建立科学的,规范的的数据库是需要满足一些.规范的来优化数据数据存储方式.在关系型数据库中这些规范. 第一范式:数据库表中的 ...

  4. rac 关库 启库

    关库顺序 先关闭数据库 然后关闭节点资源 [root@rac1 ~]# srvctl stop   database  -d prod[root@rac1 ~]# srvctl stop   inst ...

  5. Leetcode 1021. 最佳观光组合

    1021. 最佳观光组合  显示英文描述 我的提交返回竞赛   用户通过次数91 用户尝试次数246 通过次数92 提交次数619 题目难度Medium 给定正整数数组 A,A[i] 表示第 i 个观 ...

  6. 基于Vue + webpack + Vue-cli 实现分环境打包项目

    需求由来:我公司项目上线发布至服务器分为三个环境分别为测试环境.预发布环境.生产环境:前期做法是项目通过脚步打包时由脚步把域名和后缀名之类的全部替换成要发布的环境所需要的,因为我公司的项目比较大由许许 ...

  7. windows 下的常用工具

    网址:http://cmder.net/ 如果vim乱码  命令行输入  set LC_ALL=zh_CN.UTF8 添加cmder到鼠标右键  c://安装目录/Cmder.exe /REGISTE ...

  8. 【转】大型Vuex项目 ,使用module后, 如何调用其他模块的 属性值和方法

    Vuex 允许我们把 store 分 module(模块).每一个模块包含各自的状态.mutation.action 和 getter. 那么问题来了, 模块化+命名空间之后, 数据都是相对独立的, ...

  9. js 手机号码和电话号码正则校验

    checkPhone() { var mobile = ''; var tel = /^0\d{2,3}-?\d{7,8}$/; var phone = /^(((13[0-9]{1})|(15[0- ...

  10. js正则表达式 replace替换url的参数

    /* 定义替换对象键值 */var setReferArgs = function(){    var referArgs = new Object();    referArgs['#userID\ ...