全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4071
推到 Plurk!
推到 Facebook!

Delphi Android program

 
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-08-20 19:37:51 IP:113.116.xxx.xxx 訂閱
几年没来 KTop 了。今天搜关于 Android 开发的资料,搜到这里。顺便把这几天我写一个测试程式的经验分享一下。

Delphi XE6 安装在 Virtual Box 虚拟机里面的 XP 上,HOST 机是 WIN7 64,手机是 OPPO FIND5. 安装好手机驱动后,选择 Virtual Box 的菜单【设备 -- 分配USB设备】,如果 HOST 的 WIN7 64 已经连上手机,这里能看到一个 android 设备在菜单里面。选择它,DELPHI 里面右边编译选择的 Target Platforms 底下的 Android 底下,能看到手机型号出来了。

开启一个 FireMonkey Mobile Project,开始写程序。我就想写一个简单的电话薄程序。

首先,将我自己手机的电话薄导出来,这是一个 vCard 格式的文件。我在 WINDOWS 底下用 XE3 写了一个程序把这个 vCard 文件解析为人的名字/电话号码等等,逐条写入一个 FireBird 数据库。我用 FireBird 数据库,通常是用 DBExpress 去连接。顺便说一句,DBExpress 连接 FireBird 数据库,有一个 BUG 是到XE6一直都存在的,就是 UTF8 编码的 BLOB 大文本,到了后面给 ClientDataSet 以后,用 TDBMemo 来输入和显示,会乱码。XE6 有了 FireDAC,我测试过用 FireDAC 连接 FireBird,UTF8 的BLOB没有乱码。

暂时不想在手机里搞数据库,XE6 支持在 Android 里面跑 SQLLite 和 InterBase. 但我还没时间去搞清楚怎么跑。所以,我打算在手机里面,将数据保存为 ClientDataSet.SaveToFile 的文件。

我这个简单的电话薄程序,有 5 个 Table。在 WINDOWS 底下,我都写入 FireBird。然后我这个 WINDOWS 程序有一个 WebService 接口,有5个函数,分别将这5个 Table 的数据用 ClientDataSet.XMLData 的方式输出。

然后,我在 Android 手机程序里面,加上 HTTPRIO,调用这个 Webservice ,哈哈,能够通过网络从 Windows 里面的程式获得文档电话薄的数据。然后把这个数据用 ClientDataSet.SaveToFile,保存到手机本地的存储里面。下次程序启动的时候,用 ClientDataSet.LoadFromFile 就能获得数据。至于要保存到手机的哪个地方,在 FireMonkey 底下,采用这个函数:TPath.GetDocumentsPath 就能获得一个你的程序有权限存取的地方。顺便说一句,TPath.GetDocumentsPath 在WINDOWS底下也有效。

然后开始做界面。显示很多条人的名字,采用 ListView,通过 DataBind 的方式连接到有人的名单的 ClientDataSet。这里有一个问题我在Internet上查了几个小时:如何让我在 ListView 里面选中一条数据,ClientDataSet 里面的当前Cursor也移动到对应的Record和以前使用DBGrid 一样?

其实很简单,就是在 Live Bindings Designer 里面,将 ListView 的 Synch 指向对应的 ClientDataset 的【*】,它会出来一个双向的箭头。用户在 ListView 里面选择了一条 Item,ClientDataSet 里面的当前 Cursor 就会走到那条 Record,和 DBGrid 一样了。
至于 ListView 要显示的内容,就是把它的 Item.Text 指向对应的 ClientDataSet 里面你要显示的 Field,在这里是我的表里面的人名字段。

-----------------------------
滑来滑去,触摸。如果我要在 TListView 上面左右一划,然后让程序执行动作:

1. 加上一个 GestureManager1 到 Form 里面;
2. 先把向右划的动作要干什么事的代码,写到一个 Action 里面去。(ActionList 里面新增一个 Action)
3. 选择这个 ListView 的 Touch - Gestures 属性,拉下来,在 standard 里面选择 right 然后选择它对应的 Action。这样,你的手指在 ListView 上向右划,它就能执行这段代码了。

--------------------------
手指双点,长时间按等动作要执行的代码:
1. 选择 ListView1 的 Touch - Interactive Guestures,勾选里面你要的动作,比如 double tap,手指双击。
2. ListView1 的 Event 里面,选择 OnGesture Event,,在里面写:
procedure TFmMain.ListView2Gesture(Sender: TObject;
const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
//手势。
if (EventInfo.GestureID = igiDoubleTap) then Self.DialPhone;
end;

也就是说,所有手势操作都写在这里,通过判断 EventInfo.GestureID 来知道用户究竟是哪个手势。


-------------------------
手机上最大的问题是复杂界面和 WINDOWS 不同。WINDOWS 底下屏幕大,很多东西可以摆在一个 Form 里面。我在 WINDOWS 底下做东西,通常把不同内容的东西,写到不同的 Form 里面。但实际操作的时候,通过 Form2.Parent := Form1.Panel1 的方式,直接在 Form1 里面更换不同的界面,而不是把所有代码写在一个 Form 的 Unit 里面。

手机里面,FireMonkey 不知道行不行。上网搜索,发现几种做法:
1. 在一个 Form 里面,放很多 Layout,在每个 Layout 上放一个手机屏幕可以显示的东西。通过切换 Layout 来实现切换屏幕。但这样就是把所有程式写在一个 Unit 里面,代码太多太乱不好管理。
2. 采用 Frame,把一个屏幕的内容放到一个 Frame 里面,在主Form里面,使用这个 Frame。在设计期,主Form里面要摆很多 Frame,也很乱。
3. 我自己试出来的办法:在 Form2 里面放一个 Panel,上面放上一个屏幕的内容;如果要切换屏幕到这个 Form,我直接写: Form2.Panel1.Parent := Form1; Form2.Panel1.Align := alClient;这样把 Form2 里面的 Panel1 搬到 Form1 里面来显示,也确实实现了屏幕的切换。不知道直接写 Form2.Show 会不会也是相同效果,这个还没测试。

-----------------------------
多选菜单:
暂时我采用 TListView 来做多选菜单。


-----------------------------
电话拨号:

if TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService,
IInterface(PhoneDialerService)) then
if ANum <> '' then
PhoneDialerService.Call(ANum);


--------------------------------
发送短信:

class procedure TDmAndroidPhone.SendSMS(target, messagestr: string);
var
smsManager: JSmsManager;
smsTo: JString;
begin
smsManager:= TJSmsManager.JavaClass.getDefault;
smsTo:= StringToJString(target);
smsManager.sendTextMessage(smsTo, nil, StringToJString(messagestr), nil, nil);
end;


发送短信这里,需要引用:

FMX.Helpers.Android,
Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.Net,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.Telephony;


------------------------------------------------

总结一下:

1. 采用 XE6 开发 Android 手机程式,可以采用 ClientDataSet 来作为 DataBase 的操作,非常方便;
2. 在手机里面,可以写 WebService 客户端,采用 HTTPRIO 控件。最早看李维的书讲 SOAP / WebService 提到 HTTPRIO 是基于 IE 的 HTTP Lib,看来 XE6 已经扩展了,否则没法在 ANDROID 手机里面用。不过现在 DELPHI 提倡用 DataSnap,但这个我还不熟悉怎么用。
3. 手机通过网络和外面通讯,采用 Indy 那套控件,我测试通过,可以用。
4. 之前 Indy 有很多 BUG,后来我在 XE3 底下,对 Indy TCP Server 做了一次压力测试,发现几千条连接不停连上断开,很稳定,没有内存泄漏,也不会崩溃,而且速度没有任何问题。


------------------------------------------

一个比较严重的问题,我还没找到答案:每次程式从手机里面启动,手机屏幕会黑掉很长时间,好几秒。这样的用户体验很不好。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-08-20 22:43:59 IP:118.160.xxx.xxx 未訂閱
黑屏的問題, xe4開始就有人在探討, 李維, 飄渺等都有發表如何解決, 不過就是有點麻煩, 或者其他國外討論也有不少這方面的討論, 可以搜尋一下!

當然, 如果未來EMBD 可以更人性化一點, 把這部份封包成一個元件直接引用那就更好了, 不過截至目前為止, 似乎沒這個打算(含XE7)
編輯記錄
P.D. 重新編輯於 2014-08-20 22:45:25, 註解 無‧
JL9168
中階會員


發表:133
回覆:223
積分:76
註冊:2011-09-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-08-21 14:06:29 IP:122.117.xxx.xxx 未訂閱
To PD大大

據相關Beta的消息說,Android黑屏在XE7已經是內建的解決方案了
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-08-21 14:19:38 IP:59.120.xxx.xxx 未訂閱
哇! JL兄好久不見了, 
如果消息屬實就太好了, 25日台北的發表會看會不會提!
===================引 用 JL9168 文 章===================
To PD大大

據相關Beta的消息說,Android黑屏在XE7已經是內建的解決方案了
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-08-26 22:41:19 IP:118.169.xxx.xxx 未訂閱
台北場週一結束, 已確認 XE7 已內建啟動畫面(即解決黑屏問題)的功能, 而且如同加掛APP ICON 的方式一樣, 只要載入圖片就好了

另外, XE7看來強化很多功能, 也解決XE6一些令人困擾的操作! 期待中...
spfrk
一般會員


發表:16
回覆:43
積分:11
註冊:2013-10-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-08-27 09:01:59 IP:114.45.xxx.xxx 訂閱
XE7 專案的屬性多了 splash 的設定,可自己畫圖作為進入程式前的開機畫面,

另外 showmessage 也不會當掉了, 但是有關雷射盤點機的運用上還是有問題,

因為雷射盤點機都是透過剪貼簿來傳送資料,如果使用者按得太快,容易造成,

APP 與盤點機同時讀寫剪貼簿,這時候 APP 就當掉了,我也問了李維大師,有關

這點他說這要有完整的資料才能交給 EMB 處理,好像這意思就是"無解".

這樣看起來 DELPHI ANDROID 要在 POS 系統運作, 還有段距離,只能繼續

測試與觀望了.


aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2014-08-31 15:03:19 IP:114.32.xxx.xxx 訂閱
我想你的問題embt應該是不會有解的,原因很多,比如問題較個別化,且不知詳實運作情形。於是就算等到 xe n 恐也不太會有解。

我認為你的問題可以透過程式的不同架構模式解決,比如說收到資料後不要馬上處理,而是queue在一個資料結構上(如list),然後慢慢的去消化這些資料,僅管這樣可能稍不同步,但問題可以解。當然,首要的是不了解你說的「盤點機 與 app」是什麼關係? 是指barcode scanner 與 app? 或是 盤點機也是一個app? 大致上的硬體,軟體架構是如何?


===================引 用 spfrk 文 章===================
XE7 專案的屬性多了 splash 的設定,可自己畫圖作為進入程式前的開機畫面,

另外 showmessage 也不會當掉了, 但是有關雷射盤點機的運用上還是有問題,

因為雷射盤點機都是透過剪貼簿來傳送資料,如果使用者按得太快,容易造成,

APP 與盤點機同時讀寫剪貼簿,這時候 APP 就當掉了,我也問了李維大師,有關

這點他說這要有完整的資料才能交給 EMB 處理,好像這意思就是"無解".

這樣看起來 DELPHI ANDROID 要在 POS 系統運作, 還有段距離,只能繼續

測試與觀望了.


------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
spfrk
一般會員


發表:16
回覆:43
積分:11
註冊:2013-10-01

發送簡訊給我
#8 引用回覆 回覆 發表時間:2014-08-31 17:30:35 IP:118.160.xxx.xxx 訂閱
盤點機的問題,而是2個 APP 同時寫入 剪貼簿時 XE5, 6 就會當掉,

廠商也有用 eclipse 寫的程式來 驗證, 不會當掉, 這也就是我無法說服公司

用 emb 來開發程式, 雖然用 delphi 來開發 android app 比較容易,但是無法

商品化, 只有等 XE7 公佈後, 再來試試看了


系統時間:2024-04-20 2:13:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!