Einzelnen Beitrag anzeigen

Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

OnDraw wird nicht immer ausgeführt

  Alt 13. Mai 2016, 13:10
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat