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 件のコメント:
コメントを投稿