AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OnDraw wird nicht immer ausgeführt

Ein Thema von Captnemo · begonnen am 13. Mai 2016 · letzter Beitrag vom 13. Mai 2016
Antwort Antwort
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, 14: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
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: OnDraw wird nicht immer ausgeführt

  Alt 13. Mai 2016, 15:32
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 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