showmessage與sleep |
答題得分者是:P.D.
|
pcernet
初階會員 發表:69 回覆:113 積分:41 註冊:2002-11-29 發送簡訊給我 |
各位先進,小弟使用XE7 FMX
procedure TTabbedForm.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); begin
listview1.ItemIndex:=AItem.Index; showmessage(Aitem.Text ',' listview1.Items.Item[listview1.ItemIndex].Text); ... end;如果有使用showmessage,那後面程式中抓到的listview1.ItemIndex 才會是 AItem.Index ================== 另一個程序 showmessage('...'); ttsListener:=TttsOnInitListener.Create(self); tts := TJTextToSpeech.JavaClass.init(SharedActivityContext, ttsListener); 如果不使用showmessage,那麼有時候程序會正常執行,有時候則會自動退出程序 但如果有使用showmessage,就不會有這個問題,不知道是不是調用JAVA API需要時間,所以改用Sleep試試,還是不行。 ==================== 當螢幕顯示showmessage時,程序好像還是在繼續往下執行... 不知道會不會有人也有這種問題,謝謝! |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我不是要直接回覆你這個問題, 因為我也不知道, 但我確實曾經遇到過有時候要即時取得某一個狀況時, 加入 showmessage(), 確實可以讓系統"喘口氣", 然後就可以抓到了,
我也做過使用sleep(), 想法和你一樣, 但sleep()似乎會讓系統整個停下來(這是我的想法啦, 沒有去探討), 所以包含取值的行為也停下來, 等到sleep算完後, 就等於由剛才的暫停在被恢復, 其實你等待的時間一點意義也沒有, 這就像 sleep 是時光凍結器, 一旦啟動包含你自己也被凍結了, 等你解凍後, 你完全無感時間的流逝, 因此你要的應該是可以凍結別人的, 自己卻不會的工具, 所以你可以用下面的方式取代 sleep 試試看 ps.另提, 我也曾遇到, 第一次加showmesassage()成功取得, 再移除showmessage()之後, 竟然就像打通任督二脈一樣, 就算不加也ok! 不妨也可如法泡製一下 uses ..... FMX.Types, ....; private { Private declarations } FTimeService : IFMXTimerService; ..... procedure TForm_Main.FormCreate(Sender: TObject); begin // 註冊 Android 服務 TPlatformServices.Current.SupportsPlatformService(IFMXTimerService, IInterface(FTimeService)); end; .... procedutre .... var bTime, eTime : Extended; begin if FTimeService <> nil then begin bTime := FTimeService.getTick; eTime := bTime; while eTime - bTime <= 5000 do begin Application.ProcessMessages; eTime := FTimeService.GetTick; // coding here end; end; end; 請不要小看這段code, 我可是花了16hr*8day 才找到相關的訊息, 再加入自己的測試才成功的, 我曾看過還有使用 TStopWatch 的, 但我試了數天沒有答案, 所以如果對 StopWatch 熟的網友, 不妨也分享一下設計的成果! |
pcernet
初階會員 發表:69 回覆:113 積分:41 註冊:2002-11-29 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
其實這個現象我不確定是否 waitting 所造成的, 就如我上面所提及的經驗, 真的有時加showmessage()就可以取到上段想要取的值, 不加就沒有辦法,
但有時又沒個準, 是很棘手的情況, 如果 getick 也解決不了, 那我也沒有方向了, 看看還有沒有其他高手可以出手救援囉! ===================引 用 pcernet 文 章=================== 謝謝P.D.的熱心,將您的程式引用單元 改為 FMX.Platform 後可以正常執行,但初步測試的結果還是一樣,我再試試,謝謝! |
blue
中階會員 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
當螢幕顯示showmessage時,程序好像還是在繼續往下執行...
是開發Android嗎? 小弟在Android上也是這樣, 問了說要用 MessageDlg(.....procedure 可是還是一樣的說! ===================引 用 pcernet 文 章=================== 各位先進,小弟使用XE7 FMX procedure TTabbedForm.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); begin
listview1.ItemIndex:=AItem.Index; showmessage(Aitem.Text ',' listview1.Items.Item[listview1.ItemIndex].Text); ... end;如果有使用showmessage,那後面程式中抓到的listview1.ItemIndex 才會是 AItem.Index ================== 另一個程序 showmessage('...'); ttsListener:=TttsOnInitListener.Create(self); tts := TJTextToSpeech.JavaClass.init(SharedActivityContext, ttsListener); 如果不使用showmessage,那麼有時候程序會正常執行,有時候則會自動退出程序 但如果有使用showmessage,就不會有這個問題,不知道是不是調用JAVA API需要時間,所以改用Sleep試試,還是不行。 ==================== 當螢幕顯示showmessage時,程序好像還是在繼續往下執行... 不知道會不會有人也有這種問題,謝謝! |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
的確, xe7 的版本, 不論是 ShowMessage, 或 MessageDlg 都會繼續往下走, 這與 win32 截然不同, 然而在 XE6 時不是這麼樣, 它是會停在 Dialogs 上的,
但也因為這樣造成 Focus 離開 app時, 如果有ShowMessage 會導致 app 死機, 所以才改成這樣, 因此想用 ShowMessage 來顯示訊息, 還想要暫停下來, 可能要找其他方法了 ===================引 用 blue 文 章=================== 當螢幕顯示showmessage時,程序好像還是在繼續往下執行... 是開發Android嗎? 小弟在Android上也是這樣, 問了說要用 MessageDlg(.....procedure 可是還是一樣的說! 不知道會不會有人也有這種問題,謝謝! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |