Hi,
ich habe eine Statusbar, die in ihren Panels den Mitarbeiterstatus per psOwnerDraw darstellen soll.
Dieser Status wird durch verschiedene Programmfunktionen beeinflusst. Die jeweile Breite eines Panels wird so berechnet, dass alle Panels über die Breite der Statusbar diese vollständig füllen, also auch beim vergrößern des Fensters entsprechend ihre Breite ändern sollen.
Nun habe ich in einer Updateprocdure die den Status setzt ein StatusBar.Repaint auslöst und zusätzlich im OnFormResize nur das Statusbar.Repaint, damit sich eben beim ändern der Größe auch die Panelbreite neu berechnet werden kann.
Während das beim Resize ohne Probleme funktioniert, wird das Repaint innerhalb der Updateprocedure war angesprungen, aber das OnDraw der Statusbar nicht ausgeführt.
An Code gibt's nicht viel zu zeigen.
Delphi-Quellcode:
procedure Tfrm_main.UpdateMAStatus;
begin
StatusBar1.Panels.BeginUpdate;
// Hier werden die Objecte upgedatet, die später
// im OnDraw der StatusBar zum Zeichnen der Panels wervendet werden.
// Unter Anderem setze ich hier für jedes Panel den Style:=psOwnerDraw
calcPanelWidth;
StatusBar1.Panels.EndUpdate;
StatusBar1.Repaint; //diese Zeile wird auch ausgeführt
end;
procedure Tfrm_main.calcPanelWidth;
var
i, w: Integer;
begin
w:=Trunc(StatusBar1.Width/StatusBar1.Panels.count);
for i:=0 to StatusBar1.Panels.count-1 do
StatusBar1.Panels[i].Width:=w;
end;
procedure Ffrm_main.FormResize(Sender: TObject);
begin
StatusBar1.Panels.BeginUpdate;
calcPanelWidth;
StatusBar1.panels.EndUpdate;
StatusBar1.Repaint;
end;
Wird nun die Procedure UpdateMAStatus ausgeführt, so werden die Objekte darin upgedated, aber die Statusbar bleibt auf den vorher gültigen Informationen stehen. Mache ich aber das Fenster etwas größer (Löse also ein Resize aus) so werden die neuen Daten wie gewünscht gezeichnet. Mir erschließt sich nicht, wo der Unterschied zwischen UpdateMAStatus und FormResize ist, der dieses Problem zur Folge hat.
Refresh, Update und Invalidate habe ich auch ausprobiert. Bei Refresh und Update ändert sich nicht. Bei Invalidate sind dann plötzlich alle Panels leer, bis zum nächsten Resize.