線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4077
推到 Plurk!
推到 Facebook!

XE5 Android ShowMessage 會當掉

缺席
spfrk
一般會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-12-01 13:37:56 IP:220.136.xxx.xxx 訂閱
Android ShowMessage 或 MessageDlg 一但 lost focus 後就會當掉,
官網建議使用 TPopUp 取代, 可是找遍了 google 與 官網文件都沒完整
的範例如何取代 ShowMessage , 難道要等到 XE10 ?
Main Chen
高階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-12-01 17:37:55 IP:122.116.xxx.xxx 訂閱
目前只能自己找方法解決,下面有些資料可以參考:

Fire Monkey: Progress Dialog and Activity Dialog [iOS, Android]
https://www.youtube.com/watch?v=bzEzOU3EWI4
http://yaroslavbrovin.ru/downloads/fgx/fgx_0.3.0.11.zip

RAD Studio XE5 -- Creating a custom MessageBox
https://www.youtube.com/watch?v=sD2UgY6DWzc


參考:
http://blog.marcocantu.com/blog/xe5_anonymous_showmodal_android.html
spfrk
一般會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-12-01 22:49:50 IP:220.136.xxx.xxx 訂閱
無效 ! 連最基本的 SHOWMESSAGE 都有問題, 可能要等到 XE10 才能商業運轉
spfrk
一般會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2013-12-14 17:24:20 IP:114.45.xxx.xxx 訂閱
TPOPUP 可以製作出類似 ShowMessage 與 MessageDlg
的函式, 但是無法用於 TForm1.FormShow 中, 還是無解.
Main Chen
高階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-12-14 17:33:03 IP:112.104.xxx.xxx 訂閱
看這個影片裡面展示的 App(XE5 for Android 開發的),裡面用到很多對話框,也能開到第三層,你可以去問問作者到底是如何做到的(如果官方能提供類似的範例更好):
http://www.youtube.com/watch?v=jOpY7pZSsDs


作者的網站:
http://delphi.radsoft.com.au/blog/
http://kernow-software.co.uk/
編輯記錄
Main Chen 重新編輯於 2013-12-14 17:38:29, 註解 無‧
spfrk
一般會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2013-12-14 19:04:29 IP:114.45.xxx.xxx 訂閱
我看了這個影片,我所要的是,當程式載入的第一個 FORM.SHOW 時,
此時只有 SHOWMESSAGE 才能顯示得出來, 影片所顯示的功能都是,
在 MAIN FORM 載入後才有的.
spfrk
一般會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2013-12-15 23:00:35 IP:118.160.xxx.xxx 訂閱
ShowMessage 與 MessageDlg 應該是屬於 android 的 system api call,
控制權交出去了, 一但 system 的 focus change, 控制權就回不來了,所以
就當掉了, 在 ms windows 下處理方式, 就是寫一個 timer 當 lost focus,
就去 find window, 然後 set focus , 只是不知道 XE5 是如何處理的?
JamesJuan
中階會員


發表:2
回覆:75
積分:80
註冊:2003-04-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2014-04-02 00:45:32 IP:59.127.xxx.xxx 訂閱
自己寫 ShowMessage 取代應該會是條可行的路
jamesjuantw.pixnet.net/blog/post/175646922
spfrk
一般會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2014-04-05 13:39:32 IP:118.160.xxx.xxx 訂閱
測試了 JamesJuan 所提供的範例程式,測試的結果很奇怪,
跑起來頓頓怪怪的,可以執行,但是多跑幾次,程式就強制跳離,
並回到桌面,又改回 SHOWMESSAGE 就又正常了,看樣子,
好像沒有成功.

JamesJuan
中階會員


發表:2
回覆:75
積分:80
註冊:2003-04-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2014-04-07 08:34:28 IP:59.120.xxx.xxx 訂閱
Hi spfrk,

已經調整了 uDialogs 這個 Unit 的 code,更新於 blog 中,有空的話再麻煩試看看嚕

===================引 用 spfrk 文 章===================
測試了 JamesJuan 所提供的範例程式,測試的結果很奇怪,
跑起來頓頓怪怪的,可以執行,但是多跑幾次,程式就強制跳離,
並回到桌面,又改回 SHOWMESSAGE 就又正常了,看樣子,
好像沒有成功.

spfrk
一般會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2014-04-07 09:29:22 IP:114.45.xxx.xxx 訂閱
Hi JamesJuan 您好:

是否能告知改了哪裡? 是何原因 ?

謝謝 !

JamesJuan
中階會員


發表:2
回覆:75
積分:80
註冊:2003-04-08

發送簡訊給我
#12 引用回覆 回覆 發表時間:2014-04-07 09:33:41 IP:59.120.xxx.xxx 訂閱
Hi spfrk,

增加 AForm.BeginUpdate 與 AForm.EndUpdate

===================引 用 spfrk 文 章===================
Hi JamesJuan 您好:

是否能告知改了哪裡? 是何原因 ?

謝謝 !

spfrk
一般會員


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2014-04-07 11:29:46 IP:111.250.xxx.xxx 訂閱
Hi JamesJuan 您好:

經測試,多跑幾次是不會跳離程式了,但流程還是不對,如下:

if not jMessage('下載') then <= 應該先執行這一列
begin
jMessage('FTP 取消傳輸'); <= 但卻先執行這一列
exit;
end;

procedure DoAfterMessageDlg(const MR: TModalResult);
begin
vMsgYesNo := -1;
case MR of
mrYes : vMsgYesNo := 1;
mrNo : vMsgYesNo := 0;
end;
end;

// 訊息
function TForm1.jMessage(vstr:string):boolean;
begin
uDialogs.msg_YesNo(self, vstr, DoAfterMessageDlg);
if (vMsgYesNo = 1) then Result := True
else Result := False;
end;

JamesJuan
中階會員


發表:2
回覆:75
積分:80
註冊:2003-04-08

發送簡訊給我
#14 引用回覆 回覆 發表時間:2014-04-07 11:52:43 IP:59.127.xxx.xxx 訂閱
Hi spfrk,

callback function 可能沒有辦法像您想使用的這樣,建議改成下面的方式來使用





===================引 用 spfrk 文 章===================
Hi JamesJuan 您好:

經測試,多跑幾次是不會跳離程式了,但流程還是不對,如下:

if not jMessage('下載') then <= 應該先執行這一列
begin
jMessage('FTP 取消傳輸'); <= 但卻先執行這一列
exit;
end;

procedure DoAfterMessageDlg(const MR: TModalResult);
begin
vMsgYesNo := -1;
case MR of
mrYes : vMsgYesNo := 1;
mrNo : vMsgYesNo := 0;
end;
end;

// 訊息
function TForm1.jMessage(vstr:string):boolean;
begin
uDialogs.msg_YesNo(self, vstr, DoAfterMessageDlg);
if (vMsgYesNo = 1) then Result := True
else Result := False;
end;

leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#15 引用回覆 回覆 發表時間:2014-04-07 22:30:31 IP:61.228.xxx.xxx 訂閱
沒有這種 api call
多半是Delphi 自己實現的
像這樣
show;
repeat
Application.HandleMessage;
if Application.Terminated then ModalResult := mrCancel else
if ModalResult <> 0 then CloseModal;
until ModalResult <> 0;
來達到阻斷效果
windows可以這樣搞
android呢 ??

很好奇 XE5 沒有一個像 java 的AlertDialog 這樣的物件嗎?


個人認為 如果拿windows的開發習慣去寫app
那將會是困難重重
這也是我覺得XE5產品規劃奇怪的地方





===================引 用 spfrk 文 章===================
ShowMessage 與 MessageDlg 應該是屬於 android 的 system api call,
控制權交出去了, 一但 system 的 focus change, 控制權就回不來了,所以
就當掉了, 在 ms windows 下處理方式, 就是寫一個 timer 當 lost focus,
就去 find window, 然後 set focus , 只是不知道 XE5 是如何處理的?
spfrk
一般會員


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2014-04-08 22:47:22 IP:114.45.xxx.xxx 訂閱
Hi JamesJuan 您好:

狀況還是一樣,連續跑2次就當掉了,CALL BACK 已改成 nil 還是一樣
JamesJuan
中階會員


發表:2
回覆:75
積分:80
註冊:2003-04-08

發送簡訊給我
#17 引用回覆 回覆 發表時間:2014-04-09 08:42:38 IP:59.127.xxx.xxx 訂閱
Hi spfrk,

1.我用測試程式連續使用 20 次以上都無問題,這個作法跟平台無關,在 win32 上也可以測試或使用。
2.由於無法得知您使用的方式,我有上傳測試程式完整 source code 到 onedrive 供您參考…
source code

===================引 用 spfrk 文 章===================
Hi JamesJuan 您好:

