Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi OnDraw wird nicht immer ausgeführt (https://www.delphipraxis.net/189184-ondraw-wird-nicht-immer-ausgefuehrt.html)

Captnemo 13. Mai 2016 13:10

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:
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.

TiGü 13. Mai 2016 14:32

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 16:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz