OS標準のタスクスケジューラを使用してもよっかったが
起動できるのがバッチファイルか単独のEXEになるので
もううちょっと処理を柔軟にしたいと思いJVCLの
JvScheduledEventsを試してみた。
TJvScheduledEventsは、画面でスケジューリングの
設定が可能であるが、今回は、スケジュールを外部
ファイルに持たせたかったので、プラグラム中で
設定することにした。
以下、サンプルで試したソース。
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, JvScheduledEvents, StdCtrls, ExtCtrls, ComCtrls, JvComponentBase, JvCreateProcess; type TForm1 = class(TForm) Button1: TButton; DateTimePicker1: TDateTimePicker; Label1: TLabel; LabeledEdit1: TLabeledEdit; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private 宣言 } FJvScheduledEvents : TJvScheduledEvents; procedure JvScheduledEventsExecute(Sender: TJvEventCollectionItem; const IsSnoozeEvent: Boolean); public { Public 宣言 } end; var Form1: TForm1; implementation uses JclSchedule; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var EventItem : TJvEventCollectionItem; IJclSched : JclSchedule.IJclSchedule; IDaySched : IJclDailySchedule; IDyaFreq : IJclScheduleDayFrequency; begin EventItem := FJvScheduledEvents.Events.Add; IJclSched := EventItem.Schedule; //イベントアイテムのスケジュール自体は、 //IJclScheduleで受けますが、実態はTJclScheduleで //IJclScheduleのほか //IJclScheduleDayFrequency, //IJclDailySchedule, //IJclWeeklySchedule, //IJclMonthlySchedule, //IJclYearlySchedule //を継承しています。 IJclSched.RecurringType := srkDaily; IDaySched := (IJclSched as IJclDailySchedule); if Assigned(IDaySched) then begin //毎日実行する場合は、EveryWeekDayをFalseにして //間隔を1(日)にします。 IDaySched.EveryWeekDay := false; IDaySched.Interval := 1; end; IDyaFreq := (IJclSched as IJclScheduleDayFrequency); if Assigned(IDyaFreq) then begin IDyaFreq.StartTime := DateTimeToTimeStamp(Self.DateTimePicker1.Time).Time; IDyaFreq.EndTime := IDyaFreq.StartTime; IDyaFreq.Interval := 1; end; EventItem.Name := LabeledEdit1.Text; EventItem.OnExecute := JvScheduledEventsExecute; EventItem.Start; end; procedure TForm1.FormCreate(Sender: TObject); begin FJvScheduledEvents := TJvScheduledEvents.Create(Self); end; procedure TForm1.FormDestroy(Sender: TObject); begin FJvScheduledEvents.Events.Clear; FJvScheduledEvents.Free; end; procedure TForm1.JvScheduledEventsExecute(Sender: TJvEventCollectionItem; const IsSnoozeEvent: Boolean); var JvCreateProcess: TJvCreateProcess; begin JvCreateProcess := TJvCreateProcess.Create(Self); try JvCreateProcess.CommandLine := Sender.Name; JvCreateProcess.WaitForTerminate := true; JvCreateProcess.Run; finally JvCreateProcess.Free; end; end; end.
ポイントは、以下の2つかと思います。
- JclScheduleをUsesに加えることと
- TJvEventCollectionItem.Scheduleの戻り値がIJclSchedule型であるが実態はTJclSchedule型でIJclScheduleのほかIJclScheduleDayFrequency,IJclDailySchedule,IJclWeeklySchedule,IJclMonthlySchedule,
IJclYearlyScheduleを継承していて設定したいスケジュールにあわせて適切にキャストする必要があること
今回のサンプルは、『ボタンを押したら指定した時刻にメモ帳を起動する』というタイマーで処理しても
十分なものですが、リフレクション、パッケージの動的ロードなどを使えば、もっと面白いことが
できそうな気がします。
0 件のコメント:
コメントを投稿