Mam's WebSite

Mamの覚書Q&A検索


大項目:「 Delphi 」 - 中項目:「 いろいろ 」

「 WakeupOnLan 」

WakeupOnLan


回答

ソース

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sockets, IdBaseComponent, IdComponent, IdUDPBase,
  IdUDPClient,IdGlobal,winsock, ExtCtrls, ComCtrls;
 
type
  TForm1 = class(TForm)
    E_IP: TEdit;
    E1: TEdit;
    E2: TEdit;
    E3: TEdit;
    E4: TEdit;
    E5: TEdit;
    E6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    B_Start: TButton;
    IdUDPClient1: TIdUDPClient;
    Label3: TLabel;
    Label4: TLabel;
    Timer1: TTimer;
    DT_Time: TDateTimePicker;
    DT_Date: TDateTimePicker;
    Memo1: TMemo;
    Label5: TLabel;
    L_Now: TLabel;
    Timer2: TTimer;
    procedure Timer2Timer(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure B_StartClick(Sender: TObject);
  private
    { Private 宣言 }
    function send_packete():boolean;
  public
    { Public 宣言 }
    jikoku:TDateTime;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.B_StartClick(Sender: TObject);
var yy,mm,dd,hh,nn,ss,ms:word;
begin
  if Timer1.Enabled then
  begin
    Timer1.Enabled:=false;
    B_Start.Caption:='開始';
    memo1.Lines.Add('中止しました');
 
    E_IP.Enabled:=true;
    E1.Enabled:=true;
    E2.Enabled:=true;
    E3.Enabled:=true;
    E4.Enabled:=true;
    E5.Enabled:=true;
    E6.Enabled:=true;
    DT_Date.Enabled:=true;
    DT_Time.Enabled:=true;
 
    exit;
  end
  else
  begin
 
    DecodeDate(DT_Date.DateTime,yy,mm,dd);
    DecodeTime(DT_Time.DateTime,hh,nn,ss,ms);
 
    jikoku:=EncodeDate(yy,mm,dd);
 
    jikoku:=jikoku+EncodeTime(hh,nn,ss,0);
    //jikoku:=DT_Date.Date+DT_Time.Time;
 
//    showmessage(FormatDateTime('yyyy/mm/dd hh:nn:ss',jikoku)) ;
//    showmessage(FormatDateTime('yyyy/mm/dd hh:nn:ss',DT_Date.Date)) ;
//    showmessage(FormatDateTime('yyyy/mm/dd hh:nn:ss',DT_time.Time)) ;
 
    if jikoku<now() then
    begin
      memo1.Lines.Add('指定した時刻は既に過ぎていますので中止しました。');
    end
    else
    begin
      Timer1.Enabled:=true;
      B_Start.Caption:='中止';
      memo1.Lines.Add('指定時刻になるのを待っています。');
 
      E_IP.Enabled:=false;
      E1.Enabled:=false;
      E2.Enabled:=false;
      E3.Enabled:=false;
      E4.Enabled:=false;
      E5.Enabled:=false;
      E6.Enabled:=false;
      DT_Date.Enabled:=false;
      DT_Time.Enabled:=false;
    end;
  end;
 

end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  DT_Date.DateTime:=now;
  DT_Time.dateTime:=now;
end;
 
function TForm1.send_packete:boolean;
var a : TBytes;
    i:integer;
begin
  result:=true;
  setlength(a,6+6*16);
  for i:=0 to 5 do
    a[i]:=$ff;
 
  for i:=1 to 16 do
  begin
    a[i*6+0]:=strtoint('$'+E1.Text);
    a[i*6+1]:=strtoint('$'+E2.Text);
    a[i*6+2]:=strtoint('$'+E3.Text);
    a[i*6+3]:=strtoint('$'+E4.Text);
    a[i*6+4]:=strtoint('$'+E5.Text);
    a[i*6+5]:=strtoint('$'+E6.Text);
  end;
 
  try
    IdUDPClient1.Host:=E_IP.Text;
    IdUDPClient1.SendBuffer(a);
  Except
    result:=false;
  end;
 

  //IdUDPClient1.SendBuffer();
 
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var ret:boolean;
begin
  if jikoku<now then
  begin
    timer1.Enabled:=false;
    ret:=send_packete;
 
    if ret then
    begin
      memo1.Lines.Add('マジックパケットを送信しました。'
        +'('+formatdatetime('yyyy/mm/dd hh:nn:ss',now)+')');
    end
    else
    begin
      memo1.Lines.Add('送信エラーが発生しました。'
        +'('+formatdatetime('yyyy/mm/dd hh:nn:ss',now)+')');
    end;
 
    B_Start.Caption:='開始';
    E_IP.Enabled:=true;
    E1.Enabled:=true;
    E2.Enabled:=true;
    E3.Enabled:=true;
    E4.Enabled:=true;
    E5.Enabled:=true;
    E6.Enabled:=true;
    DT_Date.Enabled:=true;
    DT_Time.Enabled:=true;
 
  end;
 
end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  L_Now.Caption:=
    '現在日時 '+FormatDateTime('yyyy/mm/dd hh:nn:ss',now);
end;
 
end.

Copyright 2019 Mam