2016-07-06 19 views
1

Ich habe ein Problem mit C++ Builder und FireMonkey. Ich erstelle eine mobile Anwendung, die mit einem Datasnap Rest WebService verbunden ist. Einige Anfragen sind ein wenig lang, daher möchte ich eine wartende Nachricht anzeigen. Hier ist mein Code:10 C++ Builder: Aktualisieren FireMonkey Visual Component

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!"; 

Ich habe versucht, Funktionen form-> Invalidate() und Label-> Repaint(), aber nur der letzte Text angezeigt wird. Was kann ich tun, um das Label in meiner Funktion dynamisch zu aktualisieren?

+0

jetzt ich nicht wirklich über diesen Builder oder Firemonkey wissen aber in der Regel C++ schnell genug ist, damit Ihr Auge nicht die Änderung der Benutzeroberfläche sehen können, sind Sie sicher, dass Ihre Abfrage ausgeführt wird lang genug wie ~ 5s mindestens? – deW1

+0

Die Abfrage dauert zwischen 3 und 6 Sekunden, also bin ich mir sicher, dass es kein optischer Effekt ist. Danke für deine Antwort – Dylan

Antwort

1

Die Änderung des Textes muss vom Haupt-Thread behandelt werden, der durch die Anfrage blockiert wird. Wenn Sie für lange Anfragen keinen separaten Thread verwenden möchten, müssen Sie Application->ProcessMessages() anrufen.

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!"; 

Hinweis:

Sie haben mit Application->ProcessMessages() vorsichtig sein. Sie finden viele Artikel und Diskussionen dazu im Internet. Wenn Sie mit der VCL arbeiten, gibt es die Methode Update für Steuerelemente vom Typ TWinControl, die die Funktion UpdateWindow der WinAPI aufruft. Firemonkey hat eine ähnliche Funktion, aber nur für Windows.

Fügen Sie FMX.Platform.Win.hpp und ersetzen Application->ProcessMessages() mit UpdateWindow(Platform::Win::WindowHandleToPlatform(Handle)->Wnd)

+0

Danke! Es klappt! – Dylan

+0

VON 'Application-> ProcessMessages()'! Wenn Sie nur möchten, dass die Benutzeroberfläche neu gezeichnet wird, verwenden Sie die Methode 'Repaint()' der einzelnen Steuerelemente oder sogar das Formular selbst, um ausstehende Zeichenoperationen zu verarbeiten. Verwenden Sie die Methode 'InvalidateRect()', um Steuerelemente zu signalisieren, die neu gezeichnet werden müssen. –

+0

@RemyLebeau: Ich habe das auch versucht. Aber die Kontrolle wird nicht sofort neu gezeichnet. Auch 'TForm' hat nicht die Methode' Repaint() '. –