home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / kolekce / d6 / RX275D6.ZIP / Units / RXPRGRSS.PAS < prev    next >
Pascal/Delphi Source File  |  1999-10-12  |  6KB  |  206 lines

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