Where is my way?

 

delphi 一个时钟引发的事情

    学习c# 事件之后,此前一直云里雾里.后来看到一句话:事件是基于观察者模式,有种扒开云雾见彩虹的感觉.于是趁热打铁重写了以前一个小程序

    功能: 定时触发或做某些事

 

     作用:为了方便员工们不需要每天重复统计数据之后再一条一条信息发送到决策人的手机里,于是就做了个定时统计数据并自动发送短信的功能

 

    设计:

              TClock类, TClockEventArgs类 ,TWorker类

 

 

  //时,分,秒事件指针
   TOnSecondChangeEvent = procedure (sender:TObject;e:TClockEventArgs) of object;
   TOnMinuteChangeEvent = procedure (sender:TObject;e:TClockEventArgs) of object;
   TOnHourChangeEvent = procedure (sender:TObject;e:TClockEventArgs) of object;

  

TClock = class
private
FSecond: Integer; //秒
FMinute: Integer; //分
FHour: Integer; //时
FClockStop: Boolean; //是否停止
FOnSecondChange: TOnSecondChangeEvent;
FOnMinuteChange: TOnMinuteChangeEvent;
FOnHourChange: TOnHourChangeEvent;

procedure SetOnSecondChange(const Value: TOnSecondChangeEvent);
procedure SetHour(const Value: Integer);
procedure SetMinute(const Value: Integer);
procedure SetOnHourChange(const Value: TOnHourChangeEvent);
procedure SetOnMinuteChange(const Value: TOnMinuteChangeEvent);
procedure SetSecond(const Value: Integer);
procedure SetClockStop(const Value: Boolean);
public
constructor Create();
procedure Run(); //运行
property ClockStop:Boolean read FClockStop write SetClockStop;
property Hour:Integer read FHour write SetHour;
property Minute:Integer read FMinute write SetMinute;
property Second:Integer read FSecond write SetSecond;
property OnSecondChange:TOnSecondChangeEvent read FOnSecondChange write SetOnSecondChange;
property OnMinuteChange:TOnMinuteChangeEvent read FOnMinuteChange write SetOnMinuteChange;
property OnHourChange:TOnHourChangeEvent read FOnHourChange write SetOnHourChange;
end;
procedure TClock.Run(); //run实现
var
 ClockEventArgs:TClockEventArgs;
begin
   ClockEventArgs:= TClockEventArgs.Create();

   while not FClockStop do
   begin
    if Assigned(OnSecondChange) then
    begin
      OnSecondChange(self,ClockEventArgs);
    end;

    if( Assigned(OnMinuteChange)  and (MinuteOfTheHour(Now) <> self.Minute)) then
    begin
       OnSecondChange(Self,ClockEventArgs);
    end;

    if( Assigned(OnHourChange) ) and ( Hour <> HourOfTheDay(Now)) then
    begin
       OnHourChange(Self,ClockEventArgs);
    end;

    Sleep(1000 * 60);

    ClockEventArgs.Hour := HourOfTheDay(Now);
    ClockEventArgs.Minute := MinuteOfTheDay(Now);
    ClockEventArgs.Second := SecondOfTheMinute(Now);

   end;
end;

  

  
TClockEventArgs = class
private
FSecond: Integer;
FMinute: Integer;
FHour: Integer;
procedure SetHour(const Value: Integer);
procedure SetMinute(const Value: Integer);
procedure SetSecond(const Value: Integer);
public
constructor Create();
published
property Hour:Integer read FHour write SetHour;
property Minute:Integer read FMinute write SetMinute;
property Second:Integer read FSecond write SetSecond;
end;

 

TWorker = class
   private
     ConectStr:String;
     public
      Constructor Create(theClock:TClock;ConnectString:string);
      procedure DoSMSCheck(sender:TObject;e:TClockEventArgs); //短信
      procedure DoWork(sender:TObject;e:TClockEventArgs);
   end;

 

constructor TWorker.Create(theClock:TClock;ConnectString: string);
begin
Self.ConectStr := ConnectString;
theClock.OnMinuteChange := Self.DoWork;
theClock.OnHourChange := self.DoSMSCheck;
end;


创建实例

 var
Clock:TClock;
Worker:TWorker;
begin
Clock := TClock.Create();
Worker := TWorker.Create(Clock,ProcessMsgForm.MainConnect.ConnectionString);
Clock.Run; //时钟开启
if Clock.FClockStop then
begin
Clock.Free;
Worker.Free;
end;

end;

 

posted on 2012-01-30 14:51  ManLoveGirls  阅读(890)  评论(0编辑  收藏  举报

导航