216 lines
5.8 KiB
ObjectPascal
216 lines
5.8 KiB
ObjectPascal
unit TaskedProgressBar;
|
|
{$mode delphi}
|
|
{$codepage UTF8}
|
|
interface
|
|
uses LCLIntf, LCLType, LMessages, windows, Messages, Classes, ComCtrls, shlobj,
|
|
comobj, Controls, sysutils;
|
|
type TTaskProgressState = (tpsNoProgress, tpsIndeterminate, tpsNormal, tpsError, tpsPaused);
|
|
type
|
|
TTaskProgressBar = class(TComponent)
|
|
private
|
|
fTaskBarList : ITaskBarList3;
|
|
fProgressBar: TProgressBar;
|
|
fAlign: TAlign;
|
|
fBorderSpacing: TControlBorderSpacing;
|
|
fState: TTaskProgressState;
|
|
fWidth, fHeight, fLeft, fTop, fProgress, fProgressMax, fStepDef: Integer;
|
|
fBarShowText, fSmooth: Boolean;
|
|
fHandle: HWND;
|
|
procedure SetAlign (ANewAlign: TAlign);
|
|
procedure SetBarShowText (ANewValue: boolean);
|
|
procedure SetBorderSpacing (ANewSpacing: TControlBorderSpacing);
|
|
procedure SetHeight (ANewHeight: Integer);
|
|
procedure SetLeft (ANewLeft: Integer);
|
|
procedure SetProgress (ANewValue: Integer);
|
|
procedure SetProgressMax (ANewValue: Integer);
|
|
procedure SetSmooth (ANewSmooth: Boolean);
|
|
procedure SetState (ANewState: TTaskProgressState);
|
|
procedure SetStep (ANewStep: Integer);
|
|
procedure SetTop (ANewTop: Integer);
|
|
procedure SetWidth (ANewWidth: Integer);
|
|
public
|
|
constructor Create (AOwner: TComponent);
|
|
destructor Destroy;
|
|
procedure StepBy (const ADelta: Integer);
|
|
procedure StepIt;
|
|
property Align: TAlign read fAlign write SetAlign;
|
|
property BarShowText: Boolean read fBarShowText write SetBarShowText;
|
|
property BorderSpacing: TControlBorderSpacing read fBorderSpacing write SetBorderSpacing;
|
|
property Handle: HWND read fHandle write fHandle;
|
|
property Height: Integer read fHeight write SetHeight;
|
|
property Left: Integer read fLeft write SetLeft;
|
|
property Progress: Integer read fProgress write SetProgress;
|
|
property ProgressMax: Integer read fProgressMax write SetProgressMax;
|
|
property Smooth: Boolean read fSmooth write SetSmooth;
|
|
property State: TTaskProgressState read fState write SetState;
|
|
property Step: Integer read fStepDef write SetStep;
|
|
property Top: Integer read fTop write SetTop;
|
|
property Width: Integer read fWidth write SetWidth;
|
|
end;
|
|
procedure Register;
|
|
const IID_ITaskbarList3: TGUID = '{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}';
|
|
implementation
|
|
constructor TTaskProgressBar.Create (AOwner: TComponent);
|
|
var tbList: ITaskbarList;
|
|
hr: HRESULT;
|
|
begin
|
|
inherited Create (AOwner);
|
|
tbList:= CreateComObject(CLSID_TaskBarList) as ITaskBarList;
|
|
hr:= tbList.QueryInterface(IID_ITaskBarList3, fTaskBarList);
|
|
if hr <> S_OK then
|
|
begin
|
|
fTaskBarList:= nil;
|
|
tbList._Release;
|
|
raise Exception.Create('Error creation IID_ITaskBarList3 interface!');
|
|
end;
|
|
fHandle:= 0;
|
|
fState:= tpsNoProgress;
|
|
fProgressMax:= 100;
|
|
fProgress:= 0;
|
|
fWidth:= 100;
|
|
fHeight:= 20;
|
|
fLeft:= 10;
|
|
fTop:= 10;
|
|
fAlign:= alNone;
|
|
with fBorderSpacing do
|
|
begin
|
|
Around:= 0;
|
|
Bottom:= 0;
|
|
CellAlignHorizontal:= ccaFill;
|
|
CellAlignVertical:= ccaFill;
|
|
InnerBorder:= 0;
|
|
Left:= 0;
|
|
Right:= 0;
|
|
Top:= 0;
|
|
end;
|
|
fProgressBar:= TProgressBar.Create(AOwner);
|
|
with fProgressBar do
|
|
begin
|
|
Align:= fAlign;
|
|
Max:= fProgressMax;
|
|
Min:= 0;
|
|
Style:= pbstNormal;
|
|
Position:= 0;
|
|
Width:= fWidth;
|
|
Height:= fHeight;
|
|
Left:= fLeft;
|
|
Top:= fTop;
|
|
BorderSpacing:= fBorderSpacing;
|
|
BarShowText:= fBarShowText;
|
|
Smooth:= fSmooth;
|
|
Step:= fStepDef;
|
|
end;
|
|
end;
|
|
destructor TTaskProgressBar.Destroy;
|
|
begin
|
|
fTaskBarList:= nil;
|
|
fProgressBar.Free;
|
|
inherited Destroy;
|
|
end;
|
|
{Align}
|
|
procedure TTaskProgressBar.SetAlign (ANewAlign: TAlign);
|
|
begin
|
|
fAlign:= ANewAlign;
|
|
fProgressBar.Align:= fAlign;
|
|
end;
|
|
{BarShowText}
|
|
procedure TTaskProgressBar.SetBarShowText (ANewValue: boolean);
|
|
begin
|
|
fBarShowText:= ANewValue;
|
|
fProgressBar.BarShowText:= fBarShowText;
|
|
end;
|
|
{BorderSpacing}
|
|
procedure TTaskProgressBar.SetBorderSpacing (ANewSpacing: TControlBorderSpacing);
|
|
begin
|
|
fBorderSpacing:= ANewSpacing;
|
|
fProgressBar.BorderSpacing:= fBorderSpacing;
|
|
end;
|
|
{Height}
|
|
procedure TTaskProgressBar.SetHeight (ANewHeight: Integer);
|
|
begin
|
|
fHeight:= ANewHeight;
|
|
fProgressBar.Height:= fHeight;
|
|
end;
|
|
{Left}
|
|
procedure TTaskProgressBar.SetLeft (ANewLeft: Integer);
|
|
begin
|
|
fLeft:= ANewLeft;
|
|
fProgressBar.Left:= fLeft;
|
|
end;
|
|
{Progress}
|
|
procedure TTaskProgressBar.SetProgress(ANewValue: Integer);
|
|
begin
|
|
fProgress:= ANewValue;
|
|
if Assigned(fTaskBarList) then
|
|
fTaskBarList.SetProgressValue(fHandle, fProgress, fProgressMax);
|
|
fProgressBar.Position:= fProgress;
|
|
end;
|
|
{ProgressMax}
|
|
procedure TTaskProgressBar.SetProgressMax(ANewValue: Integer);
|
|
begin
|
|
fProgressMax:= ANewValue;
|
|
fProgressBar.Max:= fProgressMax;
|
|
end;
|
|
{Smooth}
|
|
procedure TTaskProgressBar.SetSmooth (ANewSmooth: Boolean);
|
|
begin
|
|
fSmooth:= ANewSmooth;
|
|
fProgressBar.Smooth:= fSmooth;
|
|
end;
|
|
{State}
|
|
procedure TTaskProgressBar.SetState(ANewState: TTaskProgressState);
|
|
function TTPStoTBPF (AValue: TTaskProgressState): TBPFLAG;
|
|
begin
|
|
Result:= TBPF_NOPROGRESS;
|
|
case AValue of
|
|
tpsNoProgress: Result:= TBPF_NOPROGRESS;
|
|
tpsIndeterminate: Result:= TBPF_INDETERMINATE;
|
|
tpsNormal: Result:= TBPF_NORMAL;
|
|
tpsError: Result:= TBPF_ERROR;
|
|
tpsPaused: Result:= TBPF_PAUSED;
|
|
end;
|
|
end;
|
|
begin
|
|
fState:= ANewState;
|
|
if Assigned(fTaskBarList) then
|
|
fTaskBarList.SetProgressState(fHandle, TTPStoTBPF(ANewState));
|
|
if ANewState = tpsIndeterminate then
|
|
fProgressBar.Style:= pbstMarquee
|
|
else
|
|
fProgressBar.Style:= pbstNormal;
|
|
end;
|
|
{Step}
|
|
procedure TTaskProgressBar.SetStep (ANewStep: Integer);
|
|
begin
|
|
fStepDef:= ANewStep;
|
|
fProgressBar.Step:= fStepDef;
|
|
end;
|
|
{Top}
|
|
procedure TTaskProgressBar.SetTop (ANewTop: Integer);
|
|
begin
|
|
fTop:= ANewTop;
|
|
fProgressBar.Top:= fTop;
|
|
end;
|
|
{Width}
|
|
procedure TTaskProgressBar.SetWidth (ANewWidth: Integer);
|
|
begin
|
|
fWidth:= ANewWidth;
|
|
fProgressBar.Width:= fWidth;
|
|
end;
|
|
{proc: StepBy}
|
|
procedure TTaskProgressBar.StepBy (const ADelta: Integer);
|
|
begin
|
|
fProgress:= fProgress + ADelta;
|
|
Progress:= fProgress;
|
|
end;
|
|
{proc: StepIt}
|
|
procedure TTaskProgressBar.StepIt;
|
|
begin
|
|
StepBy(fStepDef);
|
|
end;
|
|
procedure Register;
|
|
begin
|
|
RegisterComponents('ANB Soft Team', [TTaskProgressBar]);
|
|
end;
|
|
end.
|