狀況還是一樣,連續跑2次就當掉了,CALL BACK 已改成 nil 還是一樣
編輯記錄
JamesJuan 重新編輯於 2014-04-09 08:44:16, 註解 無‧
spfrk
一般會員


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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2014-04-09 09:30:04 IP:118.168.xxx.xxx 訂閱
JamesJuan 您好:

程式我只做了一小部分修改, 如下, 是不是不能引用 Unit2 的關係,
如果不能引用,那就無法存取 vMsgYesNo 此變數了

// 訊息
function TForm1.jMessage(vstr:string):Boolean;
begin
uDialogs.msg_YesNo(self, vstr, nil);
if (vMsgYesNo = 1) then Result := True
else Result := False;
end;


uDialogs.pas // 為了要取用 vMsgYesNo 變數, 引用了 Unit2.pas

...

implementation

uses
FMX.Graphics, System.IOUtils,Unit2;

...

// 修改 Button 無 call back
procedure TMyCustomDialog.ButtonNoClick(Sender: TObject);
begin
vMsgYesNo := 1;
FBackGroundRectangle.Visible := False;
FFrontRectangle.Visible := False;
// if Assigned(FCallback) then
// FCallback(mrNo);
end;

procedure TMyCustomDialog.ButtonYesClick(Sender: TObject);
begin
vMsgYesNo := 0;
FBackGroundRectangle.Visible := False;
FFrontRectangle.Visible := False;
// if Assigned(FCallback) then
// FCallback(mrYes);
end;
JamesJuan
中階會員


發表:2
回覆:75
積分:80
註冊:2003-04-08

發送簡訊給我
#19 引用回覆 回覆 發表時間:2014-04-09 13:37:18 IP:59.127.xxx.xxx 訂閱
Hi spfrk,

姑且不論是否 uses 了 unit2,下述這段 code 本身就有問題

<!--[if gte mso 9]><xml> </xml><![endif]-->function TForm1.jMessage(vstr:string):Boolean;
begin
uDialogs.msg_YesNo(self, vstr, nil); <-- 這行執行完...馬上會執行下一行 if...,不會等到使用者點選 y or n
if (vMsgYesNo = 1) then Result := True
else Result := False;
end;

之前說明過這是使用 callback 的方式,不能以以前呼叫 dialog 的方式來思考
<!--[if gte mso 9]><xml> Normal 0 0 2 false false false EN-US ZH-TW X-NONE </xml><![endif]--><!--[if gte mso 9]><xml> </xml><![endif]--><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:表格內文; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman","serif";} </style>
spfrk
一般會員


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

發送簡訊給我
#20 引用回覆 回覆 發表時間:2014-04-10 09:28:14 IP:118.160.xxx.xxx 訂閱
Hi JamesJuan 您好:

努力試了,還是一樣不行,畢竟WINDOWS 程式寫太久了,觀念一下子轉不過來,
目前我想用 XE5 DELPHI ANDROID 寫一個點餐程式,以前我都是用 WIN CE
的 C 寫的,目前已經買不到 WIN CE 的 PDA 了,不然就是太貴了.

日前微軟宣布9吋以下的WINDOWS PHONE 不收權利金了,而且將統一開發
平台,不分PHONE,PAD,DESKTOP,只有等待XE5或微軟的升級了.

謝謝 JamesJuan 您的耐心解說.
spfrk
一般會員


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

發送簡訊給我
#21 引用回覆 回覆 發表時間:2014-04-18 16:41:10 IP:60.250.xxx.xxx 訂閱
已經出 XE6 了, 不知 ShowMessage 或 MessageDlg 的問題是否已經解決 ?
JamesJuan
中階會員


發表:2
回覆:75
積分:80
註冊:2003-04-08

發送簡訊給我
#22 引用回覆 回覆 發表時間:2014-04-22 15:03:19 IP:59.127.xxx.xxx 訂閱
就 source code 來看,看不出來有任何改變

delphi 原本就是呼叫 android 的 AlertDialog.Builder,不管是 ShowMessage 或是 MessageDlg 都一樣
程式碼在 FMX.Platform.Android.pas 中 TCommonAlertDialogRunner 這個 class
就程式碼來看,XE5 跟 XE6 在這部分並無改變

實際測試 XE6 狀況也跟 XE5 是一樣的

===================引 用 spfrk 文 章===================
已經出 XE6 了, 不知 ShowMessage 或 MessageDlg 的問題是否已經解決 ?
系統時間:2017-12-14 4:23:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!