2016-07-06 17 views
1

C++ BuilderとFireMonkeyに問題があります。私はDatasnap Rest WebServiceに接続されたモバイルアプリケーションを作成しています。いくつかのリクエストは少し長いので、私は待っているメッセージを表示したい。ここに私のコードは次のとおりです。C++ Builder:FireMonkeyビジュアルコンポーネントをリフレッシュする

lbl_testConnexion->Text = "Please Wait..."; 
lbl_testConnexion->TextSettings->FontColor = TAlphaColorRec::Red; 
this->Invalidate(); 

//Call to the Web Service 
list<Colis>* l = WS->getListeColis("00DP0097"); 

lbl_testConnexion->Text = "Success!"; 

私は機能フォーム - >無効化()とはLabel->再描画()しようとしましたが、最後のテキストが表示されます。 私の機能でラベルを動的に更新するにはどうすればよいですか?

+0

Application->ProcessMessages()を置き換えます少なくとも〜5秒くらいの長さ? – deW1

+0

クエリには3〜6秒かかりますので、光学効果ではないと確信しています。あなたのお返事ありがとう – Dylan

答えて

1

テキストの変更は、要求によってブロックされたメインスレッドによって処理されなければなりません。長いリクエストに別のスレッドを使用したくない場合は、Application->ProcessMessages()に電話する必要があります。

lbl_testConnexion->Text = "Please Wait..."; 
lbl_testConnexion->TextSettings->FontColor = TAlphaColorRec::Red; 
Application->ProcessMessages(); 

//Call to the Web Service 
list<Colis>* l = WS->getListeColis("00DP0097"); 

lbl_testConnexion->Text = "Success!"; 

注:

あなたはApplication->ProcessMessages()に気をつけなければなりません。これに関する多くの記事やディスカッションをインターネットで見つけることができます。 VCLで作業する場合、TWinControlのコントロールのメソッドUpdateが存在し、WinAPIの関数UpdateWindowを呼び出します。 Firemonkeyにも同様の機能がありますが、Windowsの場合のみです。

は、あなたの目はあなたが必ずあなたのクエリが実行されているUIの変化を見ることができませんので、十分に速い++今私は本当にこのビルダーやFireMonkeyの程度が、通常はC知らないFMX.Platform.Win.hppを含めるとUpdateWindow(Platform::Win::WindowHandleToPlatform(Handle)->Wnd)

+0

ありがとう!できます! – Dylan

+0

'Application-> ProcessMessages()'から離れてください! UIを再描画させたいだけなら、保留中のペイント操作を処理するには、個々のコントロールの 'Repaint()'メソッド、またはForm自体を使用します。 InvalidateRect()メソッドを使用して、再描画が必要なコントロールに信号を送ります。 –

+0

@RemyLebeau:私もこれを試しました。しかし、コントロールはすぐに再描画されません。また、 'TForm'には' Repaint() 'メソッドがありません。 –

関連する問題