XE5 Android ShowMessage 會當掉 |
缺席
|
spfrk
一般會員 發表:16 回覆:43 積分:11 註冊:2013-10-01 發送簡訊給我 |
|
Main Chen
高階會員 發表:29 回覆:135 積分:127 註冊:2002-10-07 發送簡訊給我 |
目前只能自己找方法解決,下面有些資料可以參考:
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 發送簡訊給我 |
|
spfrk
一般會員 發表:16 回覆:43 積分:11 註冊:2013-10-01 發送簡訊給我 |
|
Main Chen
高階會員 發表:29 回覆:135 積分:127 註冊:2002-10-07 發送簡訊給我 |
看這個影片裡面展示的 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 發送簡訊給我 |
|
spfrk
一般會員 發表:16 回覆:43 積分:11 註冊:2013-10-01 發送簡訊給我 |
|
JamesJuan
中階會員 發表:2 回覆:76 積分:80 註冊:2003-04-08 發送簡訊給我 |
|
spfrk
一般會員 發表:16 回覆:43 積分:11 註冊:2013-10-01 發送簡訊給我 |
|
JamesJuan
中階會員 發表:2 回覆:76 積分:80 註冊:2003-04-08 發送簡訊給我 |
|
spfrk
一般會員 發表:16 回覆:43 積分:11 註冊:2013-10-01 發送簡訊給我 |
|
JamesJuan
中階會員 發表:2 回覆:76 積分:80 註冊:2003-04-08 發送簡訊給我 |
|
spfrk
一般會員 發表:16 回覆:43 積分:11 註冊:2013-10-01 發送簡訊給我 |
Hi JamesJuan 您好:
經測試,多跑幾次是不會跳離程式了,但流程還是不對,如下: if not jMessage('下載') then<= 但卻先執行這一列 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 回覆:76 積分:80 註冊:2003-04-08 發送簡訊給我 |
Hi spfrk,
callback function 可能沒有辦法像您想使用的這樣,建議改成下面的方式來使用 ===================引 用 spfrk 文 章=================== Hi JamesJuan 您好: 經測試,多跑幾次是不會跳離程式了,但流程還是不對,如下: if not jMessage('下載') then<= 但卻先執行這一列 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 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
沒有這種 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 發送簡訊給我 |
|
JamesJuan
中階會員 發表:2 回覆:76 積分:80 註冊:2003-04-08 發送簡訊給我 |
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 發送簡訊給我 |
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 回覆:76 積分:80 註冊:2003-04-08 發送簡訊給我 |
Hi spfrk,
姑且不論是否 uses 了 unit2,下述這段 code 本身就有問題 <!--[if gte mso 9]><xml> if (vMsgYesNo = 1) then Result := True else Result := False; end; 之前說明過這是使用 callback 的方式,不能以以前呼叫 dialog 的方式來思考 <!--[if gte mso 9]><xml> |
spfrk
一般會員 發表:16 回覆:43 積分:11 註冊:2013-10-01 發送簡訊給我 |
|
spfrk
一般會員 發表:16 回覆:43 積分:11 註冊:2013-10-01 發送簡訊給我 |
|
JamesJuan
中階會員 發表:2 回覆:76 積分:80 註冊:2003-04-08 發送簡訊給我 |
就 source code 來看,看不出來有任何改變
delphi 原本就是呼叫 android 的 AlertDialog.Builder,不管是 ShowMessage 或是 MessageDlg 都一樣 程式碼在 FMX.Platform.Android.pas 中 TCommonAlertDialogRunner 這個 class 就程式碼來看,XE5 跟 XE6 在這部分並無改變 實際測試 XE6 狀況也跟 XE5 是一樣的 ===================引 用 spfrk 文 章=================== 已經出 XE6 了, 不知 ShowMessage 或 MessageDlg 的問題是否已經解決 ? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |