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

showmessage與sleep

答題得分者是:P.D.
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-11-03 11:01:32 IP:59.120.xxx.xxx 未訂閱
 各位先進,小弟使用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-11-03 18:41:35 IP:59.120.xxx.xxx 未訂閱
我不是要直接回覆你這個問題, 因為我也不知道, 但我確實曾經遇到過有時候要即時取得某一個狀況時, 加入 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 熟的網友, 不妨也分享一下設計的成果!
編輯記錄
P.D. 重新編輯於 2014-11-03 18:42:40, 註解 無‧
P.D. 重新編輯於 2014-11-03 18:43:10, 註解 無‧
P.D. 重新編輯於 2014-11-03 18:46:41, 註解 無‧
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-11-04 09:47:03 IP:59.120.xxx.xxx 未訂閱
謝謝P.D.的熱心,將您的程式引用單元 改為 FMX.Platform 後可以正常執行,但初步測試的結果還是一樣,我再試試,謝謝!
P.D.
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-11-04 13:44:07 IP:114.44.xxx.xxx 未訂閱
其實這個現象我不確定是否 waitting 所造成的, 就如我上面所提及的經驗, 真的有時加showmessage()就可以取到上段想要取的值, 不加就沒有辦法, 
但有時又沒個準, 是很棘手的情況, 如果 getick 也解決不了, 那我也沒有方向了, 看看還有沒有其他高手可以出手救援囉!
===================引 用 pcernet 文 章===================
謝謝P.D.的熱心,將您的程式引用單元 改為 FMX.Platform 後可以正常執行,但初步測試的結果還是一樣,我再試試,謝謝!
blue
中階會員


發表:169
回覆:136
積分:81
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-12-03 17:03:18 IP:122.146.xxx.xxx 訂閱
當螢幕顯示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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-12-04 01:53:23 IP:118.169.xxx.xxx 未訂閱
的確, xe7 的版本, 不論是 ShowMessage, 或 MessageDlg 都會繼續往下走, 這與 win32 截然不同, 然而在 XE6 時不是這麼樣, 它是會停在  Dialogs 上的, 
但也因為這樣造成 Focus 離開 app時, 如果有ShowMessage 會導致 app 死機, 所以才改成這樣, 因此想用 ShowMessage 來顯示訊息, 還想要暫停下來,
可能要找其他方法了
===================引 用 blue 文 章===================
當螢幕顯示showmessage時,程序好像還是在繼續往下執行...
是開發Android嗎?
小弟在Android上也是這樣,
問了說要用 MessageDlg(.....procedure
可是還是一樣的說!
不知道會不會有人也有這種問題,謝謝!
系統時間:2024-04-20 3:24:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!