2016-05-05 4 views
0

Ich habe eine Statusleiste mit 3 Panels. Wenn ich den Text von ihnen in Laufzeit ändere, wird es in der ersten (Index 0) nicht geändert.Update-Text in der Statusleiste zeigt keine Änderungen im ersten Panel mit anderen VCL-Thema verwendet

Ich sehe, das passiert nur, wenn andere VCL Thema gewählt wird (zB Cyan Dusk).

Initial Design Texte sind:

StatusBar.Panels[0].Text := '1'; 
StatusBar.Panels[1].Text := '2'; 
StatusBar.Panels[2].Text := '3'; 

Und in der Laufzeit habe ich es:

StatusBar.Panels[0].Text := '11'; // this is not changed visually 
StatusBar.Panels[1].Text := '22'; 
StatusBar.Panels[2].Text := '33'; 

Ich habe auch versucht, diesen Code schließlich nichts gearbeitet:

Application.ProcessMessages; 
StatusBar.Refresh; 
StatusBar.Update; 
Refresh; 

I Ausprobiert hat es auch in der leeren neuen Anwendung das selbe Problem.

Wenn ich versuche, es zu debuggen, in Code Inspector ich sehe, hat sich der Wert geändert habe ich versucht, auch für den Index 0.

Auch dieses:

procedure TMainForm.StatusBarClick(Sender: TObject); 
begin 
    ShowMessage(StatusBar.Panels[0].Text); // 11 
    ShowMessage(StatusBar.Panels[1].Text); // 22 
    ShowMessage(StatusBar.Panels[2].Text); // 33 
end; 

Aber noch in der Statusbar Panel Index 0 ist nur 1.

Hinweis: Dies geschieht nur, wenn ein anderes VCL-Thema verwendet wird.

Ist dieser Fehler in VCL-Themen? Wie kann ich evozieren, um geänderten Text zu aktualisieren?

UPDATE:

Wenn ich StatusBar.StyleElements := StatusBar.StyleElements - [seClient]; eingestellt es funktioniert auch für die erste Platte. Aber warum ohne das funktioniert es nur für Panels mit Index> 0?

+0

Wenn Sie den Zugriff auf die VCL-Quellcode haben, sehen Sie die Implementierung von 'TStatusBar.StyleElements' und sehen Sie selbst, warum' seClient' macht einen Unterschied. –

Antwort

0

Also, es ist ein Fehler in VCL-Themen. Dies löste das Problem, und aktualisierten Text auch im StatusBar.Panels[0]:

StatusBar.StyleElements := StatusBar.StyleElements - [seClient]; 

Application.ProcessMessages; 

StatusBar.Panels[0].Text := '11'; // now the text is updated visually 
StatusBar.Panels[1].Text := '22'; 
StatusBar.Panels[2].Text := '33'; 

Application.ProcessMessages; 

StatusBar.StyleElements := StatusBar.StyleElements + [seClient]; 

Application.ProcessMessages; 
Verwandte Themen