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

Android 的回車鍵困擾

答題得分者是:Main Chen
P.D.
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-10-28 23:47:52 IP:59.120.xxx.xxx 未訂閱
請問各位

在 xe7 上雖然對 手機的回車鍵有做很大幅度的改善,
例如在xe6 的版本, 如果 form1 call form2, 按下回車鍵, 是會令整個app 結束, 而不是我們想像中在 form2 可以回到 form1 的功能,
這在 xe7 上已解決了, 但我現在要請問的是

依據李維老師給我們的建議, form1 上盡量不用使用多 form來做, 而改以 Frame 方式來代替,
我也按照建議再了一堆的frame 來 call , 但現在問題來了,

例如

form1 call form2(以 showmodal 方式),
form2 call Frame1 (Frame是建構在 form2上)
我在 frame1 的模式下, 按下回車鍵 (vkHardwareBack), 結果它不是把 Frame1退回, 而是直接關閉我的 form2, 回到 form1
要如何才能讓user 使用回車鍵, 可以順利回到 form2 上呢?
因為這個按鍵幾乎已成為使用手機者最常用及最習慣的用法, 如果硬要把回車鍵關閉不具功能, 恐造成使用者不習慣而無法接受
編輯記錄
P.D. 重新編輯於 2014-10-28 23:49:24, 註解 無‧
P.D.
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-11-02 23:32:05 IP:114.44.xxx.xxx 未訂閱
這個問題我目前已暫時解決了, 很多人可能想了解如何解法, 
其實很簡單,
我放棄了一堆以 frame 設計的框架, 全部重新改回 form

因為我設計的系統

form1->frame1->frame2->frame3
在 Android 下如果在 frame3 按回車鍵, 不會如下

frame3->frame2->frame1->form1
而是直接回到手機桌面

所以只好改成
form1->form2->form3->form4

回車鍵可達成
form4->form3->form2->form1->回桌面
Main Chen
高階會員


發表:29
回覆:135
積分:127
註冊:2002-10-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-11-03 13:24:56 IP:220.134.xxx.xxx 訂閱
其實 TFrame 繼承自 TControl 它就是一個 TFmxObject 元件, 加到 Form 後, 就是一個元件, 而 Form1.O n K e y U p 事件還是在 Form 裡, 要解決這個問題可以:

1. 當顯示個 Frame 後, 可以重新指定 Form1.O n K e y U p (例: Form1.O n K e y U p := Frame1.O n K e y U p)
2. 關閉 Frame 後, 再恢復原事件.

必竟 Form 耗用資源大於 Frame , 在移動平台如果 Form 用的不多, 就直接用 Form 就好, 如果窗子多了, 還是建議用 Frame
編輯記錄
Main Chen 重新編輯於 2014-11-03 13:25:49, 註解 無‧
Main Chen 重新編輯於 2014-11-03 13:26:13, 註解 無‧
Main Chen 重新編輯於 2014-11-03 13:30:10, 註解 無‧
P.D.
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-11-13 02:34:38 IP:118.160.xxx.xxx 未訂閱
想瞭解的是
大家都在說 form 的資源損耗比Frame大,
但有沒有實際的數據可以提出

form 與 frame 的差異性及損耗性?
===================引 用 Main Chen 文 章===================
其實 TFrame 繼承自 TControl 它就是一個 TFmxObject 元件, 加到 Form 後, 就是一個元件, 而 Form1.O n K e y U p 事件還是在 Form 裡, 要解決這個問題可以:

1. 當顯示個 Frame 後, 可以重新指定 Form1.O n K e y U p (例: Form1.O n K e y U p := Frame1.O n K e y U p)
2. 關閉 Frame 後, 再恢復原事件.

必竟 Form 耗用資源大於 Frame , 在移動平台如果 Form 用的不多, 就直接用 Form 就好, 如果窗子多了, 還是建議用 Frame
Main Chen
高階會員


發表:29
回覆:135
積分:127
註冊:2002-10-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-11-13 11:11:47 IP:220.134.xxx.xxx 訂閱
我測試了在 Android 下建立 100 個 Form 及 Frame 所需要的記憶體, 但我不知道這樣測試有沒有意義?

下圖僅供參考, 在不同的機子會有不同的結果.

Android Form Frame 記憶體測試


ps. Form 及 Frame 裡都只放了一個 TButton

===================引 用 P.D. 文 章===================
想瞭解的是
大家都在說 form 的資源損耗比Frame大,
但有沒有實際的數據可以提出

form 與 frame 的差異性及損耗性?
===================引 用 Main Chen 文 章===================
其實 TFrame‚ 繼承自‚ TControl 它就是一個 TFmxObject 元件, 加到 Form 後, 就是一個元件, 而 Form1.O n K e y U p 事件還是在 Form 裡, 要解決這個問題可以:

1. 當顯示個 Frame 後, 可以重新指定 Form1.O n K e y U p (例: Form1.O n K e y U p := Frame1.O n K e y U p)
2. 關閉 Frame 後, 再恢復原事件.

必竟 Form 耗用資源大於 Frame , 在移動平台如果 Form 用的不多, 就直接用 Form 就好, 如果窗子多了, 還是建議用 Frame
編輯記錄
Main Chen 重新編輯於 2014-11-13 11:15:28, 註解 無‧
aftcast
站務副站長


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-11-13 12:21:15 IP:114.32.xxx.xxx 訂閱
謝謝 main chen的測試。

此外,我個人也是想了解pd所提的這個問題。因為都是"聽來的",實際上好像不那麼回事。
若以main chen測的100個的結果,只差不到2mb,那算還好吧?!

就我個人目前為止的理解,應該是會有速度上的差異? (開form與frame的速度),或者是開form後,form很難被"正常"釋放,導致關了100個form也回不了原記憶體。

所以,要測的話,可能要在form上放一些東西,並且釋放每個form。同理用在frame上,放一些東西,然後釋放… 也觀查一下開的速度 。

我一直感覺(直覺或是錯覺) tform 在釋放時有問題 (bug?)。 所以才會建議用 frame。 若以低階的角度來看,frame與form同是 view control code,至多差在control code上form較多 (如mian chen測的)。但也差不了多少呀…怪怪

因我自己近來忙,只能講屁話,沒時間實測,若有朋友有經驗或是有時間測,還希望分享一下喔! 感謝大家!

===================引 用 P.D. 文 章===================
想瞭解的是
大家都在說 form 的資源損耗比Frame大,
但有沒有實際的數據可以提出

f
------


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

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
Main Chen
高階會員


發表:29
回覆:135
積分:127
註冊:2002-10-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2014-11-13 12:47:19 IP:220.134.xxx.xxx 訂閱
有興趣的人可以查 Form 的 ShowModal; 這個方法, 它會進入一個無窮迴圈等待使用者回應 (Android 直接不提供這個方法, 需改用 ShowModal(匿名方法)) 

可看下面各平台源碼裡面的 ShowWindowModal(...)
FMX.Platform.Android.pas
FMX.Platform.iOS.pas
FMX.Platform.Mac.pas
FMX.Platform.Win.pas

在 Windows 及 OSX 使用無窮迴圈是沒什麼感覺得的, 但在移動平台, 我猜想這是 Android 直接放棄用這個方法的原因.

實測 iOS 在 iPhone 4 以上的機種, 速度比較快, 也沒什麼感覺被拖慢, 但在 iPhone 3GS 裡, 根本不能用 Form.ShowModal; 因為一個字 "慢".
編輯記錄
Main Chen 重新編輯於 2014-11-13 12:53:35, 註解 無‧
P.D.
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2014-11-13 18:29:55 IP:118.160.xxx.xxx 未訂閱
目前我的設計是

main form -> form1 ~ 6 (每一個form 負責一個子專案)
form 1~ 6 下, 每個 form 約有 1-2個form(其實以 Frame取代也行)
但我之前有一些發文, 我手上沒有可以由pc追蹤手機資源損耗的工具,
如果各位有覺得好用的提供, 我倒是可以協助測試,
利用我現有的設計方式, 是否真有 form.DisposeOf 沒有被釋放
===================引 用 aftcast 文 章===================
謝謝 main chen的測試。

此外,我個人也是想了解pd所提的這個問題。因為都是"聽來的",實際上好像不那麼回事。
若以main chen測的100個的結果,只差不到2mb,那算還好吧?!

就我個人目前為止的理解,應該是會有速度上的差異? (開form與frame的速度),或者是開form後,form很難被"正常"釋放,導致關了100個form也回不了原記憶體。

所以,要測的話,可能要在form上放一些東西,並且釋放每個form。同理用在frame上,放一些東西,然後釋放… 也觀查一下開的速度 。

我一直感覺(直覺或是錯覺) tform 在釋放時有問題 (bug?)。 所以才會建議用 frame。 若以低階的角度來看,frame與form同是 view control code,至多差在control code上form較多 (如mian chen測的)。但也差不了多少呀…怪怪

因我自己近來忙,只能講屁話,沒時間實測,若有朋友有經驗或是有時間測,還希望分享一下喔! 感謝大家!
JL9168
中階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2014-11-19 06:29:28 IP:122.117.xxx.xxx 訂閱
To Main Chen

根據小弟自己測試的結果,重點在於ShowWindowModal( )裡面的Procedure必須是用來釋放TForm的預設程序
如果沒有指定,TForm會導致當機,且不會被Release


===================引 用 Main Chen 文 章===================
有興趣的人可以查 Form 的 ShowModal; 這個方法, 它會進入一個無窮迴圈等待使用者回應 (Android 直接不提供這個方法, 需改用 ShowModal(匿名方法))

可看下面各平台源碼裡面的 ShowWindowModal(...)
FMX.Platform.Android.pas
FMX.Platform.iOS.pas
FMX.Platform.Mac.pas
FMX.Platform.Win.pas

在 Windows 及 OSX 使用無窮迴圈是沒什麼感覺得的, 但在移動平台, 我猜想這是 Android 直接放棄用這個方法的原因.

實測 iOS 在 iPhone 4 以上的機種, 速度比較快, 也沒什麼感覺被拖慢, 但在 iPhone 3GS 裡, 根本不能用 Form.ShowModal; 因為一個字 "慢".
編輯記錄
JL9168 重新編輯於 2014-11-19 06:33:30, 註解 無‧
系統時間:2024-04-25 22:35:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!