Ошибка VclStyle? TProgressBar.Style := pbstMarQuee Не работает

Ошибка VclStyle? T^T Я пытался найти список исправлений ошибок (http://edn.embarcadero.com/article/42090/), но не могу

  1. Файл > Создать > Приложение VCL
  2. TProgressBar ставит основную форму >TProgressBar.Style := pbstMarQuee
  3. Параметр проекта> Внешний вид> установить пользовательский стиль> установить стиль по умолчанию
  4. Ctrl + F9

Прогрессбар не работает

Прости. У меня плохой английский :(


person JH Jang    schedule 25.03.2012    source источник


Ответы (1)


Эта функция не реализована в TProgressBarStyleHook. К сожалению, Windows не отправляет никакого сообщения элементу управления индикатором выполнения, чтобы указать, изменяется ли положение индикатора, когда он находится в выделительный режим, поэтому вы должны сами реализовать механизм для имитации стиля PBS_MARQUEE, это можно легко сделать, создав новый хук стиля и используя TTimer внутри хука стиля.

Проверьте эту базовую реализацию хука Style

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.

Вы можете посмотреть демонстрацию этого хука стиля здесь

person RRUZ    schedule 25.03.2012
comment
Где вы освобождаете таймер? - person Pateman; 25.03.2012