前面说了basic4android 直接访问kbmMW server 的方法,由于javaclient 不直接支持服务器端数据库的操作,

要显示数据的内容就需要通过JSON 方式来转换。今天就大概介绍一下转换的办法。

首先要在服务器端把数据库转换为JSON ,为了方便,我修改了一下前面的转换过程。

function Txalionsrv.datatojson(intablename: string): string;
varalljson: ISuperObject;datajson: ISuperObject;recordjson: ISuperObject;totalcount: string;starti, endi, i: integer;
beginalljson := TSuperObject.Create(stobject);cx.sql.clear;cx.sql.add('select count(*) from (' + intablename + ')');trycx.Open;excepton E:Exception dobeginresult:='数据库打开错误!'+e.Message;exit;end;end;totalcount := cx.fields[0].AsString;if totalcount > '0' thenbegindatajson := TSuperObject.Create(starray);with cx dobeginsql.clear;sql.Add(' select * from ( '+intablename+' )');tryOpen;exceptresult:='数据库打开错误!2';exit;end;while not eof dobeginrecordjson := TSuperObject.Create(stobject);for i := 0 to fields.Count - 1 dobeginrecordjson.s[fields[i].FieldName] := fields[i].AsString;end;datajson.o[''] := recordjson;recordjson := nil;next;end;end;alljson.o['topics'] := datajson;alljson.s['totalCount'] := totalcount;datajson := nil;end;result := alljson.AsJSon();alljson := nil;end;function Txalionsrv.Performgetdata(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant;
beginresult:=datatojson(args[0]);
end;function Txalionsrv.ProcessRequest(const Func: string;const ClientIdent: TkbmMWClientIdentity;const Args: array of Variant): Variant;varAFunc:string;
beginAFunc:=UpperCase(Func);if AFunc='SUMALL' thenResult:=Performsumall(ClientIdent,Args)else if AFunc='GETIMG' thenResult:=Performgetimg(ClientIdent,Args)else if AFunc='GETDATA' thenresult:=Performgetdata(ClientIdent,Args)end;

然后运行服务器端。

客户端需要在B4A 上加一个显示数据的activity

主单元的代码为

'Activity module
Sub Process_Globals'These global variables will be declared once when the application starts.'These variables can be accessed from all modules.Dim  sdata As String
End SubSub Globals'These global variables will be redeclared each time the activity is created.'These variables can only be accessed from this module.Dim SimpleClient As TkbmMWClientDim Ip As EditTextDim Port As EditTextDim mLog As EditText
End SubSub Activity_Create(FirstTime As Boolean)Activity.LoadLayout("Main")Ip.Text = "192.168.1.215"Port.Text = "3000"
End SubSub Activity_ResumeEnd SubSub Activity_Pause (UserClosed As Boolean)End SubSub ConnectBtn_ClickSimpleClient.Connect(Ip.Text,Port.Text)
End Sub
Sub SendBtn_ClickDim args(2) As Stringargs(0)="select Xh,Xm,yanglaoxy,yanglaogr from rssj"sdata=SimpleClient.SendRequest ("xalion_srv","","GETDATA",args)StartActivity(bmxinxi)
End Sub

bmxinxi的代码如下:

'Activity module
Sub Process_Globals'These global variables will be declared once when the application starts.'These variables can be accessed from all modules.End SubSub Globals'These global variables will be redeclared each time the activity is created.'These variables can only be accessed from this module.Dim SV As ScrollViewDim Header As PanelDim Footer As PanelDim Table As PanelDim NumberOfColumns, RowHeight, RowHeight_1, ColumnWidth, ColumnWidth_1 As IntDim HeaderColor, LineColor, CellColor, FontColor, HeaderFontColor As IntDim ColLineWidth, RowLineWidth As IntDim FontSize As FloatType RowCol (Row As Int, Col As Int)Dim Alignment As IntDim SelectedRow As IntDim SelectedRowColor As Int        : SelectedRowColor=Colors.LightGray'Table settingsHeaderColor = Colors.GrayNumberOfColumns = 4 'will be overwritten when loading from CSV file.ColLineWidth = 1dipRowLineWidth = 1dipRowHeight_1 = 30dipRowHeight=RowHeight_1+RowLineWidthLineColor = Colors.BlackCellColor = Colors.WhiteFontColor = Colors.BlackHeaderFontColor = Colors.WhiteFontSize = 14Alignment = Gravity.CENTER 'change to Gravity.LEFT or Gravity.RIGHT for other alignments.
End SubSub Activity_Create(FirstTime As Boolean)SV.Initialize(0)
'    SV.Color=Colors.TransparentSV.Panel.Color=Colors.BlackTable = SV.PanelTable.Color = LineColorActivity.AddView(SV, 1%x, 10%y, 99%x, 80%y)ColumnWidth = SV.Width / NumberOfColumnsColumnWidth_1 = ColumnWidth-ColLineWidthSelectedRow = -1loadxinxi(Main.sdata)
End SubSub loadxinxi(s As String)Dim JSON As JSONParserDim Master As MapDim records As ListDim XINXI As MapDim recordcount As StringClearAllDim h(4) As Stringh(0)="序号"h(1)="姓名"h(2)="学院"h(3)="个人"NumberOfColumns = h.LengthColumnWidth = SV.Width / NumberOfColumns 'update the columns widthsColumnWidth_1 = ColumnWidth-ColLineWidthSetHeader(h)JSON.Initialize(s)Master = JSON.NextObjectrecords=Master.Get("topics")Dim data(4) As StringFor i=0 To records.Size-1Dim row() As StringXINXI=records.Get(i)data(0)=XINXI.Get("XH")data(1)=XINXI.get("XM")data(2)=XINXI.get("YANGLAOXY")data(3)=XINXI.get("YANGLAOGR")row =dataAddRow(row)Nextrecordcount=Master.Get("totalCount")h(0)="合计"h(1)=recordcounth(2)=""h(3)=""SetFooter(h)Activity.Title="职工信息" End SubSub Cell_ClickDim rc As RowColDim l As LabelDim l0 As Labell = Senderrc = l.TagSelectRow(rc.Row)l0=GetView(rc.Row,0)'activity.Title = "Cell clicked: (" & rc.Row & ", " & rc.Col & l0.Text &")"myxh=l0.TextEnd SubSub Header_ClickDim l As LabelDim col As Intl = Sendercol = l.TagActivity.Title = "Header clicked: " & col
End SubSub SelectRow(Row As Int)'remove the color of previously selected rowIf SelectedRow > -1 ThenFor col = 0 To NumberOfColumns - 1GetView(SelectedRow, col).Color = CellColorNextEnd IfSelectedRow = RowFor col = 0 To NumberOfColumns - 1GetView(Row, col).Color = SelectedRowColorNext
End Sub'Returns the label in the specific cell
Sub GetView(Row As Int, Col As Int) As LabelDim l As Labell = Table.GetView(Row * NumberOfColumns + Col)Return l
End Sub'Adds a row to the table
Sub AddRow(Values() As String)If Values.Length <> NumberOfColumns ThenLog("Wrong number of values.")ReturnEnd IfDim lastRow As IntlastRow = NumberOfRowsFor i = 0 To NumberOfColumns - 1Dim l As Labell.Initialize("cell")l.Text = Values(i)l.Gravity = Alignmentl.TextSize = FontSizel.TextColor = FontColorl.Color=Colors.WhiteDim rc As RowColrc.Initializerc.Col = irc.Row = lastRowl.Tag = rcTable.AddView(l, ColumnWidth * i, RowHeight * lastRow, ColumnWidth_1, RowHeight_1)NextTable.Height = NumberOfRows * RowHeight
End Sub'Set the headers values
Sub SetHeader(Values() As String)If Header.IsInitialized Then Return 'should only be called onceHeader.Initialize("")For i = 0 To NumberOfColumns - 1Dim l As Labell.Initialize("header")l.Text = Values(i)l.Gravity = Gravity.CENTERl.TextSize = FontSizel.Color = HeaderColorl.TextColor = HeaderFontColorl.Tag = iHeader.AddView(l, ColumnWidth * i, 0, ColumnWidth_1, RowHeight_1)NextActivity.AddView(Header, SV.Left, SV.Top - RowHeight, SV.Width, RowHeight)
End SubSub SetFooter(Values() As String)If Footer.IsInitialized Then Return 'should only be called onceFooter.Initialize("")For i = 0 To NumberOfColumns - 1Dim l As Labell.Initialize("footer")l.Text = Values(i)l.Gravity = Gravity.CENTERl.TextSize = FontSizel.Color = HeaderColorl.TextColor = HeaderFontColorl.Tag = iFooter.AddView(l, ColumnWidth * i, 0, ColumnWidth_1, RowHeight_1)NextActivity.AddView(Footer, SV.Left, SV.Top+SV.Height, SV.Width, RowHeight)
End SubSub NumberOfRows As IntReturn Table.NumberOfViews / NumberOfColumns
End Sub'Sets the value of the given cell
Sub SetCell(Row As Int, Col As Int, Value As String)GetView(Row, Col).Text = Value
End Sub'Gets the value of the given cell
Sub GetCell(Row As Int, Col As Int) As StringReturn GetView(Row, Col).Text
End Sub'Clears the table
Sub ClearAllFor i = Table.NumberOfViews -1 To 0 Step -1Table.RemoveViewAt(i)NextTable.Height = 0SelectedRow = -1
End SubSub Activity_ResumeEnd SubSub Activity_Pause (UserClosed As Boolean)End Sub

现在运行客户端,就会回来下面界面,而且还支持滑动显示呢.
注意:本文纯粹是为了演示目的,在实际操作中由于JSON 数据量比较大,因此在显示数据时
要考虑到分页,同时可以通过压缩来减少网络流量。

使用delphi 开发多层应用(十四)使用Basic4android 显示kbmMW server数据相关推荐

  1. 使用delphi 开发多层应用(二十一)使用XE5 RESTClient 直接访问kbmmw 数据库

    delphi XE5 出来了,增加了android 的开发支持,另外增加了一个RESTClient 来支持访问REST 服务器. 这个功能非常强大,可以直接使用非常多的REST 服务器.同时也可以支持 ...

  2. 读后感: 懈寄生---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十四)

    懈寄生---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十四) http://blog.csdn.net/david_lv/archive/2008/06/11/2535650.aspx 读后 ...

  3. iOS 11开发教程(十四)iOS11应用代码添加视图

    iOS 11开发教程(十四)iOS11应用代码添加视图 如果开发者想要使用代码为主视图添加视图,该怎么办呢.以下将为开发者解决这一问题.要使用代码为主视图添加视图需要实现3个步骤. (1)实例化视图对 ...

  4. QT开发(六十四)——QT样式表(二)

    QT开发(六十四)--QT样式表 本文主要翻译自QT官方文档Qt Style Sheets . 五.QT样式表参考 QT样式表支持多种的属性.状态和子控件,使得定制组件的外观成为可能. 1.组件 以下 ...

  5. SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  6. SAP UI5 应用开发教程之五十四 - 如何将本地 SAP UI5 应用配置到本地 Fiori Launchpad 中的试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  7. SAP UI5 应用开发教程之三十四 - SAP UI5 应用基于设备类型的页面适配功能(Device Adaptation)试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  8. Xamarin.Android开发实践(十四)

    原文:Xamarin.Android开发实践(十四) Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xama ...

  9. 开发指南专题十四:JEECG微云快速开发平台MiniDao 介绍

    开发指南专题十四:JEECG微云快速开发平台MiniDao 介绍 13.MiniDao 介绍 13.1.  MiniDao简介及特征 MiniDao是Jeecg自己的持久化解决方案,具备了Hibern ...

  10. 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:// ...

