Componentes.Terceros.jvcl/official/3.32/run/JvProgressUtils.pas

258 lines
6.8 KiB
ObjectPascal

{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvPrgrss.PAS, released on 2002-07-04.
The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 2001,2002 SGB Software
All Rights Reserved.
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvProgressUtils.pas 10612 2006-05-19 19:04:09Z jfudickar $
unit JvProgressUtils;
{$I jvcl.inc}
interface
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
Controls, ComCtrls, SysUtils, Classes;
{$IFDEF VisualCLX}
type
TControlClass = class of TControl;
{$ENDIF VisualCLX}
procedure RegisterProgressControl(AClass: TControlClass;
const MaxPropName, MinPropName, ProgressPropName: string);
procedure UnRegisterProgressControl(AClass: TControlClass);
function SupportsProgressControl(Control: TControl): Boolean;
procedure SetProgressMax(Control: TControl; MaxValue: Longint);
procedure SetProgressMin(Control: TControl; MinValue: Longint);
procedure SetProgressValue(Control: TControl; ProgressValue: Longint);
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/run/JvProgressUtils.pas $';
Revision: '$Revision: 10612 $';
Date: '$Date: 2006-05-19 21:04:09 +0200 (ven., 19 mai 2006) $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
implementation
uses
TypInfo;
type
TProgressProp = (ppMax, ppMin, ppProgress);
{$IFNDEF CLR}
PProgressData = ^TProgressData;
{$ENDIF !CLR}
TProgressData = record
ControlClass: TControlClass;
MaxProperty: string[63];
MinProperty: string[63];
ProgressProperty: string[63];
end;
{$IFDEF CLR}
PProgressData = TProgressData;
{$ENDIF CLR}
TJvProgressList = class(TList)
public
constructor Create;
{$IFNDEF CLR}
destructor Destroy; override;
{$ENDIF !CLR}
procedure Add(AClass: TControlClass;
const MaxPropName, MinPropName, ProgressPropName: string);
function FindClass(AClass: TControlClass): Integer;
procedure Remove(AClass: TControlClass);
function SetControlProperty(Control: TControl; Prop: TProgressProp;
Value: Longint): Boolean;
end;
constructor TJvProgressList.Create;
begin
inherited Create;
Add(TProgressBar, 'Max', 'Min', 'Position');
end;
{$IFNDEF CLR}
destructor TJvProgressList.Destroy;
var
I: Integer;
begin
for I := 0 to Count - 1 do
Dispose(PProgressData(Items[I]));
inherited Destroy;
end;
{$ENDIF !CLR}
procedure TJvProgressList.Add(AClass: TControlClass;
const MaxPropName, MinPropName, ProgressPropName: string);
var
NewRec: PProgressData;
begin
{$IFDEF CLR}
with NewRec do
{$ELSE}
New(NewRec);
with NewRec^ do
{$ENDIF CLR}
begin
ControlClass := AClass;
MaxProperty := MaxPropName;
MinProperty := MinPropName;
ProgressProperty := ProgressPropName;
end;
inherited Add(NewRec);
end;
function TJvProgressList.FindClass(AClass: TControlClass): Integer;
var
P: PProgressData;
begin
for Result := Count - 1 downto 0 do
begin
P := PProgressData(Items[Result]);
if AClass.InheritsFrom(P.ControlClass) then
Exit;
end;
Result := -1;
end;
procedure TJvProgressList.Remove(AClass: TControlClass);
var
I: Integer;
P: PProgressData;
begin
for I := Count - 1 downto 0 do
begin
P := PProgressData(Items[I]);
if P.ControlClass.InheritsFrom(AClass) then
begin
{$IFNDEF CLR}
Dispose(P);
{$ENDIF !CLR}
Delete(I);
end;
end;
end;
function TJvProgressList.SetControlProperty(Control: TControl;
Prop: TProgressProp; Value: Longint): Boolean;
var
PropInfo: PPropInfo;
I: Integer;
PropName: string;
begin
Result := False;
if Control <> nil then
begin
I := FindClass(TControlClass(Control.ClassType));
if I >= 0 then
begin
case Prop of
ppMax:
PropName := PProgressData(Items[I]).MaxProperty;
ppMin:
PropName := PProgressData(Items[I]).MinProperty;
else {ppProgress}
PropName := PProgressData(Items[I]).ProgressProperty;
end;
PropInfo := GetPropInfo(Control.ClassInfo, PropName);
if (PropInfo <> nil) and
{$IFDEF CLR}
(PropInfo.TypeKind
{$ELSE}
(PropInfo^.PropType^.Kind
{$ENDIF CLR}
in [tkInteger, tkFloat, tkVariant]) then
begin
SetOrdProp(Control, PropInfo, Value);
Result := True;
end;
end;
end;
end;
var
ProgressList: TJvProgressList = nil;
function GetProgressList: TJvProgressList;
begin
if ProgressList = nil then
ProgressList := TJvProgressList.Create;
Result := ProgressList;
end;
function SupportsProgressControl(Control: TControl): Boolean;
begin
if Control <> nil then
Result := GetProgressList.FindClass(TControlClass(Control.ClassType)) >= 0
else
Result := False;
end;
procedure RegisterProgressControl(AClass: TControlClass;
const MaxPropName, MinPropName, ProgressPropName: string);
begin
GetProgressList.Add(AClass, MaxPropName, MinPropName, ProgressPropName);
end;
procedure UnRegisterProgressControl(AClass: TControlClass);
begin
GetProgressList.Remove(AClass);
end;
procedure SetProgressMax(Control: TControl; MaxValue: Longint);
begin
GetProgressList.SetControlProperty(Control, ppMax, MaxValue);
end;
procedure SetProgressMin(Control: TControl; MinValue: Longint);
begin
GetProgressList.SetControlProperty(Control, ppMin, MinValue);
end;
procedure SetProgressValue(Control: TControl; ProgressValue: Longint);
begin
GetProgressList.SetControlProperty(Control, ppProgress, ProgressValue);
end;
initialization
{$IFDEF UNITVERSIONING}
RegisterUnitVersion(HInstance, UnitVersioning);
{$ENDIF UNITVERSIONING}
finalization
FreeAndNil(ProgressList);
{$IFDEF UNITVERSIONING}
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.