学习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;