2012-03-25 14 views
7

VclStyle बग है? टी^TI bugfix सूची को खोजने के लिए (http://edn.embarcadero.com/article/42090/) की कोशिश की, लेकिन मैंVclStyle बग है? TProgressBar.Style: = pbstMarQuee काम नहीं करता

  1. फ़ाइल> नया> VCL आवेदन
  2. TProgressBar मुख्य रूप नहीं डाल सकते हैं> TProgressBar .Style: = pbstMarQuee
  3. परियोजना विकल्प> उपस्थिति> सेट कस्टम शैली> सेट डिफ़ॉल्ट शैली
  4. Ctrl + F9

ProgressBar काम नहीं करता है

क्षमा करें। मेरी अंग्रेजी बुरा है :(

उत्तर

13

इस में TProgressBarStyleHook। Unfortunally विंडोज इंगित करने के लिए बार की स्थिति में परिवर्तन करता है, तो जब marquee mode में है, इसलिए आप को लागू करना चाहिए प्रगति बार नियंत्रण के लिए किसी भी संदेश नहीं भेजता लागू नहीं किया एक विशेषता है अपने आप PBS_MARQUEE शैली की नकल करने के लिए एक तंत्र, यह आसानी से एक नई शैली हुक बनाने और शैली हुक के अंदर एक TTimer का उपयोग किया जा सकता है।

चेक शैली हुक के इस बुनियादी कार्यान्वयन

uses 
    Vcl.Styles, 
    Vcl.Themes, 
    Winapi.CommCtrl; 

{$R *.dfm} 

type 
TProgressBarStyleHookMarquee=class(TProgressBarStyleHook) 
    private 
    Timer : TTimer; 
    FStep : Integer; 
    procedure TimerAction(Sender: TObject); 
    protected 
    procedure PaintBar(Canvas: TCanvas); override; 
    public 
    constructor Create(AControl: TWinControl); override; 
    destructor Destroy; override; 
end; 


constructor TProgressBarStyleHookMarquee.Create(AControl: TWinControl); 
begin 
    inherited; 
    FStep:=0; 
    Timer := TTimer.Create(nil); 
    Timer.Interval := 100;//TProgressBar(Control).MarqueeInterval; 
    Timer.OnTimer := TimerAction; 
    Timer.Enabled := TProgressBar(Control).Style=pbstMarquee; 
end; 

destructor TProgressBarStyleHookMarquee.Destroy; 
begin 
    Timer.Free; 
    inherited; 
end; 

procedure TProgressBarStyleHookMarquee.PaintBar(Canvas: TCanvas); 
var 
    FillR, R: TRect; 
    W, Pos: Integer; 
    Details: TThemedElementDetails; 
begin 
    if (TProgressBar(Control).Style=pbstMarquee) and StyleServices.Available then 
    begin   
    R := BarRect; 
    InflateRect(R, -1, -1); 
    if Orientation = pbHorizontal then 
     W := R.Width 
    else 
     W := R.Height; 

    Pos := Round(W * 0.1); 
    FillR := R; 
    if Orientation = pbHorizontal then 
    begin 
     FillR.Right := FillR.Left + Pos; 
     Details := StyleServices.GetElementDetails(tpChunk); 
    end 
    else 
    begin 
     FillR.Top := FillR.Bottom - Pos; 
     Details := StyleServices.GetElementDetails(tpChunkVert); 
    end; 

    FillR.SetLocation(FStep*FillR.Width, FillR.Top); 
    StyleServices.DrawElement(Canvas.Handle, Details, FillR); 
    Inc(FStep,1); 
    if FStep mod 10=0 then 
    FStep:=0; 
    end 
    else 
    inherited; 
end; 

procedure TProgressBarStyleHookMarquee.TimerAction(Sender: TObject); 
var 
    Canvas: TCanvas; 
begin 
    if StyleServices.Available and (TProgressBar(Control).Style=pbstMarquee) and Control.Visible then 
    begin 
    Canvas := TCanvas.Create; 
    try 
     Canvas.Handle := GetWindowDC(Control.Handle); 
     PaintFrame(Canvas); 
     PaintBar(Canvas); 
    finally 
     ReleaseDC(Handle, Canvas.Handle); 
     Canvas.Handle := 0; 
     Canvas.Free; 
    end; 
    end 
    else 
    Timer.Enabled := False; 
end; 

initialization 

TStyleManager.Engine.RegisterStyleHook(TProgressBar, TProgressBarStyleHookMarquee); 

end. 

आप इस स्टाई का डेमो देख सकते हैं ले हुक here

+0

आप टाइमर को कहां मुक्त कर रहे हैं? – Pateman

+0

@ पेटमैन ओह, कोड संपादित। अच्छी पकड़। :) – RRUZ

+0

+1, अब सभ्य दिखता है! – Pateman

संबंधित मुद्दे