![]() |
OnDraw wird nicht immer ausgeführt
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:
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.
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; 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. |
AW: OnDraw wird nicht immer ausgeführt
Ohne es genau zu wissen und getestet zu haben, aber wird beim Resize nicht eh ein Repaint aufgerufen?
Vielleicht ist die Kombination aus dem automatisch aufgerufenen Repaint durch das Resizen und den manuellen Repaint der Grund, weswegen es klappt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz