home *** CD-ROM | disk | FTP | other *** search
/ PC Open 19 / pcopen19.iso / Win31 / Calmira / SOURCE.ZIP / VCL / BARGAUGE.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-02-20  |  8.9 KB  |  352 lines

  1. {*********************************************************}
  2. {                                                         }
  3. {    Calmira Visual Component Library 2.1                 }
  4. {    by Li-Hsin Huang,                                    }
  5. {    released into the public domain January 1998         }
  6. {                                                         }
  7. {*********************************************************}
  8.  
  9. unit BarGauge;
  10.  
  11. { TBarGauge }
  12.  
  13. { TBarGauge is a simplified version of Borland's sample TGauge, but is around
  14.   10 times faster at drawing, because it doesn't bother to draw the
  15.   clever "inverse" text effect.  Use it for speed critical stuff.
  16.  
  17.   Note: Calmira 2.1 uses the newer TWin95Bar instead of TBarGauge.
  18. }
  19.  
  20. interface
  21.  
  22. uses
  23.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  24.   Forms, Dialogs, StdCtrls;
  25.  
  26. type
  27.   TBarKind = (bkHorizontal, bkVertical);
  28.  
  29.   TAbstractBar = class(TGraphicControl)
  30.   private
  31.     FKind : TBarKind;
  32.     FForeColor: TColor;
  33.     FBackColor: TColor;
  34.     procedure SetMinValue(Value: Longint);
  35.     procedure SetMaxValue(Value: Longint);
  36.     procedure SetKind(Value: TBarKind);
  37.     procedure SetForeColor(Value: TColor);
  38.     procedure SetBackColor(Value: TColor);
  39.   protected
  40.     FMinValue: Longint;
  41.     FMaxValue: Longint;
  42.     FCurValue: Longint;
  43.     procedure SetProgress(Value: Longint); virtual;
  44.   public
  45.     constructor Create(AOwner: TComponent); override;
  46.     procedure AddProgress(Value: Longint);
  47.     function GetPercentDone: Integer;
  48.   published
  49.     property PercentDone: Integer read GetPercentDone;
  50.     property Kind : TBarKind read FKind write SetKind default bkHorizontal;
  51.     property MinValue: Longint read FMinValue write SetMinValue default 0;
  52.     property MaxValue: Longint read FMaxValue write SetMaxValue default 100;
  53.     property ForeColor: TColor read FForeColor write SetForeColor default clBlack;
  54.     property BackColor: TColor read FBackColor write SetBackColor default clWhite;
  55.     property Align;
  56.     property Progress: Longint read FCurValue write SetProgress;
  57.     property ParentShowHint;
  58.     property ShowHint;
  59.     property Enabled;
  60.     property Visible;
  61.   end;
  62.  
  63.   TBarGauge = class(TAbstractBar)
  64.   private
  65.     { Private declarations }
  66.     FShowText: Boolean;
  67.     FBorderStyle: TBorderStyle;
  68.     FCtl3D : Boolean;
  69.     procedure SetShowText(Value: Boolean);
  70.     procedure SetBorderStyle(Value: TBorderStyle);
  71.     procedure SetCtl3D(Value: Boolean);
  72.   protected
  73.     { Protected declarations }
  74.     procedure Paint; override;
  75.   public
  76.     { Public declarations }
  77.     constructor Create(AOwner: TComponent); override;
  78.   published
  79.     { Published declarations }
  80.     property Ctl3D : Boolean read FCtl3D write SetCtl3D default True;
  81.     property ShowText: Boolean read FShowText write SetShowText default True;
  82.     property Font;
  83.     property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;
  84.     property ParentFont;
  85.   end;
  86.  
  87.   TWin95Gauge = class(TAbstractBar)
  88.   protected
  89.     procedure Paint; override;
  90.     procedure SetProgress(Value: Longint); override;
  91.     function GetSegments : Integer;
  92.   public
  93.     procedure Setbounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  94.   end;
  95.  
  96. procedure Register;
  97.  
  98. implementation
  99.  
  100. uses ExtCtrls;
  101.  
  102.  
  103. { TAbstractBar}
  104.  
  105. constructor TAbstractBar.Create(AOwner: TComponent);
  106. begin
  107.   inherited Create(AOwner);
  108.   ControlStyle := ControlStyle + [csOpaque];
  109.   FMinValue := 0;
  110.   FMaxValue := 100;
  111.   FCurValue := 0;
  112.   FForeColor := clNavy;
  113.   FBackColor := clSilver;
  114.   Width := 100;
  115.   Height := 100;
  116. end;
  117.  
  118.  
  119. function TAbstractBar.GetPercentDone: Integer;
  120. begin
  121.   if (FMaxValue = FMinValue) or (FCurValue = FMinValue) then Result := 0
  122.   else Result := Trunc((FCurValue - FMinValue) / (FMaxValue - FMinValue) * 100);
  123. end;
  124.  
  125.  
  126.  
  127. procedure TAbstractBar.SetMinValue(Value: Longint);
  128. begin
  129.   if Value <> FMinValue then begin
  130.     FMinValue := Value;
  131.     Repaint;
  132.   end;
  133. end;
  134.  
  135. procedure TAbstractBar.SetMaxValue(Value: Longint);
  136. begin
  137.   if Value <> FMaxValue then begin
  138.     FMaxValue := Value;
  139.     Repaint;
  140.   end;
  141. end;
  142.  
  143.  
  144. procedure TAbstractBar.SetProgress(Value: Longint);
  145. var PrevPercent : Integer;
  146. begin
  147.   if (FCurValue <> Value) and (Value >= FMinValue) and (Value <= FMaxValue) then begin
  148.     PrevPercent := GetPercentDone;
  149.     FCurValue := Value;
  150.     if GetPercentDone <> PrevPercent then Repaint;
  151.   end;
  152. end;
  153.  
  154.  
  155. procedure TAbstractBar.SetKind(Value: TBarKind);
  156. begin
  157.   if Value <> FKind then begin
  158.     FKind := Value;
  159.     Repaint;
  160.   end;
  161. end;
  162.  
  163. procedure TAbstractBar.AddProgress(Value: Longint);
  164. begin
  165.   Progress := FCurValue + Value;
  166. end;
  167.  
  168.  
  169. procedure TAbstractBar.SetForeColor(Value: TColor);
  170. begin
  171.   if Value <> FForeColor then begin
  172.     FForeColor := Value;
  173.     Repaint;
  174.   end;
  175. end;
  176.  
  177. procedure TAbstractBar.SetBackColor(Value: TColor);
  178. begin
  179.   if Value <> FBackColor then begin
  180.     FBackColor := Value;
  181.     Repaint;
  182.   end;
  183. end;
  184.  
  185.  
  186. { TBarGauge }
  187.  
  188. constructor TBarGauge.Create(AOwner: TComponent);
  189. begin
  190.   inherited Create(AOwner);
  191.   ControlStyle := ControlStyle + [csFramed];
  192.   { default values }
  193.   FShowText := True;
  194.   FBorderStyle := bsSingle;
  195.   FForeColor := clBlack;
  196.   FBackColor := clWhite;
  197.   FCtl3D := True;
  198. end;
  199.  
  200.  
  201. procedure TBarGauge.SetShowText(Value: Boolean);
  202. begin
  203.   if Value <> FShowText then begin
  204.     FShowText := Value;
  205.     Repaint;
  206.   end;
  207. end;
  208.  
  209. procedure TBarGauge.SetBorderStyle(Value: TBorderStyle);
  210. begin
  211.   if Value <> FBorderStyle then begin
  212.     FBorderStyle := Value;
  213.     Repaint;
  214.   end;
  215. end;
  216.  
  217.  
  218. procedure TBarGauge.SetCtl3D(Value: Boolean);
  219. begin
  220.   if Value <> FCtl3D then begin
  221.     FCtl3D := Value;
  222.     Repaint;
  223.   end;
  224. end;
  225.  
  226.  
  227.  
  228. procedure TBarGauge.Paint;
  229. var
  230.   r: TRect;
  231.   x, y: Integer;
  232.   s: string[4];
  233. begin
  234.   r := ClientRect;
  235.  
  236.   with Canvas do begin
  237.  
  238.     if BorderStyle = bsSingle then begin
  239.       if Ctl3D then Frame3D(Canvas, r, clBtnShadow, clBtnHighlight, 1);
  240.       Frame3D(Canvas, r, clBlack, clBlack, 1);
  241.     end;
  242.  
  243.     if Kind = bkHorizontal then begin
  244.       x := MulDiv(r.Right - r.Left, PercentDone, 100);
  245.       Brush.Color := ForeColor;
  246.       FillRect(Rect(r.Left, r.Top, r.Left + x, r.Bottom));
  247.       Brush.Color := BackColor;
  248.       FillRect(Rect(r.Left + x, r.Top, r.Right, r.Bottom));
  249.     end
  250.     else begin
  251.       y := MulDiv(r.Bottom - r.Top, PercentDone, 100);
  252.       Brush.Color := ForeColor;
  253.       FillRect(Rect(r.Left, r.Bottom - y, r.Right, r.Bottom));
  254.       Brush.Color := BackColor;
  255.       FillRect(Rect(r.Left, r.Top, r.Right, r.Bottom - y));
  256.     end;
  257.  
  258.     if ShowText then begin
  259.       s := Format('%d%%', [PercentDone]);
  260.       Brush.Style := bsClear;
  261.       Font.Assign(Self.Font);
  262.       with r do begin
  263.         x := (Width + 1 - TextWidth(s)) div 2;
  264.         y := (Height + 1 - TextHeight(s)) div 2;
  265.       end;
  266.       TextRect(r, x, y, S);
  267.     end;
  268.   end;
  269. end;
  270.  
  271. { TWin95Gauge}
  272.  
  273. procedure TWin95Gauge.Paint;
  274. var
  275.   r: TRect;
  276.   i: Integer;
  277. begin
  278.   r := ClientRect;
  279.   Frame3D(Canvas, r, clBtnShadow, clBtnHighlight, 1);
  280.  
  281.   { Set r to the boundaries of the first segment }
  282.   InflateRect(r, -1, -1);
  283.   if Kind = bkHorizontal then r.Right := R.Left + 8
  284.   else r.Bottom := r.Top + 8;
  285.  
  286.   with Canvas do begin
  287.     Brush.Color := ForeColor;
  288.  
  289.     if Kind = bkHorizontal then
  290.       for i := 1 to GetSegments do begin
  291.         FillRect(r);
  292.         OffsetRect(r, 10, 0);
  293.       end
  294.     else
  295.       for i := 0 to GetSegments do begin
  296.         FillRect(r);
  297.         OffsetRect(r, 0, 10);
  298.       end;
  299.  
  300.     { It is assumed that the background is the same colour as the
  301.       component's parent, usually clBtnFace, otherwise this painting
  302.       method doesn't work properly.  To prevent flickering, only
  303.       the portion of the gauge without segments is filled with the
  304.       background colour -- the gaps in between segments are not
  305.       painted at all.
  306.  
  307.       This code can be fixed by drawing on a temporary bitmap. }
  308.  
  309.     r.Right := Width - 3;
  310.     Brush.Color := BackColor;
  311.     FillRect(r);
  312.   end;
  313. end;
  314.  
  315. function TWin95Gauge.GetSegments: Integer;
  316. begin
  317.   Result := Trunc(Round((GetPercentDone / 100) * ((Width - 3) div 10)));
  318. end;
  319.  
  320.  
  321. procedure TWin95Gauge.SetProgress(Value: Longint);
  322. var PrevSegments : Integer;
  323. begin
  324.   if (FCurValue <> Value) and (Value >= FMinValue) and (Value <= FMaxValue) then begin
  325.     PrevSegments := GetSegments;
  326.     FCurValue := Value;
  327.     if GetSegments <> PrevSegments then Repaint;
  328.   end;
  329. end;
  330.  
  331.  
  332. procedure TWin95Gauge.Setbounds(ALeft, ATop, AWidth, AHeight: Integer);
  333.  
  334. procedure CheckDimension(var X: Integer);
  335. begin
  336.   if (X - 3) mod 10 <> 0 then X := (((X - 3) div 10) * 10) + 3;
  337. end;
  338.  
  339. begin
  340.   if Kind = bkHorizontal then CheckDimension(AWidth)
  341.   else CheckDimension(AHeight);
  342.   inherited SetBounds(ALeft, ATop, AWidth, AHeight);
  343. end;
  344.  
  345.  
  346. procedure Register;
  347. begin
  348.   RegisterComponents('Samples', [TBarGauge, TWin95Gauge]);
  349. end;
  350.  
  351. end.
  352.