Rxprgrss.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:5k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1997 Master-Bank                }
  6. {                                                       }
  7. {*******************************************************}
  8. unit RxPrgrss;
  9. interface
  10. {$I RX.INC}
  11. uses SysUtils, Classes, Controls;
  12. procedure RegisterProgressControl(AClass: TControlClass; const MaxPropName,
  13.   MinPropName, ProgressPropName: string);
  14. procedure UnRegisterProgressControl(AClass: TControlClass);
  15. function SupportsProgressControl(Control: TControl): Boolean;
  16. procedure SetProgressMax(Control: TControl; MaxValue: Longint);
  17. procedure SetProgressMin(Control: TControl; MinValue: Longint);
  18. procedure SetProgressValue(Control: TControl; ProgressValue: Longint);
  19. implementation
  20. {$DEFINE USE_GAUGE}
  21. {$IFDEF WIN32}
  22.   {$IFDEF USE_PROGRESSBAR}
  23.     {$UNDEF USE_GAUGE}
  24.   {$ENDIF}
  25. {$ENDIF}
  26. uses TypInfo, {$IFDEF WIN32} {$IFDEF USE_GAUGE} Gauges, {$ENDIF} ComCtrls;
  27.   {$ELSE} Gauges; {$ENDIF}
  28. { TProgressList }
  29. type
  30.   TProgressProp = (ppMax, ppMin, ppProgress);
  31.   PProgressData = ^TProgressData;
  32.   TProgressData = record
  33.     ControlClass: TControlClass;
  34.     MaxProperty: string[63];
  35.     MinProperty: string[63];
  36.     ProgressProperty: string[63];
  37.   end;
  38.   TProgressList = class(TList)
  39.   public
  40.     constructor Create;
  41.     destructor Destroy; override;
  42.     procedure Add(AClass: TControlClass; const MaxPropName, MinPropName,
  43.       ProgressPropName: string);
  44.     function FindClass(AClass: TControlClass): Integer;
  45.     procedure Remove(AClass: TControlClass);
  46.     function SetControlProperty(Control: TControl; Prop: TProgressProp;
  47.       Value: Longint): Boolean;
  48.   end;
  49. constructor TProgressList.Create;
  50. begin
  51.   inherited Create;
  52. {$IFDEF WIN32}
  53.   Add(TProgressBar, 'Max', 'Min', 'Position');
  54. {$ENDIF}
  55. {$IFDEF USE_GAUGE}
  56.   Add(TGauge, 'MaxValue', 'MinValue', 'Progress');
  57. {$ENDIF}
  58. end;
  59. destructor TProgressList.Destroy;
  60. var
  61.   I: Integer;
  62. begin
  63.   for I := 0 to Count - 1 do Dispose(PProgressData(Items[I]));
  64.   inherited Destroy;
  65. end;
  66. procedure TProgressList.Add(AClass: TControlClass; const MaxPropName,
  67.   MinPropName, ProgressPropName: string);
  68. var
  69.   NewRec: PProgressData;
  70. begin
  71.   New(NewRec);
  72.   with NewRec^ do begin
  73.     ControlClass := AClass;
  74.     MaxProperty := MaxPropName;
  75.     MinProperty := MinPropName;
  76.     ProgressProperty := ProgressPropName;
  77.   end;
  78.   inherited Add(NewRec);
  79. end;
  80. function TProgressList.FindClass(AClass: TControlClass): Integer;
  81. var
  82.   P: PProgressData;
  83. begin
  84.   for Result := Count - 1 downto 0 do begin
  85.     P := PProgressData(Items[Result]);
  86.     if AClass.InheritsFrom(P^.ControlClass) then Exit;
  87.   end;
  88.   Result := -1;
  89. end;
  90. procedure TProgressList.Remove(AClass: TControlClass);
  91. var
  92.   I: Integer;
  93.   P: PProgressData;
  94. begin
  95.   for I := Count - 1 downto 0 do begin
  96.     P := PProgressData(Items[I]);
  97.     if P^.ControlClass.InheritsFrom(AClass) then begin
  98.       Dispose(P);
  99.       Delete(I);
  100.     end;
  101.   end;
  102. end;
  103. function TProgressList.SetControlProperty(Control: TControl;
  104.   Prop: TProgressProp; Value: Longint): Boolean;
  105. var
  106.   PropInfo: PPropInfo;
  107.   I: Integer;
  108.   PropName: string;
  109. begin
  110.   Result := False;
  111.   if (Control <> nil) then begin
  112.     I := FindClass(TControlClass(Control.ClassType));
  113.     if I >= 0 then begin
  114.       case Prop of
  115.         ppMax: PropName := PProgressData(Items[I])^.MaxProperty;
  116.         ppMin: PropName := PProgressData(Items[I])^.MinProperty;
  117.         else {ppProgress}
  118.           PropName := PProgressData(Items[I])^.ProgressProperty;
  119.       end;
  120.       PropInfo := GetPropInfo(Control.ClassInfo, PropName);
  121.       if (PropInfo <> nil) and (PropInfo^.PropType^.Kind in
  122.         [tkInteger, tkFloat {$IFDEF WIN32}, tkVariant {$ENDIF}]) then
  123.       begin
  124.         SetOrdProp(Control, PropInfo, Value);
  125.         Result := True;
  126.       end;
  127.     end;
  128.   end;
  129. end;
  130. const
  131.   ProgressList: TProgressList = nil;
  132. function GetProgressList: TProgressList;
  133. begin
  134.   if ProgressList = nil then ProgressList := TProgressList.Create;
  135.   Result := ProgressList;
  136. end;
  137. function SupportsProgressControl(Control: TControl): Boolean;
  138. begin
  139.   if Control <> nil then
  140.     Result := GetProgressList.FindClass(TControlClass(Control.ClassType)) >= 0
  141.   else Result := False;
  142. end;
  143. procedure RegisterProgressControl(AClass: TControlClass; const MaxPropName,
  144.   MinPropName, ProgressPropName: string);
  145. begin
  146.   GetProgressList.Add(AClass, MaxPropName, MinPropName, ProgressPropName);
  147. end;
  148. procedure UnRegisterProgressControl(AClass: TControlClass);
  149. begin
  150.   if ProgressList <> nil then ProgressList.Remove(AClass);
  151. end;
  152. procedure SetProgressMax(Control: TControl; MaxValue: Longint);
  153. begin
  154.   GetProgressList.SetControlProperty(Control, ppMax, MaxValue);
  155. end;
  156. procedure SetProgressMin(Control: TControl; MinValue: Longint);
  157. begin
  158.   GetProgressList.SetControlProperty(Control, ppMin, MinValue);
  159. end;
  160. procedure SetProgressValue(Control: TControl; ProgressValue: Longint);
  161. begin
  162.   GetProgressList.SetControlProperty(Control, ppProgress, ProgressValue);
  163. end;
  164. {$IFNDEF WIN32}
  165. procedure Finalize; far;
  166. begin
  167.   ProgressList.Free;
  168. end;
  169. {$ENDIF}
  170. initialization
  171. {$IFDEF WIN32}
  172. finalization
  173.   ProgressList.Free;
  174. {$ELSE}
  175.   AddExitProc(Finalize);
  176. {$ENDIF}
  177. end.