ShowModal 問題 |
缺席
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
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 發送簡訊給我 |
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 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
感謝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 發送簡訊給我 |
|
JamesJuan
中階會員 發表:2 回覆:76 積分:80 註冊:2003-04-08 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |