bcmaterialprogressbarmarquee.pas 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. unit BCMaterialProgressBarMarquee;
  2. {$mode delphi}
  3. interface
  4. uses
  5. Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, BGRAGraphicControl,
  6. ExtCtrls, BGRABitmap, BGRABitmapTypes;
  7. type
  8. { TBCMaterialProgressBarMarquee }
  9. TBCMaterialProgressBarMarquee = class(TBGRAGraphicControl)
  10. private
  11. FBarColor: TColor;
  12. progressbasr_cx, progressbar_cw: integer;
  13. progressbar_x, progressbar_w: integer;
  14. progressbar_increase: boolean;
  15. FTimer: TTimer;
  16. procedure SetBarColor(AValue: TColor);
  17. procedure TimerOnTimer(Sender: TObject);
  18. protected
  19. procedure SetEnabled(Value: Boolean); override;
  20. procedure SetVisible(Value: Boolean); override;
  21. public
  22. procedure DiscardBitmap;
  23. procedure RedrawBitmapContent; override;
  24. constructor Create(AOwner: TComponent); override;
  25. published
  26. property BarColor: TColor read FBarColor write SetBarColor;
  27. property Visible;
  28. end;
  29. procedure Register;
  30. implementation
  31. procedure Register;
  32. begin
  33. RegisterComponents('BGRA Controls', [TBCMaterialProgressBarMarquee]);
  34. end;
  35. { TBCMaterialProgressBarMarquee }
  36. procedure TBCMaterialProgressBarMarquee.TimerOnTimer(Sender: TObject);
  37. begin
  38. if progressbar_increase then
  39. begin
  40. progressbar_w := progressbar_w + progressbar_cw;
  41. if (progressbar_w >= Width - 5) then
  42. begin
  43. progressbar_increase := False;
  44. end;
  45. end
  46. else
  47. begin
  48. progressbar_w := progressbar_w - progressbar_cw;
  49. if (progressbar_w <= progressbar_cw) then
  50. begin
  51. progressbar_increase := True;
  52. end;
  53. end;
  54. progressbar_x := progressbar_x + progressbasr_cx;
  55. if (progressbar_x >= Width) then
  56. progressbar_x := -progressbar_w;
  57. DiscardBitmap;
  58. end;
  59. procedure TBCMaterialProgressBarMarquee.SetEnabled(Value: Boolean);
  60. begin
  61. inherited SetEnabled(Value);
  62. FTimer.Enabled := Value and Visible;
  63. DiscardBitmap;
  64. end;
  65. procedure TBCMaterialProgressBarMarquee.SetVisible(Value: Boolean);
  66. begin
  67. inherited SetVisible(Value);
  68. FTimer.Enabled := Enabled and Value;
  69. DiscardBitmap;
  70. end;
  71. procedure TBCMaterialProgressBarMarquee.SetBarColor(AValue: TColor);
  72. begin
  73. if FBarColor = AValue then
  74. Exit;
  75. FBarColor := AValue;
  76. DiscardBitmap;
  77. end;
  78. procedure TBCMaterialProgressBarMarquee.DiscardBitmap;
  79. begin
  80. inherited DiscardBitmap;
  81. progressbar_cw := Width div 50;
  82. progressbasr_cx := progressbar_cw * 2;
  83. end;
  84. procedure TBCMaterialProgressBarMarquee.RedrawBitmapContent;
  85. begin
  86. if FTimer.Enabled then
  87. begin
  88. Bitmap.Fill(Color);
  89. Bitmap.Rectangle(Rect(progressbar_x, 0, progressbar_x + progressbar_w, Bitmap.Height),
  90. BarColor, BarColor);
  91. end
  92. else
  93. begin
  94. Bitmap.Fill(BarColor);
  95. end;
  96. end;
  97. constructor TBCMaterialProgressBarMarquee.Create(AOwner: TComponent);
  98. begin
  99. inherited Create(AOwner);
  100. progressbar_w := Width;
  101. progressbar_x := -progressbar_w;
  102. progressbar_increase := False;
  103. FTimer := TTimer.Create(Self);
  104. FTimer.Interval := 15;
  105. FTimer.OnTimer := TimerOnTimer;
  106. FTimer.Enabled := True;
  107. Color := clWhite;
  108. BarColor := $00E2A366;
  109. end;
  110. end.