Delphi revelations #1 – kbmMW Smart client on NextGen (Android) – Scope problems
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的更多相关文章
- Smart Client Software Factory安装
首先要安装 Visual Studio 2010 SDK 不然无法安装 Smart Client Software Factory 2010 然后按顺序安装 GAX 2010 http://visua ...
- Smart Client技术简要总结
摘要:Smart Client简称智能客户端,是Microsoft推出的一种将B/S(瘦客户端)和C/S(胖客户端)结合在一起的一种技术.Smart Client结合了B/S和C/S的优势,具有新的特 ...
- 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 ...
- 修改Delphi 10.1.2 edit控件在android的复制、剪切和粘贴样式
Delphi 10.1.2 edit控件在android默认的复制.剪切和粘贴样式太丑,经悟能-DelphiTeacher的提示,用最简单的代码修改后稍有改观. 默认的样式: 修改后的样式: 修改FM ...
- 使用delphi-cross-socket 开发kbmmw smart http service
前几天我说了使用delphi-cross-socket 扩展kbmmw 的跨平台支持,今天我说一下使用 kbmMWCrossScoketHttpServerTransport 在linux 下支持 k ...
- 使用kbmmw smart service 属性时的一个注意事项
kbmmw 5.0 以后支持smart service, 这个用起来非常方便,kbmmw 通过 定制属性来简化编程,可以参考我以前的文章.但是这个意味着使用单元引用一定要小心, 否则出了问题,都不知道 ...
- Delphi XE8如何同Eclipse使用相同的Android SDK?
我的Android SDK是单独安装的:Eclipse也是最新版的,并不是谷歌提供的集成了SDK的那个Eclipse:Delphi XE8安装后,我并没有通过XE8里面下载Android SDK到XE ...
- C++ 的写好库编译好,DELPHI或者Java做界面,iOS 和 Android 就都搞定。
当然也可以使用BCB和相关的开发库来开发App,只是别人没法帮助你. 摘自<想到做到-Android开发关键技术与精彩案例>.(詹建飞) p40
- 一窥kbmmw中的 smart service
在kbmmw 的新版中(还没有发布),将会有一个叫做smart service 的服务.这种服务的属性基于服务器端,并且可以自动注册服务名,下面就是一个简单例子代码.这个服务里面有有三个发布的函数:e ...
随机推荐
- win7 64安装msyql
https://www.cnblogs.com/orrz/p/5456247.html 1:下载安装包,等待等待的过程,OK,在短暂的等待后,下载完成,解压先,简单起见,解压到D盘吧,D:\mysql ...
- nginx-exporter安装使用
一.没有vts的启动方式 #nginx_exporter -telemetry.address=:9113 -nginx.scrape_uri="http://127.0.0.1:100 ...
- C++的字符串多行输入
#include<iostream> using namespace std; int main() { int r, c; char grid[50][51]; cout << ...
- Oracle 11.2.0.4.0 Dataguard部署和日常维护(7) - Dataguard Flashback篇
1. 设置备库的闪回目录 show parameter db_recovery_file; NAME TYPE VALUE ------------------------------------ - ...
- 基于spring的PropertySource类实现配置的动态替换
public class ConfigPropertySource extends PropertySource<Properties> implements PriorityOrdere ...
- codeigniter在nginx下返回404 not found
codeigniter框架需要path_info的支持,Apache默认支持path_info,但是nginx默认不支持,我们需要设置nginx,使得nginx支持path_info 网上试了好多方法 ...
- vector list map set等容器某些函数的使用区别
map, set, vector erase的正确使用方法 一.erase 的用法区别 STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque); 另一类是以不 ...
- learning at command AT+CIMI
AT command AT+CIMI [Purpose] Learning how to get the International Mobile Subscriber Identity ...
- day05 可变不可变类型
#可变类型: 值变了,但是id没有变,证明没有生成新的值而是在改变原值,原值是可变类型#不可变类型:值变了,id也跟着变,证明是生成了新的值而不是在改变原值,原值是不可变 # x=10# print( ...
- C# [IPA]IOS In App Purchase(内购)验证(asp.net 版本)
之前没有做过IOS 内购服务器验证这块,所以找了不少参考资料,网上大多php和java版本,然后自己搞了一个C#版本,希望能给大家一些参考,下面步入正题 在客户端向苹果购买成功之后,我们需要进行二次验 ...