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. pycharm安装步骤

    python环境配置教程 https://jingyan.baidu.com/article/c45ad29c05c208051653e270.html 由于安装Pycharm时忘记截图了,所以详细安 ...

  2. 【洛谷p2430】严酷的训练

    (这个题有一个很神奇的地方) 严酷的训练[传送门] 算法标签(显然01背包了最近一直在练) (他居然没写……) 这个题啊,试了好几遍没a 最后发现在第二层循环的时候应该是j>=rqyt[p[i] ...

  3. Building Fire Stations ZOJ - 3820 (二分,树的直径)

    大意: 给定树, 求两个点, 使得所有其他的点到两点的最短距离的最大值尽量小. 二分答案转为判定选两个点, 向外遍历$x$的距离是否能遍历完整棵树. 取直径两段距离$x$的位置bfs即可. #incl ...

  4. tmp目录自动清除和tmpwatch命令

    习惯性的将一些临时文件放在tmp目录下,让其自然删除.同时,为了保证tmp目录不爆满,系统默认情况下每日会处理一次tmp目录文件,原理就是使用了tmpwatch.在系统最小安装情况下,这个功能是没有安 ...

  5. 【Java】【1】List的几种排序写法

    前言: 1,实现Comparator接口的类的对象作为sort的入参 2,在方法的局部使用局部类 3,基于第二种方法,局部类改为匿名类 4,使用lamdba表达式->这种形式 5,借助Compa ...

  6. 常用的jquery遍历函数

    1.Jquery遍历祖先 1).parent()  方法返回被选元素的直接父元素. 2).parents()  方法返回被选元素的所有祖先元素,它一路向上直到文档的根元素 (<html>) ...

  7. Eclipse直接打开类文件/文件夹所在的本地目录

    1.Eclipse原生的文件浏览操作 选择项目目录/文件 按 ALT+SHIFT +W , 会弹出菜单点击 System Explorer 就可以打开文件所在的本地目录了: 设置工具目录 Run -- ...

  8. python之命令行参数解析模块argparse

    """argparse模块使得写用户友好性命令行接口很容易,程序定义所需要的参数,argparse会从ays.argv中提取出这些参数.argparse模块也能自动的产生 ...

  9. Linux 控制CPU使用率

    曾经看过<编程之美>上提到说使 CPU的使用率固定在百分之多少.然后这次刚好要用到这个东西,下面是一个简单的实现.基于多线程: Linux 版本: #include <iostrea ...

  10. H5 PWA技术以及小demo

    H5 PWA技术 1.原生app优缺点 a.体验好.下载到手机上入口方便 b.开发成本高(ios和安卓) c.软件上线需要审核 d.版本更新需要将新版本上传到不同的应用商店 e.使用前需下载 2.we ...