![]() |
StatusBar.DrawPanel geht nicht mit Skinning.
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:
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.
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. Bestend Dank und Gruss hewy |
AW: StatusBar.DrawPanel geht nicht mit Skinning.
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:
Vielleicht hilft Dir folgendes weiter (Button, Label, ProgressBar und StatusBar auf ein Form legen):
Delphi-Quellcode:
Gruß
procedure TForm1.Button1Click(Sender: TObject);
begin if not Assigned (TStyleManager.ActiveStyle) then Exit; if LowerCase (TStyleManager.ActiveStyle.Name) <> 'windows' then 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; |
AW: StatusBar.DrawPanel geht nicht mit Skinning.
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 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 by Thomas Breitkreuz