AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

StatusBar.DrawPanel geht nicht mit Skinning.

Ein Thema von hewy · begonnen am 30. Aug 2013 · letzter Beitrag vom 2. Sep 2013
Antwort Antwort
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
51 Beiträge
 
Delphi XE5 Enterprise
 
#1

StatusBar.DrawPanel geht nicht mit Skinning.

  Alt 30. Aug 2013, 14:48
Hallo

anbei eine kleine Beispiel Applikation welche eine Progressbar auf einer StatusBar anzeigt. In unsere Applikation verwenden wir DrawPanel der StatusBar für verschieden zwecke. Nun soll die Applikation auch noch ein Kinning erhalten. Wird das Skinning aktiviert wird DrawPanel der StatusBar nicht mehr ausgeführt.

Zu testen:
Neue VCL Form Appl erstellen.
tButton [Name := Button1]
tTimer [Name := TimerStatusProgress]
drauflehen

Mein Code dazu.
Breackpoint auf Zeile 50 (Innerhalb DrawPanel)

Solange das Skinning aktiv ist wird DrawPanel nicht durchlaufen.
Wird skinning ausgeschaltet wird DrawPanel durchlaufen.

Woran könnte das liegen?
Wie ist zu ändern damit DrawPanel unabhängig vom Skinning durchlaufen wird?

Code:
unit U_DialogTest;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.ComCtrls, Vcl.ExtCtrls,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  Vcl.Styles, Vcl.Themes;

type

  TMyStatusBar = Class(TCustomStatusBar)

  protected
    procedure DrawPanel(Panel: TStatusPanel; const Rect: TRect); override;

  End;

  TFormSkin = class(TForm)
    TimerStatusProgress: TTimer;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure TimerStatusProgressTimer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FStatusBar: TMyStatusBar;
    FProgressBar: TProgressBar;
    FdefaultStyleName:String;
  public
    { Public declarations }

  end;

var
  FormSkin: TFormSkin;

implementation

{$R *.dfm}
{ TMyStatusBar }

procedure TMyStatusBar.DrawPanel(Panel: TStatusPanel; const Rect: TRect);
begin
  // Do some thing
  // Do some thing
  // Do some thing
  inherited;
end;

procedure TFormSkin.Button1Click(Sender: TObject);
begin
if Assigned(TStyleManager.ActiveStyle) and (TStyleManager.ActiveStyle.Name<>'Windows') then begin
   TStyleManager.TrySetStyle('Windows');
 end else begin
   TStyleManager.TrySetStyle(fdefaultStyleName);
 end;
end;

procedure TFormSkin.FormCreate(Sender: TObject);
var
  skinfile: string;

var
  ProgressBarStyle: LongInt;

begin

  // Skinning
  if Assigned(TStyleManager.ActiveStyle) then
    fdefaultStyleName := TStyleManager.ActiveStyle.Name;
//    TStyleManager.TrySetStyle('Windows');


  FStatusBar := TMyStatusBar.Create(self);
  FStatusBar.Parent := self;
  FStatusBar.Panels.Add;
  FStatusBar.Panels.Add;
  FStatusBar.Panels.Add;
  FStatusBar.Panels[0].Width := 160;
  FStatusBar.Panels[1].Width := 200;
  FStatusBar.Panels[1].Style := psOwnerDraw;
  FStatusBar.Panels[1].Bevel := pbNone;

  { create a run progress bar in the status bar }
  FProgressBar := TProgressBar.Create(FStatusBar);
  FProgressBar.Parent := FStatusBar;
  { set progress bar position and size - put in Panel[2] }
  FProgressBar.Left := FStatusBar.Panels.Items[0].Width + 4;
  FProgressBar.Top := 2;
  FProgressBar.Height := FStatusBar.Height - 2;
  FProgressBar.Width := FStatusBar.Panels.Items[1].Width - 6;
  { set range and initial state }
  FProgressBar.Min := 0;
  FProgressBar.Max := 100;
  FProgressBar.Step := 1;
  FProgressBar.Position := 0;
