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

ShowModal 問題

缺席
P.D.
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-03-23 12:19:15 IP:118.160.xxx.xxx 未訂閱
Hello 各位, 

又來問了

Form1 -> MainForm(有一個Button1, Label1)
Form2 -> 非自動Create 的 Form (有一個Button2)

Form1.Button1
var Form2 : TForm2;
begin
Form2 := TForm2.Create(nil);
Form2.ShowModal(procedure( ModalResult : TModalResult)
begin
if ModalResult = mrOK then begin
Label1.Text := 'Form2 Free';
end;
Form2.disposeOf;
end);
end;

以上這段是我找遍了網路所談到 FireMoneky 有關 ShowModal 的用法,
因為Android 沒有 ShowModal 的支援, 所以網路上看到都指出上述的程式是可以取代ShowModal
但我實測的結果
1. Form1點 button1 可以秀出 form2
2. 在 form2 點 Form2.Button2
Form2.Button1.ModalResult := mrOK; (也嘗試直接設定Button1.ModalResult = mrOK)
Form2.Close;
3. Form2關閉了, 但 Form1也被關閉了,
沒有辦法如以前的Delphi ShowModal 會回到 Form1 上

請問各位
是否還有那裡 "老師沒講到?"
JamesJuan
中階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-03-24 14:14:49 IP:59.127.xxx.xxx 未訂閱
PD 版大您好,

官方網站的寫法
http://docwiki.embarcadero.com/RADStudio/XE5/en/ShowModal_Dialogs_in_FireMonkey_Mobile_Apps

Marco Cantu Blog 的寫法
http://blog.marcocantu.com/blog/xe5_anonymous_showmodal_android.html

兩者的寫法是一樣的,也跟您貼出來的是一樣的。
不過實際測試,只要執行到 Form2.disposeOf 這句....90% 以上的機率 app 就 crash 了

您可以改成如下方式

Form1.Button1
var Form2 : TForm2;
begin
Form2 := TForm2.Create(nil);
Form2.ShowModal(procedure( ModalResult : TModalResult)
begin
if ModalResult = mrOK then begin
Label1.Text := 'Form2 Free';
end;
TThread.Queue(nil, Form2.disposeOf);
end);
end;

實際測試兩台不同的硬體,約莫最多執行大概 5 次仍會 crash...運氣好一點的話大約可以撐到 7~8 次
結論...不建議用 ShowModal

原文參考
https://forums.embarcadero.com/thread.jspa?messageID=625618򘯒

編輯記錄
JamesJuan 重新編輯於 2014-03-24 14:16:01, 註解 無‧
JamesJuan 重新編輯於 2014-03-24 15:17:32, 註解 無‧
P.D.
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-03-24 15:49:19 IP:59.120.xxx.xxx 未訂閱
感謝James的說明, 
不過實測結果如下

1. 我新開一個專案, 什麼都不放, 就兩個form(main, child), 按上面我原來的寫法執行,
form2 可以回到 form1, 而且連續操作超過50次以上也沒有crash
但按這個寫法放在我實際的app專案中(就是有放一堆元件..), form2回到form1 就crash(一次就中)
2. 按James的做法情況如上,
3. 這段寫法, 我實測 form2 永遠傳不回 ModalResult 的結果,
也就是我下 if ModalResult = mrOK 永遠得不到正確的判斷, 但情況也非我所設想, 那會跑 else 的部份,
其實也沒有

if ModalRsult = mrOK
then showmessage('free')
else showmessage('not free');

結果是兩個都沒執行! 這怪吧!

會想用多個form的原因, 當然embd 上課一直提到不要用到多form 設計, 但我要寫一支程式可能有5-6個不同的功能模組,
我想用對應的form來設計(每個模組可能有3-4個頁面功能), 這樣我可以需要用到這個模式時才ceate form, 用完釋放掉,
對手機的記憶體應該會比較有利, 而不是向以往寫一支exe, 把所有功能都放進去(即一開始所有form都先create出來),
這是我想做的, 利用一支主系統來呼叫其他模組( 有點像 exe call dll),
當然我也想到想用TFrame來解決, 但在 xe5 的 TFrame 使用還不熟, 所以才想先用 form 的方式來解決
JamesJuan
中階會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-03-24 15:58:06 IP:59.127.xxx.xxx 未訂閱
PD 版大您好,

1.如果一跑就 crash....我只能說真不太適合用 ShowModal @ mobile 情境
2.永遠傳不回 ModalResult 的結果....但情況也非我所設想, 那會跑 else 的部份
請參閱 TCommonCustomForm 原始碼如下



所以一定要設定 ModalResult 才會觸發 Form2.ShowModal(procedure( ModalResult : TModalResult) 裡面的程式碼...
JamesJuan
中階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-04-02 00:43:17 IP:59.127.xxx.xxx 未訂閱
PD 版大您好,

另外一個選擇供您參考
http://jamesjuantw.pixnet.net/blog/post/175646922
P.D.
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-08-05 13:45:11 IP:59.120.xxx.xxx 未訂閱
感謝各方協助, 問題已解決, 但因涉及系統保密協定, 所以無法公開片斷
系統時間:2024-04-27 2:58:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!