最新文章

  1. 【2018.2.25】c++预习练习
  2. 日志规范多重要,这篇文章告诉你!
  3. Linux命令详解----iostat
  4. UA MATH564 概率论 公式与定理总结
  5. 如何实现少样本学习?先让神经网络get√视觉比较能力
  6. 浙江大学计算机学院研究生论文盲审,浙江理工大学研究生学位论文盲审实施办法...
  7. 【Redis学习笔记】2018-06-14 Redis源码学习之sentinel
  8. 骁龙865+65W闪充!realme 真我X50 Pro 5G正式全球发布
  9. Manjaro下安装VirtualBox
  10. HTML中哪个代码能使div在中心,为什么在html代码的div当中设置margin-top:10px没响应,加了position也不行...
  11. mysql设计实例教程_MySQL数据库基础实例教程(微课版)
  12. xlsx文件打开乱码_excel打不开xlsx文件怎么办 excel打开xlsx文件乱码怎么解决
  13. android studio调整字体大小,如何在Android Studio中增加字体大小?
  14. cmos功能测试软件,CMOS摄像头开发测试方法(我总结的)
  15. 一键获取阿里巴巴主图视频细节图评论图的步骤
  16. 161009_qt显示阿拉伯输入法9x7点阵
  17. cve_2019_0708复现踩坑
  18. 厚着脸皮求领导写了一篇java小白进阶大牛之路!!!
  19. Linux 设备树 status 详解
  20. nuc10黑苹果无法wifi上网

热门文章

  1. ArcGIS 制作林地成分栅格数据
  2. 利用ArcGIS Pro对疫情数据进行分析并可视化
  3. Python 使用while循环实现打印9x9乘法表
  4. SelectObject失败原因 cannot convert from ‘HGDIOBJ‘ to ‘CBrush‘
  5. Android 属性动画简单说明前篇(一)
  6. cacti升级后还是用的旧路径_Flutter1.9升级体验及填坑全攻略
  7. 从“流处理”到“流批一体”,Apache Flink 的19个企业最佳实践
  8. 十分钟走进大数据世界
  9. 快应用开发教程【02】--项目配置教程
  10. OpenGL中 Canvas 性能分析