end;

procedure TFormSkin.FormDestroy(Sender: TObject);
begin
  FProgressBar.free;
end;

procedure TFormSkin.TimerStatusProgressTimer(Sender: TObject);
begin
  if FProgressBar.Position = FProgressBar.Max then
    FProgressBar.Position := 0;
  FProgressBar.Position := FProgressBar.Position + 1;
end;

end.
Sicher gibt es jemand der auch schon darüber gestolpert ist und mir einen Hint geben kann wie ich hier weiter komme. Daher bedanke ich mich schon mal.

Bestend Dank und Gruss
hewy
Heinrich Wyssen
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: StatusBar.DrawPanel geht nicht mit Skinning.

  Alt 31. Aug 2013, 01:29
Hallo,

ich weiß jetzt nicht warum Du ein TMyStatusBar einführst. Wenn das für Eure Anwendung einen besonderen Grund hat, dann hilft Dir nachfolgendes vielleicht nicht wirklich weiter.

Zitat:
Solange das Skinning aktiv ist wird DrawPanel nicht durchlaufen. Wird skinning ausgeschaltet wird DrawPanel durchlaufen.
Woran könnte das liegen?
Wenn Du Styles aktivierst, dann läuft das Zeichnen über TStatusBarStyleHook.Paint und dort wird nicht DrawPanel sondern OnDrawPanel (sofern zugewiesen) aufgerufen.

Vielleicht hilft Dir folgendes weiter (Button, Label, ProgressBar und StatusBar auf ein Form legen):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned (TStyleManager.ActiveStyle) then
    Exit;

  if LowerCase (TStyleManager.ActiveStyle.Name) <> 'windowsthen
    TStyleManager.TrySetStyle ('Windows')
  else
    TStyleManager.TrySetStyle (FDefaultStyleName);

  StatusBar1.OnDrawPanel := StatusBar1DrawPanel
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if Assigned (TStyleManager.ActiveStyle) then
    FDefaultStyleName := TStyleManager.ActiveStyle.Name;

  ProgressBar1.Parent := StatusBar1;
  ProgressBar1.Left := StatusBar1.Panels.Items[0].Width + 4;
  ProgressBar1.Top := 2;
  ProgressBar1.Height := StatusBar1.Height - 2;
  ProgressBar1.Width := StatusBar1.Panels.Items[1].Width - 6;
end;

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect);
begin
  if Assigned (TStyleManager.ActiveStyle) then
    Label1.Caption := TStyleManager.ActiveStyle.Name
  else
    Label1.Caption := 'Kein Style aktiv';

  StatusBar1.OnDrawPanel := nil
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if ProgressBar1.Position = ProgressBar1.Max then
    ProgressBar1.Position := 0;

  ProgressBar1.Position := ProgressBar1.Position + 1;
end;
Gruß
Volker Zeller
  Mit Zitat antworten Zitat
hewy

Registriert seit: 2. Aug 2006
Ort: Arni (Region Zürich) Schweiz
51 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: StatusBar.DrawPanel geht nicht mit Skinning.

  Alt 2. Sep 2013, 15:49
Hallo Volker

vielen Dank für deine Antwort.
In meinem geposteten Beispiel habe ich nur das eingefügt wo notwendig war um zu zeigen dass DrawPanel nicht aufgerufen wird wenn skinning eingeschaltet ist.
In wirklichkeit hab ich mehrere visuelle Komponenten welche eine Statusbar enthalten in der ich verschiedenen Komponenten anzeige z.B. Progressbar.
Es war mir nicht bekannt ob es sich beim DrawPanel Aufrufe um ein Problem handelt oder ob dies so designet ist.
Nun nachdem dies geklärt ist, bedeutet es dass ich wohl OnDrawPanel oder Resize verwenden muss wenn ich im Panel etwas refreshen will.
Heinrich Wyssen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf