1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531:
| unit ExProgressbar;
interface
uses SysUtils, Classes, Controls, Graphics, Messages, Forms;
type TSmallPoint = packed record x: SmallInt; y: SmallInt; end;
type TWMButtonEvent = packed record Msg: Cardinal; Keys: Longint; case Integer of 0: ( XPos: Smallint; YPos: Smallint); 1: ( Pos: TSmallPoint; Result: Longint); end;
type TTextposition = (tpNone,tpLeft,tpRight,tpCenter);
type TTexttype = (ttOwn, ttPercent, ttValue, ttValueAndMax);
type TOrientation = (poUpToDown, poDownToUp, poLeftToRight, poRightToLeft);
type TMouseEvent = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;
type TExProgressbar = class(TCustomControl) private cBackColor: TColor; cForeColor: TColor; cTextcolor: TColor; iValue: integer; iMaxVal: integer; Position: integer; FOnMouseDown: TMouseEvent; FOnMouseUp: TMouseEvent; b3D:Boolean; Textstate: TTextposition; sText: String; Seperator: Char; procedure SetForeColor(SColor: TColor); procedure SetBackColor(SColor: TColor); procedure SetHeight(hValue: integer); procedure SetWidth(wValue: integer); procedure SetTextcolor(SColor: TColor); procedure SetText(SText: String); procedure SetTextType(SType: TTexttype); procedure SetSeperator(SChar: Char); procedure Set3D(S3D: boolean); procedure SetOrientation(SOrientation: TOrientation); Function GetForeColor: TColor; Function GetBackColor: TColor; function GetHeight: integer; function GetTextcolor: TColor; function GetWidth: integer; function GetText: String; function GetTextType: TTexttype; function GetSeperator: Char; function Get3D: boolean; function GetOrientation: TOrientation; procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP; procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN; procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP; procedure WMMButtonDown(var Message: TWMMButtonDown); message WM_MBUTTONDOWN; procedure WMMButtonUp(var Message: TWMMButtonUp); message WM_MBUTTONUP; procedure SetValue(Percent: Integer); procedure SetMaxVal(SValue: Integer); procedure SetPosition(Pos: Integer); procedure SetVerticalPosition(Pos: Integer); protected procedure Paint; override; procedure DrawDownToUp; procedure DrawUpToDown; procedure DrawLeftToRight; procedure DrawRightToLeft; public constructor Create(AOwner: TComponent); override; published property Value: Integer read iValue write SetValue default 0; property MaxValue: Integer read iMaxVal write SetMaxVal default 100; property ForeColor: TColor read GetForeColor write SetForeColor default clRed; property BackColor: TColor read GetBackColor write SetBackColor default clBlack; property TextColor: TColor read GetTextColor write SetTextColor; property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown; property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp; property Ctrl3D: Boolean read Get3D write Set3D default true; property TextPosition: TTextposition read Textstate write Textstate default tpCenter; property TextType: TTexttype read GetTextType write SetTextType default ttPercent; property Text: String read GetText write SetText; property Textseperator: Char read GetSeperator write SetSeperator default '/'; property Height: Integer read GetHeight write SetHeight default 16; property Width: Integer read GetWidth write SetWidth default 150; property Orientation: TOrientation read GetOrientation write SetOrientation default poLeftToRight; property Hint; property OnClick; property ParentShowHint; property PopupMenu; property ShowHint; property Visible; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('ExComponents', [TExProgressbar); end;
constructor TExProgressbar.Create(AOwner: TComponent); begin inherited; Position:=0; DoubleBuffered:=True; end;
procedure TExProgressbar.Paint; begin inherited; case Orientation of poDownToUp: DrawDownToUp; poLeftToRight: DrawLeftToRight; poRightToLeft: DrawRightToLeft; poUpToDown: DrawUpToDown; end; end;
procedure TExProgressbar.SetForeColor(SColor: TColor); begin cForeColor:=SColor; Paint; end;
procedure TExProgressbar.SetBackColor(SColor: TColor); begin cBackColor:=SColor; Paint; end;
function TExProgressbar.GetForeColor: TColor; begin result:=cForeColor; end;
function TExProgressbar.GetBackColor: TColor; begin result:=cBackColor; end;
procedure TExProgressbar.WMLButtonDown(var Message: TWMLButtonDown); begin inherited; if Assigned(FOnMouseDown) then with Message do FOnMouseDown(Self, mbLeft, KeysToShiftState(Keys), XPos, YPos); end;
procedure TExProgressbar.WMLButtonUp(var Message: TWMLButtonUp); begin
inherited; if Assigned(FOnMouseUp) then with Message do FOnMouseUp(Self, mbLeft, KeysToShiftState(Keys), XPos, YPos); end;
procedure TExProgressbar.WMRButtonDown(var Message: TWMRButtonDown); begin inherited; if Assigned(FOnMouseDown) then with Message do FOnMouseDown(Self, mbRight, KeysToShiftState(Keys), XPos, YPos); end;
procedure TExProgressbar.WMRButtonUp(var Message: TWMRButtonUp); begin inherited; if Assigned(FOnMouseUp) then with Message do FOnMouseUp(Self, mbRight, KeysToShiftState(Keys), XPos, YPos); end;
procedure TExProgressbar.WMMButtonDown(var Message: TWMMButtonDown); begin inherited; if Assigned(FOnMouseDown) then with Message do FOnMouseDown(Self, mbMiddle, KeysToShiftState(Keys), XPos, YPos); end;
procedure TExProgressbar.WMMButtonUp(var Message: TWMMButtonUp); begin inherited; if Assigned(FOnMouseUp) then with Message do FOnMouseUp(Self, mbMiddle, KeysToShiftState(Keys), XPos, YPos); end;
procedure TExProgressbar.SetValue(Percent: Integer); begin case Orientation of poLeftToRight: begin if Percent<=iMaxVal then begin SetPosition(Percent); iValue:=Percent; Paint; end; end; poRightToLeft: begin if Percent<=iMaxVal then begin SetPosition(Percent); iValue:=Percent; Paint; end; end; poDownToUp: begin if Percent<=iMaxVal then begin SetVerticalPosition(Percent); iValue:=Percent; Paint; end; end; poUpToDown: begin if Percent<=iMaxVal then begin SetVerticalPosition(Percent); iValue:=Percent; Paint; end; end; end; end; procedure TExProgressbar.SetMaxVal(SValue: Integer); begin if SValue=0 then iMaxVal:=1 else iMaxVal:=SValue; if iMaxVal<iValue then iValue:=iMaxVal; SetValue(iValue); end;
procedure TExProgressbar.SetPosition(Pos: Integer); begin Position := Round(((Width - 4) / iMaxVal) * Pos + 2); end;
function TExProgressbar.GetHeight: integer; begin inherited; result:=Height; end;
function TExProgressbar.GetWidth: integer; begin inherited; result:=Width; end;
procedure TExProgressbar.SetHeight(hValue: integer); begin inherited; Paint; end;
procedure TExProgressbar.SetWidth(wValue: integer); begin inherited; Paint; end;
procedure TExProgressbar.SetTextcolor(SColor: TColor); begin cTextcolor:=SColor; Paint; end;
function TExProgressbar.GetTextcolor: TColor; begin result:=cTextcolor; end;
procedure TExProgressbar.SetText(SText: String); begin sText:=SText; end;
function TExProgressbar.GetText: String; begin result:=sText; end;
procedure TExProgressbar.SetTextType(SType: TTexttype); var percent: integer; begin Texttype:=SType; Case TextType of ttPercent: begin percent:= round((iMaxVal/100)/Value); sText:=inttostr(percent)+'%'; end; ttValue: Text:= inttostr(Value); ttValueAndMax: Text:= inttostr(Value)+Seperator+inttostr(iMaxVal); end; Paint; end;
function TExProgressbar.GetTextType: TTexttype; begin result:=TextType; end;
function TExProgressbar.GetSeperator: Char; begin result:=Seperator; end;
procedure TExProgressbar.SetSeperator(SChar: Char); begin Seperator:=SChar; SetTextType(TextType); end;
procedure TExProgressbar.Set3D(S3D: boolean); begin b3D:=S3D; paint; end;
function TExProgressbar.Get3D: boolean; begin result:=b3D; end;
function TExProgressbar.GetOrientation: TOrientation; begin result:=Orientation; end;
procedure TExProgressbar.SetOrientation(SOrientation: TOrientation); begin Orientation:=SOrientation; Paint; end;
procedure TExProgressbar.DrawLeftToRight; begin if b3D=false then begin Canvas.Brush.Style := bsSolid; Canvas.Pen.Style := psSolid; Canvas.Brush.Color := cBackColor; Canvas.Pen.Color := cBackColor; Canvas.Rectangle(0, 0, Width, Height); Canvas.Brush.Color := cForeColor; Canvas.Pen.Color := cForeColor; Canvas.Rectangle(2, 2, Position, Height - 2); Canvas.Font.Color:=TextColor; case Textposition of tpRight: Canvas.TextOut(Round(Width-2-(Canvas.TextWidth(IntToStr(Value)))),2,Text); tpleft: Canvas.TextOut(2,2,Inttostr(Value)); tpCenter: Canvas.TextOut(Round(Width/2-(Canvas.TextWidth(IntToStr(Value)))),2,Text); tpnone: ; end; end else begin Canvas.Brush.Style:=bsSolid; Canvas.Pen.Style:= psSolid; Canvas.Brush.Color:=clwhite; Canvas.Rectangle(0,0,Width,-Height); Canvas.Brush.Color:=clGray; Canvas.Rectangle(0,0,Width-1,1-Height); Canvas.Brush.Color:=cBackColor; Canvas.Rectangle(1,1,width-1,1-height); Canvas.Brush.Color:=cForeColor; Canvas.Rectangle(2, 2, Position-1, Height - 3); Canvas.Font.Color:=TextColor; case Textposition of tpRight: Canvas.TextOut(Round(Width-2-(Canvas.TextWidth(IntToStr(Value)))),2,Inttostr(Value)); tpleft: Canvas.TextOut(2,2,Inttostr(Value)); tpCenter: Canvas.TextOut(Round(Width/2-(Canvas.TextWidth(IntToStr(Value)))),2,Inttostr(Value)); tpnone: ; end; end; end;
procedure TExProgressbar.DrawRightToLeft; begin if b3D=false then begin Canvas.Brush.Style := bsSolid; Canvas.Pen.Style := psSolid; Canvas.Brush.Color := cBackColor; Canvas.Pen.Color := cBackColor; Canvas.Rectangle(0, 0, Width, Height); Canvas.Brush.Color := cForeColor; Canvas.Pen.Color := cForeColor; Canvas.Rectangle(Position, 2, 2, Height - 2); Canvas.Font.Color:=TextColor; case Textposition of tpRight: Canvas.TextOut(Round(Width-2-(Canvas.TextWidth(IntToStr(Value)))),2,Text); tpleft: Canvas.TextOut(2,2,Inttostr(Value)); tpCenter: Canvas.TextOut(Round(Width/2-(Canvas.TextWidth(IntToStr(Value)))),2,Text); tpnone: ; end; end else begin Canvas.Brush.Style:=bsSolid; Canvas.Pen.Style:= psSolid; Canvas.Brush.Color:=clwhite; Canvas.Rectangle(0,0,Width,-Height); Canvas.Brush.Color:=clGray; Canvas.Rectangle(0,0,Width-1,1-Height); Canvas.Brush.Color:=cBackColor; Canvas.Rectangle(1,1,width-1,1-height); Canvas.Brush.Color:=cForeColor; Canvas.Rectangle(Position-1, 2, 2, Height - 3); Canvas.Font.Color:=TextColor; case Textposition of tpRight: Canvas.TextOut(Round(Width-2-(Canvas.TextWidth(IntToStr(Value)))),2,Inttostr(Value)); tpleft: Canvas.TextOut(2,2,Inttostr(Value)); tpCenter: Canvas.TextOut(Round(Width/2-(Canvas.TextWidth(IntToStr(Value)))),2,Inttostr(Value)); tpnone: ; end; end; end;
procedure TExProgressbar.DrawDownToUp; begin if b3D=false then begin Canvas.Brush.Style := bsSolid; Canvas.Pen.Style := psSolid; Canvas.Brush.Color := cBackColor; Canvas.Pen.Color := cBackColor; Canvas.Rectangle(0, 0, Width, Height); Canvas.Brush.Color := cForeColor; Canvas.Pen.Color := cForeColor; Canvas.Rectangle(2, 2, Width-2, Position); Canvas.Font.Color:=TextColor; case Textposition of tpRight: Canvas.TextOut(Round(Width-2-(Canvas.TextWidth(IntToStr(Value)))),2,Text); tpleft: Canvas.TextOut(2,2,Inttostr(Value)); tpCenter: Canvas.TextOut(Round(Width/2-(Canvas.TextWidth(IntToStr(Value)))),2,Text); tpnone: ; end; end else begin Canvas.Brush.Style:=bsSolid; Canvas.Pen.Style:= psSolid; Canvas.Brush.Color:=clwhite; Canvas.Rectangle(0,0,Width,-Height); Canvas.Brush.Color:=clGray; Canvas.Rectangle(0,0,Width-1,1-Height); Canvas.Brush.Color:=cBackColor; Canvas.Rectangle(1,1,width-1,1-height); Canvas.Brush.Color:=cForeColor; Canvas.Rectangle(2, Position, width-2, 2); Canvas.Font.Color:=TextColor; case Textposition of tpRight: Canvas.TextOut(Round(Width-2-(Canvas.TextWidth(IntToStr(Value)))),2,Inttostr(Value)); tpleft: Canvas.TextOut(2,2,Inttostr(Value)); tpCenter: Canvas.TextOut(Round(Width/2-(Canvas.TextWidth(IntToStr(Value)))),2,Inttostr(Value)); tpnone: ; end; end; end;
procedure TExProgressbar.DrawUpToDown; begin if b3D=false then begin Canvas.Brush.Style := bsSolid; Canvas.Pen.Style := psSolid; Canvas.Brush.Color := cBackColor; Canvas.Pen.Color := cBackColor; Canvas.Rectangle(0, 0, Width, Height); Canvas.Brush.Color := cForeColor; Canvas.Pen.Color := cForeColor; Canvas.Rectangle(2, 2, Position, Height - 2); Canvas.Font.Color:=TextColor; case Textposition of tpRight: Canvas.TextOut(Round(Width-2-(Canvas.TextWidth(IntToStr(Value)))),2,Text); tpleft: Canvas.TextOut(2,2,Inttostr(Value)); tpCenter: Canvas.TextOut(Round(Width/2-(Canvas.TextWidth(IntToStr(Value)))),2,Text); tpnone: ; end; end else begin Canvas.Brush.Style:=bsSolid; Canvas.Pen.Style:= psSolid; Canvas.Brush.Color:=clwhite; Canvas.Rectangle(0,0,Width,-Height); Canvas.Brush.Color:=clGray; Canvas.Rectangle(0,0,Width-1,1-Height); Canvas.Brush.Color:=cBackColor; Canvas.Rectangle(1,1,width-1,1-height); Canvas.Brush.Color:=cForeColor; Canvas.Rectangle(2, 2, Position-1, Height - 3); Canvas.Font.Color:=TextColor; case Textposition of tpRight: Canvas.TextOut(Round(Width-2-(Canvas.TextWidth(IntToStr(Value)))),2,Inttostr(Value)); tpleft: Canvas.TextOut(2,2,Inttostr(Value)); tpCenter: Canvas.TextOut(Round(Width/2-(Canvas.TextWidth(IntToStr(Value)))),2,Inttostr(Value)); tpnone: ; end; end; end;
procedure TExProgressbar.SetVerticalPosition(Pos: Integer); begin Position := Round(((height - 4) / iMaxVal) * Pos + 2); end;
end. |