WAIT.PAS
上传用户:xdgkgcw
上传日期:2007-01-04
资源大小:92k
文件大小:10k
源码类别:

Delphi控件源码

开发平台:

WINDOWS

  1. {*_* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2. Program:      WAIT.PAS
  3. Object:       Delphi component which enable a component or application to
  4.               wait for some event, optionnaly displaying a progress bar.
  5. Author:       Fran鏾is PIETTE
  6. EMail:        francois.piette@pophost.eunet.be    
  7.               francois.piette@rtfm.be             http://www.rtfm.be/fpiette
  8. Creation:     April, 1996
  9. Version:      2.13
  10. Support:      Use the mailing list twsocket@rtfm.be See website for details.
  11. Legal issues: Copyright (C) 1996, 1997, 1998 by Fran鏾is PIETTE
  12.               Rue de Grady 24, 4053 Embourg, Belgium. Fax: +32-4-365.74.56
  13.               <francois.piette@pophost.eunet.be>
  14.               This software is provided 'as-is', without any express or
  15.               implied warranty.  In no event will the author be held liable
  16.               for any  damages arising from the use of this software.
  17.               Permission is granted to anyone to use this software for any
  18.               purpose, including commercial applications, and to alter it
  19.               and redistribute it freely, subject to the following
  20.               restrictions:
  21.               1. The origin of this software must not be misrepresented,
  22.                  you must not claim that you wrote the original software.
  23.                  If you use this software in a product, an acknowledgment
  24.                  in the product documentation would be appreciated but is
  25.                  not required.
  26.               2. Altered source versions must be plainly marked as such, and
  27.                  must not be misrepresented as being the original software.
  28.               3. This notice may not be removed or altered from any source
  29.                  distribution.
  30.               4. You must register this software by sending a picture postcard
  31.                  to the author. Use a nice stamp and mention your name, street
  32.                  address, EMail address and any comment you like to say.
  33. Updates:
  34. Jul 22, 1997  Adapted to Delphi 3
  35. Oct 22, 1997  V2.00 Added WaitVersion constant and Running property
  36. Nov 11, 1997  V2.10 Made a TCustomWait base component with virtual functions.
  37.               This will easy the making of descendend components.
  38.               Renamed OnWaitEvent    -> OnWait
  39.                       OnTimeOutEvent -> OnTimeout
  40.               Added events:
  41.               OnWaitStart   When the component starts his job.
  42.               OnWaiting     When the component is waiting.
  43.               OnWaitStop    When the component stops his job.
  44. Mar 27, 1998  V2.11 Adapted for C++Builder 3
  45. Apr 20, 1998  V2.12 Removed the second 'r' from 'courrier'
  46. Jul 08, 1998  V2.13 Adadpted for Delphi 4
  47.  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  48. unit Wait;
  49. {$B-}           { Enable partial boolean evaluation   }
  50. {$T-}           { Untyped pointers                    }
  51. {$IFNDEF VER80} { Not for Delphi 1                    }
  52.     {$J+}       { Allow typed constant to be modified }
  53. {$ENDIF}
  54. {$IFDEF VER110} { C++ Builder V3.0                    }
  55.     {$ObjExportAll On}
  56. {$ENDIF}
  57. interface
  58. uses
  59.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  60.   Forms, Dialogs, StdCtrls, ExtCtrls;
  61. const
  62.   WaitVersion = 212;
  63. type
  64.   TWaitEvent = procedure(Sender: TObject; Count : integer) of object;
  65.   TCustomWait = class(TCustomControl)
  66.   public
  67.     constructor Create(AOwner: TComponent); override;
  68.     destructor  Destroy; override;
  69.   private
  70.     FPen         : TPen;
  71.     FFont        : TFont;
  72.     FBrush       : TBrush;
  73.     FCaption     : String;
  74.     FTimer       : TTimer;
  75.     FOnWait      : TWaitEvent;
  76.     FOnWaiting   : TNotifyEvent;
  77.     FOnWaitStart : TNotifyEvent;
  78.     FOnWaitStop  : TNotifyEvent;
  79.     FOnTimeout   : TNotifyEvent;
  80.     FModalResult : TModalResult;
  81.     FStartVal    : Integer;
  82.   protected
  83.     procedure   Paint; override;
  84.     procedure   TimerEvent(Sender: TObject);
  85.     procedure   AppMessage(var Msg: TMsg; var Handled: Boolean);
  86.     function    GetRunning : Boolean;
  87.     procedure   SetInterval(Value : Word);
  88.     function    GetInterval : Word;
  89.   public
  90.     procedure   Start; virtual;
  91.     procedure   Stop; virtual;
  92.     procedure   StartModal; virtual;
  93.     procedure   Restart; virtual;
  94.   protected
  95.     property Caption     : String       read FCaption      write FCaption;
  96.     property ModalResult : TModalResult read FModalResult  write FModalResult;
  97.     property Interval    : Word         read GetInterval   write SetInterval;
  98.     property Running     : Boolean      read GetRunning;
  99.     property OnWait      : TWaitEvent   read FOnWait       write FOnWait;
  100.     property OnTimeout   : TNotifyEvent read FOnTimeout    write FOnTimeout;
  101.     property OnWaiting   : TNotifyEvent read FOnWaiting    write FOnWaiting;
  102.     property OnWaitStart : TNotifyEvent read FOnWaitStart  write FOnWaitStart;
  103.     property OnWaitStop  : TNotifyEvent read FOnWaitStop   write FOnWaitStop;
  104.   end;
  105.   TWait = class(TCustomWait)
  106.   published
  107.     property Caption;
  108.     property ModalResult;
  109.     property Interval;
  110.     property OnWait;
  111.     property OnWaiting;
  112.     property OnWaitStart;
  113.     property OnWaitStop;
  114.     property OnTimeout;
  115.     property Running;
  116.     property Visible;
  117.   end;
  118. procedure Register;
  119. implementation
  120. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  121. procedure Register;
  122. begin
  123.     RegisterComponents('FPiette', [TWait]);
  124. end;
  125. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  126. function atoi(value : string) : Integer;
  127. var
  128.     i : Integer;
  129. begin
  130.     Result := 0;
  131.     i := 1;
  132.     while (i <= Length(Value)) and (Value[i] = ' ') do
  133.         i := i + 1;
  134.     while (i <= Length(Value)) and (Value[i] >= '0') and (Value[i] <= '9')do begin
  135.         Result := Result * 10 + ord(Value[i]) - ord('0');
  136.         i := i + 1;
  137.     end;
  138. end;
  139. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  140. constructor TCustomWait.Create(AOwner: TComponent);
  141. begin
  142.     inherited Create(AOwner);
  143.     IsControl      := TRUE;
  144.     Width          := 192;
  145.     Height         := 32;
  146.     Caption        := '60';
  147.     FStartVal      := 60;
  148.     FOnWait        := nil;
  149.     FBrush         := TBrush.Create;
  150.     FPen           := TPen.Create;
  151.     FFont          := TFont.Create;
  152.     FFont.Size     := 8;
  153.     FFont.Name     := 'Courier';
  154.     FFont.Pitch    := fpFixed;
  155.     FTimer         := TTimer.Create(Self);
  156.     FTimer.Enabled := FALSE;
  157.     FTimer.OnTimer := TimerEvent;
  158. end;
  159. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  160. destructor TCustomWait.Destroy;
  161. begin
  162.     FPen.Free;
  163.     FFont.Free;
  164.     FBrush.Free;
  165.     FTimer.Free;
  166.     inherited Destroy;
  167. end;
  168. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  169. procedure TCustomWait.SetInterval(Value : Word);
  170. begin
  171.     FTimer.Interval := Value;
  172. end;
  173. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  174. function TCustomWait.GetInterval : Word;
  175. begin
  176.     Result := FTimer.Interval;
  177. end;
  178. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  179. procedure TCustomWait.Start;
  180. begin
  181.     FStartVal := atoi(Caption);
  182.     if FStartVal = 0 then begin
  183.         FStartVal := 15;
  184.         Caption   := IntToStr(FStartVal);
  185.     end;
  186.     FTimer.Enabled := TRUE;
  187.     if Assigned(FOnWaitStart) then
  188.         FOnWaitStart(Self);
  189. end;
  190. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  191. procedure TCustomWait.Restart;
  192. begin
  193.     Caption := IntToStr(FStartVal);
  194. end;
  195. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  196. procedure TCustomWait.Stop;
  197. begin
  198.     FModalResult   := mrOk;
  199.     FTimer.Enabled := FALSE;
  200.     Caption        := IntToStr(FStartVal);
  201.     if Assigned(FOnWaitStop) then
  202.         FOnWaitStop(Self);
  203. end;
  204. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  205. procedure TCustomWait.TimerEvent(Sender: TObject);
  206. var
  207.     Count : Integer;
  208. begin
  209.     Count := atoi(FCaption) - 1;
  210.     if Assigned(FOnWait) then
  211.         FOnWait(Self, Count);
  212.     if Count <= 0 then begin
  213.         FTimer.Enabled := FALSE;
  214.         FCaption       := 'Timeout';
  215.         FModalResult   := mrCancel;
  216.         Caption        := IntToStr(FStartVal);
  217.         if Assigned(FOnTimeout) then
  218.             FOnTimeout(Self);
  219.     end
  220.     else begin
  221.         FCaption := IntToStr(count);
  222.     end;
  223.     Invalidate;
  224. end;
  225. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  226. procedure TCustomWait.AppMessage(var Msg: TMsg; var Handled: Boolean);
  227. begin
  228.     if (Msg.Message = WM_LBUTTONDOWN)   or
  229. {       (Msg.Message = WM_LBUTTONUP)     or }
  230.        (Msg.Message = WM_RBUTTONDOWN)   or
  231. {       (Msg.Message = WM_RBUTTONUP)     or }
  232.        (Msg.Message = WM_LBUTTONDBLCLK) or
  233.        (Msg.Message = WM_RBUTTONDBLCLK) or
  234.        (Msg.Message = WM_KEYDOWN)       or
  235. {       (Msg.Message = WM_KEYUP)         or }
  236.        (Msg.Message = WM_SYSKEYDOWN)    {or
  237.        (Msg.Message = WM_SYSKEYUP) }
  238.     then begin
  239.         MessageBeep(MB_OK);
  240.         Handled := TRUE;
  241.     end;
  242. end;
  243. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  244. function TCustomWait.GetRunning : Boolean;
  245. begin
  246.     Result := FTimer.Enabled;
  247. end;
  248. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  249. procedure TCustomWait.StartModal;
  250. var
  251.     OldOnMessage : TMessageEvent;
  252. begin
  253.     OldOnMessage := Application.OnMessage;
  254.     Application.OnMessage := AppMessage;
  255.     FModalResult := mrNone;
  256.     Start;
  257.     while Running do begin
  258.         if Assigned(FOnWaiting) then
  259.             FOnWaiting(Self);
  260.         Application.ProcessMessages;
  261.     end;
  262.     Application.OnMessage := OldOnMessage;
  263. end;
  264. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  265. procedure TCustomWait.Paint;
  266. var
  267.     Len   : Integer;
  268. begin
  269.     Len := (atoi(Caption) * (Width - 7)) div FStartVal;
  270.     Canvas.Pen   := FPen;
  271.     Canvas.Font  := FFont;
  272.     Canvas.Brush := FBrush;
  273.     Canvas.Brush.Color := clWhite;
  274.     Canvas.Rectangle(0, 0, Width - 1, Height - 1);
  275.     Canvas.Brush.Color := clHighlight;
  276.     Canvas.Rectangle(3, 3, 3 + Len, Height - 4);
  277.     Canvas.TextOut(4, Height div 2 - 8, FCaption);
  278. end;
  279. {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
  280. end.