« Webカメラの映像を表示して、画像をJpegファイルに保存する(Lazarus/Delphiファイルサイズその2) | トップページ | DelphiでiFilterを使用する »

2017.04.23

DelphiとLazarusでのドロップファイル処理の違い

ファイルやフォルダの日付を一括変更したくてフリーソフトのTouchを探したのですが、フォルダの日付も変更できるものを見つけることが出来なかったので自力で作成しました。
細かなことが面倒だったので、ファイル・フォルダに関わらずまとめてドロップすれば一気に日付を変更する、ファイル日付は作成・更新・最終アクセス日付を指定した日時で全部変更する、ということにしました。また、実行ファイルのショートカットにファイル・フォルダをドロップしたら、その時点の日時で変更する、日時を指定したい場合は実行ファイルを起動して日時を指定後にそのフォームにドロップする、ということにしました。

Touch

で、今回もDelphiとLazarusの両方で実行ファイルサイズを見比べならが(^^;作成したのですが、Lazarusでのドロップファイル処理の仕方がDelphiとは異なっていたのでメモしておくことにしました。こうやって比べてみると、私的にはLazarusの方がスマートな感じがしていいかなと思います。

Delphiの場合

// ファイル・フォルダがドロップされた際のイベント
procedure TForm1.DropFiles(var Msg: TMsg; var Done: Boolean);
var
nFile, i: integer;
fname: string;
FileName: array[0..260] of char;
DT: TDateTime;
begin
Done := True;
if Msg.message = WM_DROPFILES then
begin
SetForegroundWindow(Application.Handle);
// 変更後の日付と時刻を合成(DateNewの整数部とTimeNewの小数部を足す)
DT := Trunc(DateNew.DateTime) + Frac(TimeNew.DateTime);
try
nFile := DragQueryFile(Msg.wParam, $FFFFFFFF, nil, 0);
for i := 0 to nFile - 1 do
begin
DragQueryFile(Msg.wParam, i, FileName, SizeOf(FileName));
fname := FileName;
if DirectoryExists(fname) then
ChangeDirTime(fname, DT)
else
SetFileDate(fname, DT, DT, DT);
end;
finally
DragFinish(Msg.wParam);
end
end else
Done := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//ドロップファイルイベントの登録
Application.OnMessage := DropFiles;
DragAcceptFiles(Handle, True);

Lazarusの場合

// ファイル・フォルダがドロップされた際のイベント
procedure TForm1.DropFiles(Sender: TObject; const Files:Array of AnsiString);
var
i: integer;
fname: string;
DT: TDateTime;
begin
SetForegroundWindow(Handle);
// 変更後の日付と時刻を合成(DateNewの整数部とTimeNewの小数部を足す)
DT := Trunc(NewDate.Date) + Frac(NewTime.Time);
// Lengthで配列の大きさを取得してリストを取得する
for i := 0 to Length(Files) - 1 do
begin
fname := Files[i];
if DirectoryExists(fname) then
ChangeDirTime(fname, DT)
else
SetFileDate(fname, DT, DT, DT);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// Lazarusではファイルドロップイベントを以下のように設定する
Application.AddOnDropFilesHandler(@DropFiles);

procedure TForm1.FormDestroy(Sender: TObject);
begin
// 終了時にイベント解除
Application.RemoveOnDropFilesHandler(@DropFiles);
end;

実行ファイルサイズは
Delphi10.1 Starter   2,167,808 バイト
Lazarus1.7+FPC3.1  2,788,352 バイト

LazarusではDateTimePickerコンポーネントが標準ではインストールされていないので、手動でDateTimeCtrlsパッケージをインストールする必要があります。おそらく、この追加コンポーネントがファイルサイズが大きくなっている原因ではないかと思います。

「touch.zip」をダウンロード

サンプルファイルにはDelphi/LazarusのソースファイルとDelphiで作成した実行ファイルが含まれています。

|

« Webカメラの映像を表示して、画像をJpegファイルに保存する(Lazarus/Delphiファイルサイズその2) | トップページ | DelphiでiFilterを使用する »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: DelphiとLazarusでのドロップファイル処理の違い:

« Webカメラの映像を表示して、画像をJpegファイルに保存する(Lazarus/Delphiファイルサイズその2) | トップページ | DelphiでiFilterを使用する »