Einzelnen Beitrag anzeigen

marfin777

Registriert seit: 23. Jul 2015
5 Beiträge
 
Delphi XE8 Professional
 
#1

TStatusBar mit 'OwnerDraw'-Panel periodisch neu zeichnen

  Alt 6. Okt 2015, 10:05
Delphi-Version: XE8
Hallo Freunde,

Hintergrund
Mir geht es um eine Rückmeldung, ob eine Datenbankverbindung besteht.
Diese Überprüfung wird auch periodisch über ein Timer-Ereignis alle 3s angestoßen.
Über den Bool'schen Wert "DbConnectIsOk" sehe ich den aktuellen Verbindungsstatus.

Form/StatusBar
In meiner Main-Form habe ich eine StatusBar dessen 2.Panel den Style "psOwnerDraw" hat,
damit ich anhand dieser Anleitung http://delphi.about.com/od/vclusing/...sbar_owner.htm
das Panel zeichne.

Delphi-Quellcode:
Procedure TfrmMainWindow.Stat_MainDrawPanel(StatusBar : TStatusBar; Panel : TStatusPanel;
  Const Rect : TRect);
Begin
  If Panel = StatusBar.Panels[1] Then // zweites Panel
  Begin
    With StatusBar.Canvas Do
    Begin
      If DbConnectIsOk Then //DbConnectIsOk ist eine globale Variable die den Verbindungsstatus anzeigt
      Begin
        Brush.Color := ClLime;
        Font.Color := ClTeal;
        Font.Style := [FsItalic];
        Panel.Text := 'Verbunden';
      End
      Else
      Begin
        Brush.Color := Clred;
        Font.Color := ClNavy;
        Font.Style := [FsBold];
        Panel.Text := 'Getrennt';
      End;
      FillRect(Rect); // Hintergrund mit der Farbe füllen
      TextRect(Rect, 2 + Il_StatusBar.Width + Rect.Left, Rect.Top, Panel.Text); // Textausgeben (Il_STatusBar ist die ImageList mit dem Icon)
    End;
    Il_StatusBar.Draw(Stat_Main.Canvas, Rect.Left, Rect.Top, 0); // Icon einfügen //Stat_Main ist die StatusBar
  End;
End;
Problem
Jetzt würde ich allerdings auch gerne das Panel neu zeichnen lassen,
da dieses eine mögliche Veränderung von "DbConnectIsOk" lediglich bei einem Neuzeichnen der gesamten Maske (Resize/Show/...) mitbekommt.

Entweder müsste ich TfrmMainWindow.Stat_MainDrawPanel jedesmal über das TimerEvent aufrufen (da wüsste ich nicht genau wie)
oder es gibt noch eine andere Lösung, mit der ich im TimerEvent das Panel direkt neu zeichnen kann.

Hat jemand einen guten Rat für mich?
Markus
  Mit Zitat antworten Zitat