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

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

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

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

function Txalionsrv.datatojson(intablename: string): string;
var
  alljson: ISuperObject;
  datajson: ISuperObject;
  recordjson: ISuperObject;

  totalcount: string;
  starti, endi, i: integer;
begin

  alljson := TSuperObject.Create(stobject);

  cx.sql.clear;
  cx.sql.add('select count(*) from (' + intablename + ')');

  try
   cx.Open;
  except
     on E:Exception do
        begin

           result:='数据库打开错误!'+e.Message;
           exit;
        end;
 end;
  totalcount := cx.fields[0].AsString;
  if totalcount > '0' then
  begin

    datajson := TSuperObject.Create(starray);
    with cx do
    begin
      sql.clear;
      sql.Add(' select * from ( '+intablename+' )');

      try

         Open;
         except
        result:='数据库打开错误!2';
         exit;

      end;
      while not eof do
      begin
        recordjson := TSuperObject.Create(stobject);

        for i := 0 to fields.Count - 1 do
        begin
          recordjson.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;
begin
   result:=datatojson(args[0]);
end;

function Txalionsrv.ProcessRequest(const Func: string;
  const ClientIdent: TkbmMWClientIdentity;
  const Args: array of Variant): Variant;

  var
   AFunc:string;
begin
     AFunc:=UpperCase(Func);
     if AFunc='SUMALL' then
        Result:=Performsumall(ClientIdent,Args)
     else if AFunc='GETIMG' then
        Result:=Performgetimg(ClientIdent,Args)
     else if AFunc='GETDATA' then
        result:=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 Sub

Sub 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 TkbmMWClient
    Dim Ip As EditText
    Dim Port As EditText
    Dim mLog As EditText
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Main")
    Ip.Text = "192.168.1.215"
    Port.Text = "3000"
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub ConnectBtn_Click
    SimpleClient.Connect(Ip.Text,Port.Text)
End Sub
Sub SendBtn_Click

    Dim args(2) As String
    args(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 Sub

Sub 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 ScrollView
    Dim Header As Panel
    Dim Footer As Panel
    Dim Table As Panel
    Dim NumberOfColumns, RowHeight, RowHeight_1, ColumnWidth, ColumnWidth_1 As Int
    Dim HeaderColor, LineColor, CellColor, FontColor, HeaderFontColor As Int
    Dim ColLineWidth, RowLineWidth As Int
    Dim FontSize As Float
    Type RowCol (Row As Int, Col As Int)
    Dim Alignment As Int
    Dim SelectedRow As Int
    Dim SelectedRowColor As Int
    : SelectedRowColor=Colors.LightGray

    'Table settings
    HeaderColor = Colors.Gray
    NumberOfColumns = 4 'will be overwritten when loading from CSV file.
    ColLineWidth = 1dip
    RowLineWidth = 1dip
    RowHeight_1 = 30dip
    RowHeight=RowHeight_1+RowLineWidth
    LineColor = Colors.Black
    CellColor = Colors.White
    FontColor = Colors.Black
    HeaderFontColor = Colors.White
    FontSize = 14
    Alignment = Gravity.CENTER 'change to Gravity.LEFT or Gravity.RIGHT for other alignments.
End Sub

Sub Activity_Create(FirstTime As Boolean)

    SV.Initialize(0)
'    SV.Color=Colors.Transparent
    SV.Panel.Color=Colors.Black
    Table = SV.Panel
    Table.Color = LineColor
    Activity.AddView(SV, 1%x, 10%y, 99%x, 80%y)

    ColumnWidth = SV.Width / NumberOfColumns
    ColumnWidth_1 = ColumnWidth-ColLineWidth
    SelectedRow = -1

     loadxinxi(Main.sdata)
End Sub

Sub loadxinxi(s As String)
    Dim JSON As JSONParser
    Dim Master As Map
    Dim records As List

    Dim XINXI As Map

    Dim recordcount As String

      ClearAll

    Dim h(4) As String
    h(0)="序号"
    h(1)="姓名"
    h(2)="学院"
    h(3)="个人"

    NumberOfColumns = h.Length
    ColumnWidth = SV.Width / NumberOfColumns 'update the columns widths
    ColumnWidth_1 = ColumnWidth-ColLineWidth
    SetHeader(h)
    JSON.Initialize(s)
    Master = JSON.NextObject
    records=Master.Get("topics")

    Dim data(4) As String
    For i=0 To records.Size-1
      Dim row() As String
        XINXI=records.Get(i)
        data(0)=XINXI.Get("XH")
        data(1)=XINXI.get("XM")
        data(2)=XINXI.get("YANGLAOXY")
        data(3)=XINXI.get("YANGLAOGR")

        row =data
        AddRow(row)
    Next
    recordcount=Master.Get("totalCount")
    h(0)="合计"
    h(1)=recordcount
    h(2)=""
    h(3)=""
   SetFooter(h)
    Activity.Title="职工信息" 

End Sub

Sub Cell_Click
    Dim rc As RowCol
    Dim l As Label
    Dim l0 As Label
    l = Sender
    rc = l.Tag
    SelectRow(rc.Row)
    l0=GetView(rc.Row,0)
    'activity.Title = "Cell clicked: (" & rc.Row & ", " & rc.Col & l0.Text &")"
    myxh=l0.Text

End Sub

Sub Header_Click
    Dim l As Label
    Dim col As Int
    l = Sender
    col = l.Tag
    Activity.Title = "Header clicked: " & col
End Sub

Sub SelectRow(Row As Int)
    'remove the color of previously selected row
    If SelectedRow > -1 Then
        For col = 0 To NumberOfColumns - 1
            GetView(SelectedRow, col).Color = CellColor
        Next
    End If
    SelectedRow = Row
    For col = 0 To NumberOfColumns - 1
        GetView(Row, col).Color = SelectedRowColor
    Next
End Sub

'Returns the label in the specific cell
Sub GetView(Row As Int, Col As Int) As Label
    Dim l As Label
    l = Table.GetView(Row * NumberOfColumns + Col)
    Return l
End Sub

'Adds a row to the table
Sub AddRow(Values() As String)
    If Values.Length <> NumberOfColumns Then
        Log("Wrong number of values.")
        Return
    End If
    Dim lastRow As Int
    lastRow = NumberOfRows
    For i = 0 To NumberOfColumns - 1
        Dim l As Label
        l.Initialize("cell")
        l.Text = Values(i)
        l.Gravity = Alignment
        l.TextSize = FontSize
        l.TextColor = FontColor
        l.Color=Colors.White
        Dim rc As RowCol
        rc.Initialize
        rc.Col = i
        rc.Row = lastRow
        l.Tag = rc
        Table.AddView(l, ColumnWidth * i, RowHeight * lastRow, ColumnWidth_1, RowHeight_1)
    Next
    Table.Height = NumberOfRows * RowHeight
End Sub

'Set the headers values
Sub SetHeader(Values() As String)
    If Header.IsInitialized Then Return 'should only be called once
    Header.Initialize("")
    For i = 0 To NumberOfColumns - 1
        Dim l As Label
        l.Initialize("header")
        l.Text = Values(i)
        l.Gravity = Gravity.CENTER
        l.TextSize = FontSize
        l.Color = HeaderColor
        l.TextColor = HeaderFontColor
        l.Tag = i
        Header.AddView(l, ColumnWidth * i, 0, ColumnWidth_1, RowHeight_1)
    Next
    Activity.AddView(Header, SV.Left, SV.Top - RowHeight, SV.Width, RowHeight)
End Sub

Sub SetFooter(Values() As String)
    If Footer.IsInitialized Then Return 'should only be called once
    Footer.Initialize("")
    For i = 0 To NumberOfColumns - 1
        Dim l As Label
        l.Initialize("footer")
        l.Text = Values(i)
        l.Gravity = Gravity.CENTER
        l.TextSize = FontSize
        l.Color = HeaderColor
        l.TextColor = HeaderFontColor
        l.Tag = i
        Footer.AddView(l, ColumnWidth * i, 0, ColumnWidth_1, RowHeight_1)
    Next
    Activity.AddView(Footer, SV.Left, SV.Top+SV.Height, SV.Width, RowHeight)
End Sub

Sub NumberOfRows As Int
    Return 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 String
    Return GetView(Row, Col).Text
End Sub

'Clears the table
Sub ClearAll
    For i = Table.NumberOfViews -1 To 0 Step -1
        Table.RemoveViewAt(i)
    Next
    Table.Height = 0
    SelectedRow = -1
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

现在运行客户端,就会回来下面界面,而且还支持滑动显示呢.

 

注意:本文纯粹是为了演示目的,在实际操作中由于JSON 数据量比较大,因此在显示数据时

要考虑到分页,同时可以通过压缩来减少网络流量。

时间: 2024-09-16 16:31:11

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

使用delphi 开发多层应用(四)kbmMW 的安装与配置

更新至kbmmw 5.04.  (2017.12.14) --------------------- 目前的KbmMW 最新版是4.0 beta 版,它支持最新的delphi XE2 ,同时支持win32,win64,mac osx的编译开发. 增加了原生的JSON 的支持(看来JSON 是越来越热了:)),同时提高了http web 的功能,作者已经用最新的KbmMW 替换了 原来使用aspx 的下载网站,其使用kbmMW 的web服务,并使用AJAX 来实现数据列表,经过我的使用,效果还不错

使用delphi 开发多层应用(七)简单的kbmMW多层数据库访问服务

      刚写完几个多层的例子,本来准备再写点其他稍微复杂的例子,很多同学就问数据库访问的方法,既然这样,就先写一下 数据库访问的过程与方法.kbmMW 支持很多数据库访问方式和控件,前面在安装时已经说过了.由于delphi 已经在d7 以后 不再推荐使用其传统的数据库方式BDE了,尤其是在delphi XE2 由于支持win64, 已经不支持使用BDE 了,为了演示方便,本文 后台数据库选择使用完全免费的firebird.firebird 是一个非常短小精悍的关系数据库,支持存储过程.触发器

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

     delphi XE5 出来了,增加了android 的开发支持,另外增加了一个RESTClient 来支持访问REST 服务器. 这个功能非常强大,可以直接使用非常多的REST 服务器.同时也可以支持访问kbmmw 的web 服务器, 并完美的通过JSON支持使用kbmmw 的JSON 数据格式.使我们非常方便的在win32,win64,mac os,ios 和android 上访问kbmmw 的数据库.     首先我们建立一个可以返回JSON 的kbmmw web 服务器.这个可以

Windows 8风格应用开发入门 二十四 App Bar构建

构建应用栏的目的的显示导航.命令和始终隐藏不需要的使用的工具.我们可以把应用栏放在页面 顶部或底部或同时存在顶部和底部. 默认情况在AppBar是隐藏的,当用户单击右键.按下Win+Z .或从屏幕的顶部或底部边缘轻松时可显示或关闭AppBar.当然我们也可以通过编程的方式将AppBar设 置为当用户做选择或与应用交互时显示. 构建AppBar基本步骤 通常我们构建一个应用的 AppBar,只需要三步就可以完成: 开发入门 二十四 App Bar构建-jenkins构建自由风格"> 如何构建

Android开发入门(十四)显示图像 14.2 ImageSwitcher

前面的一节,介绍了如何组合使用Gallery和ImageView.但是,有的时候当你在gallery中点击一个图片 ,你可能不希望一个图片"突然地"在imageview中显示出来.例如,你可能希望给某个图片设置一些切换动 画.此时,就需要使用ImageSwitcher和Gallery一起使用.下面展示如何使用ImageSwitcher. 1. 创 建一个工程,ImageSwitcher. 2. main.xml中的代码. <?xml version="1.0"

Android开发入门(十四)显示图像 14.1 Gallery和ImageView

Gallery可以显示一系列的图片,并且可以横向滑动.下面展示如何使用Gallery去显示一系列的图片. 1. 创建一个工程,Gallery. 2. main.xml中的代码. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_

UWP开发入门(十四)—— UserControl中Adaptive UI的小技巧

原文:UWP开发入门(十四)-- UserControl中Adaptive UI的小技巧 本篇我们通过绘制一个非常简单的UserControl控件,来分享一下对Adaptive UI的理解及一些图形绘制的技巧. 现在流行的APP都少不了精致的用户头像,首先假设我们需要绘制如下的图形作为默认头像: <UserControl x:Class="AdaptiveUserControl.Circle0" xmlns="http://schemas.microsoft.com/w

Xamarin.Android开发实践(十四)

原文:Xamarin.Android开发实践(十四) Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xamarin去实现它,以及如何使用适配器和自定义适配器(本文中的适配器的主要内容就是将原始的数据转换成了能够供列表控件显示的项).   二.简介适配器 在开始之前我们需要先了解下适配器,首先是提供给我们使用的适配器之间的关系: 下面我们将上面的适配器进行简单的介绍: BaseAdapter:顾名思义,就是

Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重

原文:Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重 为了确保信息请求消息的到达率,微信服务器在没有及时收到响应消息(ResponseMessage)的情况下,会多次发送同一条请求消息(RequestMessage),包括MsgId等在内的所有文本内容都是一致的. 这种机制确保了在诸如网络状况不佳的情况下消息的回复成功率,但是有时候由于服务器负荷.本身请求过程就需要好几秒才能完成等情况,多次重复的消息反而成了服务器的负担,甚至对业务和数据也可能造成影响.