喫茶XRAYトップページ

[▲前のスレッド]

[4136] plFolderWatcherについて返信 削除
2011/1/5 (水) 21:38:57 たてぐや
 plFolderWatcherを、Directoryを別々にして複数動かしたいと思い、作成し
ました。フォーム上にplFolderWatcherを必要数だけ置くと、べたべたなソース
になってしまうので、以下のようにしました。長くて済みません。
var
  FolderWatch : array[0..15] of TplFolderWatcher;

procedure TFrmSet.FormCreate(Sender: TObject);
{=====================================================================
初期化
======================================================================}
var
  p : integer;
  Options : TplFolderEventOptions;
begin
  Options := [];
  Options := Options + [evt_RENAMEITEM];
  Options := Options + [evt_CREATE];
  Options := Options + [evt_DELETE];
  Options := Options + [evt_MKDIR];
  Options := Options + [evt_RMDIR];
  for p := 0 to 15 do begin
    inCopy[p] := false;
    FolderWatch[p] := tplFolderWatcher.Create(Application);
    FolderWatch[p].Tag := p;
    FolderWatch[p].OnChange := plFolderWatcher1Change;
    FolderWatch[p].StopWatch;
    FolderWatch[p].Options := Options;
    uList[p] := Tstringlist.Create;
  end;

 これで15個のplFolderWatcherがCreateされるはずです。そしてイベントが
発生すると、どのplFolderWatcherでイベントが発生してもplFolder1Changeが
呼ばれます。そこで

procedure TFrmSet.plFolderWatcher1Change(Sender: TObject; AEvent: Integer;
  BeforeFullPath, BeforeFileName, AfterFullPath, AfterFileName: String);
var
  ACaption : String;
  p : integer;
begin
    :
end;

として、個々のplFolderWatcherのTag値で何番目のplFolderWatcherから呼ば
れたか切り分けようとしています。ところが、実際はどのplFolderWatcher.Di
rectoryでイベントを起こしても、TComponent(Sender).Tagの値は有効になっ
ているplFolderWatcher配列の最後の番号しか返ってきません。
 たとえば、FolderWatch[0].DirectoryがD:\AAA、FolderWatch[0].Directory
がD:\BBBだとして、この二つがWatchStartしている場合、D:\AAAでもD:\BBBで
も帰ってくる値(Tagに設定したintreger)は'1'しか戻ってきません。
 もしかしてplFolderWatcherは複数使えないのでしょうか?

[4138] Re:plFolderWatcherについて返信 削除
2011/1/5 (水) 21:56:17 Mr.XRAY
▼ たてぐやさん

>  もしかしてplFolderWatcherは複数使えないのでしょうか?

あれっ?
う〜ん.テストしてみます.


[4139] Re2:plFolderWatcherについて返信 削除
2011/1/5 (水) 22:01:10 たてぐや
▼ Mr.XRAYさん

 一つ書き忘れていました。

var
  ACaption : String;
  p : integer;
begin
  p := TComponent(Sender).Tag  //ここでpに0〜15が入るはず
  Showmessage(IntToStr(p));
end;

 それとWatchStartは別の場所で行っています。

> あれっ?
> う〜ん.テストしてみます.


 いつもいつも済みません。

[4141] Re3:plFolderWatcherについて返信 削除
2011/1/6 (木) 21:49:57 Sara
▼ たてぐやさん Mr.XRAYさん こんばんは

以下のようにすると、希望どおり動くようです(テスト不足ですが・・・)

  TplFolderWatcher = class(TComponent)
  private
    { Private 宣言 }

    OwnerWindowProc   : TWndMethod;
    procedure WndProc(var msg: TMessage);

      ・
      ・


function TplFolderWatcher.StartWatch(Handle: HWND): Boolean;
      ・
      ・
begin
      ・
      ・
      ・
      ・
  //メッセージはオーナーが受取るので,オーナーのウィンドウプロシージャーを書換え
//  OwnerHandle := Handle;
//  if OwnerHandle <> 0 then begin
{
    OriginOwnerWndProc := Pointer(SetWindowLong(OwnerHandle,
                                  GWL_WNDPROC,
                                  LongInt(Addr(OwnerWndProc))));
}

   OwnerWindowProc := (Owner as TWinControl).WindowProc;
   (Owner as TWinControl).WindowProc := WndProc;

    //監視開始
    uIID := SHChangeNotifyRegister1(Handle,
                                   FSources,
                                   fEvents,
                                   WM_PLCHANGENOTIFY,
                                   1,
                                   Entry);
    Result := uIID <> 0;
//  end;

  CoTaskMemFree(PItemID);
end;


procedure TplFolderWatcher.StopWatch;
begin
  //オーナのウィンドウプロシージャーを元に戻しておく
  if OriginOwnerWndProc <> nil then begin
     (Owner as TWinControl).WindowProc := OwnerWindowProc;
    OriginOwnerWndProc := nil;
  end;
  WM_PLCHANGENOTIFY := 0;

  if uIID <> 0 then SHChangeNotifyDeregister1(uIID);
  Malloc := nil;
end;


procedure TplFolderWatcher.WndProc(var msg: TMessage);
type
  TPItemIDListArray = array of PItemIDList;
  PPItemIDListArray  = TPItemIDListArray;

var
  PItemIDBefore : PItemIDList;
  PItemIDAfter  : PItemIDList;
  PathBefore    : String;
  PathAfter     : String;
  Event         : Integer;
begin
  if msg.Msg = WM_PLCHANGENOTIFY then begin

    //メッセージの種類
    Event := msg.lParam;

    //変更前のファイルフォルダの項目識子(デスクトップ基準)
    //PItemIDs[0]には処理したファイルの名前が,[1]は操作の種類によって異なる
    PItemIDBefore := ILClone(TPItemIDListArray(msg.WParam)[0]);

    //変更後のファイルフォルダの項目識別子(デスクトップ基準)
    PItemIDAfter := ILClone(TPItemIDListArray(msg.WParam)[1]);

    //それらの項目識別子をフルパスに変換
    PathBefore := GetDispNameFromPItemID(sfDesktop, PItemIDBefore, SHGDN_FORPARSING);
    PathAfter  := GetDispNameFromPItemID(sfDesktop, PItemIDAfter,  SHGDN_FORPARSING);


    //何故か、関係ないはずのFolderWatchも通るのでとりあえず、判定(^^;
    //Directoryの指定内容によっては、これでは問題があるので変更してください。
    if pos(Self.Directory,PathBefore) > 0 then begin

      if Assigned(FOnChange) then begin
        FOnChange(Self,
                                Event,
                                PathBefore,
                                ExtractFileName(PathBefore),
                                PathAfter,
                                ExtractFileName(PathAfter));
      end;
    end;

    CoTaskMemFree (PItemIDBefore);
    CoTaskMemFree (PItemIDAfter);
  end;
  OwnerWindowProc(Msg);

end;


[4142] Re4:plFolderWatcherについて返信 削除
2011/1/6 (木) 22:00:54 たてぐや
▼ Saraさん

 こんなにコードを書いてテストしていただき、感謝に堪えません。今日はちょっと
時間が取れませんので週末に試してみます。ありがとうございました。

[4143] Re5:plFolderWatcherについて返信 削除
2011/1/7 (金) 00:05:22 Mr.XRAY
▼ たてぐやさん
▼ Saraさん

おおっ,Saraさん,サンクスです.
持つべきは....
先ほど,カラオケ大会から戻ってきました.

>    //何故か、関係ないはずのFolderWatchも通るのでとりあえず、判定(^^;
>    //Directoryの指定内容によっては、これでは問題があるので変更してください。


そうなんですよね.フォルダ内のイベントを検出するAPIなんですが,
結構使い方は難しいですね.
といって,ネット上でよく見かけるFILE...なんとかだと検出できない
操作もありますし.

>   OwnerWindowProc := (Owner as TWinControl).WindowProc;
>   (Owner as TWinControl).WindowProc := WndProc;


そうか.WndProcを... なるほど.


[4145] Re6:plFolderWatcherについて返信 削除
2011/1/7 (金) 16:22:49 Sara
▼ Mr.XRAYさん ▼ たてぐやさん

あれ、OriginOwnerWndProc と OwnerWindowProcが間違ってますね・・・(^^;

procedure TplFolderWatcher.StopWatch;
begin
  //オーナのウィンドウプロシージャーを元に戻しておく
//  if OriginOwnerWndProc <> nil then begin
  if OwnerWindowProc <> nil then begin
     (Owner as TWinControl).WindowProc := OwnerWindowProc;
      OwnerWindowProc := nil;
//    OriginOwnerWndProc := nil;
  end;
  WM_PLCHANGENOTIFY := 0;

  if uIID <> 0 then SHChangeNotifyDeregister1(uIID);
  Malloc := nil;
end;

と、しておいてください。(^^;

[4146] Re7:plFolderWatcherについて返信 削除
2011/1/7 (金) 17:06:07 Mr.XRAY
▼ Saraさん

> と、しておいてください。(^^;

了解しました.では,そろそろ始めますか... (^^;


[4148] Re7:plFolderWatcherについて返信 削除
2011/1/7 (金) 22:34:57 たてぐや
▼ Saraさん

> と、しておいてください。(^^;

 修正してコンパイルしたのですが、
    //監視開始
    uIID := SHChangeNotifyRegister1(Handle,
                                   FSources,
                                   fEvents,
                                   WM_PLCHANGENOTIFY,
                                   1,
                                   Entry);

 「SHChangeNotifyRegister1」が未定義となってしまいました。

[4149] Re8:plFolderWatcherについて返信 削除
2011/1/7 (金) 23:34:35 Mr.XRAY
▼ たてぐやさん

>  「SHChangeNotifyRegister1」が未定義となってしまいました。

あれっ? ちょっと待ってください.


[4151] Re8:plFolderWatcherについて返信 削除
2011/1/7 (金) 23:49:46 Sara
▼ たてぐやさん Mr.XRAYさん こんばんは

>  修正してコンパイルしたのですが、
>     //監視開始
>     uIID := SHChangeNotifyRegister1(Handle,
>                                    FSources,
>                                    fEvents,
>                                    WM_PLCHANGENOTIFY,
>                                    1,
>                                    Entry);
>
>  「SHChangeNotifyRegister1」が未定義となってしまいました。


あぁ、ごめんなさい、SHChangeNotifyRegisterにしてください。
SHChangeNotifyRegister1は私が勝手に定義して使っているだけです。
LoadLibraryで・・・(^^;

[4188] Re9:plFolderWatcherについて返信 削除
2011/1/8 (土) 22:51:37 たてぐや
▼ Saraさん

> あぁ、ごめんなさい、SHChangeNotifyRegisterにしてください。
> SHChangeNotifyRegister1は私が勝手に定義して使っているだけです。


 やはりそれでよかったのですね。ありがとうございます。安心しました。
 で、インストールしなおして使ってみました。まず自作のアプリでは「無効
なクラス型キャスト」というエラーがplFolderWatchStartで発生してしまいま
した。多分他でSHFileoperationを使っていて、それが影響しているのでは、と
想像しています。Mr.XRAYさんのサンプルプロジェクトではうまく動きました。
今まで、テキストファイルを上書き保存したときに、最初の一度しかUPDATEDIR
が出なかったのですが。入れ替えてから保存するたびに毎回出るようになりま
した。だけれども、監視フォルダに新しいファイルを作った時にCREATEが二度
出るようになりました。
 自作アプリの方はそんな状態なので、まだTag値が帰ってくるかどうかの確認
はできていません。
 お礼と中間報告でした。

[4189] Re10:plFolderWatcherについて返信 削除
2011/1/8 (土) 23:05:57 Mr.XRAY
▼ たてぐやさん,どうも.

まだSaraさんから頂いたコードの組み込みやっていません (^^;

> した。だけれども、監視フォルダに新しいファイルを作った時にCREATEが二度
> 出るようになりました。


元々あのAPIだと,よくわからなのですが,2回発生するようです.
ただし,UPDATEDIRは1回しか発生しない場合もあります.
また,新規作成や削除の数が多いと,最初にCREATEあるいはDELETEが数回
発生して,その後は全てUPDATEDIRとなるようです.
結構ややこしい仕様になっています.


[4190] Re11:plFolderWatcherについて返信 削除
2011/1/8 (土) 23:10:58 たてぐや
▼ Mr.XRAYさん

> 元々あのAPIだと,よくわからなのですが,2回発生するようです.
> ただし,UPDATEDIRは1回しか発生しない場合もあります.


 なるほど、元々そういう仕様でしたか。だいぶ悩みましたが。

> また,新規作成や削除の数が多いと,最初にCREATEあるいはDELETEが数回
> 発生して,その後は全てUPDATEDIRとなるようです.
> 結構ややこしい仕様になっています.


 これは使いこなすのが少々大変かもしれませんですね。


[4191] Re12:plFolderWatcherについて返信 削除
2011/1/8 (土) 23:50:02 Mr.XRAY
▼ たてぐやさん

>  これは使いこなすのが少々大変かもしれませんですね。

だと思います.あの監視コンポは,単に変更のメッセージを捕捉するだけ,
という感じなんです.
昔からある同種のコンポに比べれば,ほとんどのメッセージが捕捉できますし,
アプリへの負担もほとんどないですね.
また,特殊フォルダや,仮想フォルダ等も対象とすることができます.

例えば,「マイコンピュータ」はドライブ関係ですが,USBの抜き差しも
検出できます.


[4193] Re11:plFolderWatcherについて返信 削除
2011/1/9 (日) 21:11:36 Mr.XRAY
▼ たてぐやさん,どうも.

> 元々あのAPIだと,よくわからなのですが,2回発生するようです.

これは発生しないように,いえ,イベントが発生しないようにしてみた
いと思います.
Saraさんからいただいたコードなんですが,今見ていました.
実は,他のコンポでも同じ様なことをしているので悩んでいます.
修正版は,ちょっとお待ちくださいませ.

# ちょっとポカでしたね.う〜む.

[4194] 修正版UP返信 削除
2011/1/10 (月) 13:38:24 Mr.XRAY
> 修正版は,ちょっとお待ちくださいませ.

大変お待たせしました.
修正版アップしました.
UPの前に少しコンポ内部の説明をカキコしたのですが,削除しました.


[4195] Re:修正版UP返信 削除
2011/1/10 (月) 13:40:26 Mr.XRAY
動作確認は以下のようなコードでやっています.

var
  FolderWatch : array[0..15] of TplFolderWatcher;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
begin
  for i := 0 to 2 do begin
    FolderWatch[i].StartWatch(Handle);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  p : integer;
  Options : TplFolderEventOptions;
begin
  Options := [];
  Options := Options + [evt_RENAMEITEM];
  Options := Options + [evt_CREATE];
  Options := Options + [evt_DELETE];
  Options := Options + [evt_MKDIR];
  Options := Options + [evt_RMDIR];
  for p := 0 to 2 do begin
    FolderWatch[p] := tplFolderWatcher.Create(Self);
    FolderWatch[p].Tag := p;
    FolderWatch[p].OnChange := plFolderWatcher1Change;
    FolderWatch[p].Options := Options;
  end;
  FolderWatch[0].Directory := 'D:\0000';
  FolderWatch[1].Directory := 'D:\AAA';
  FolderWatch[2].Directory := ExtractFileDir(Application.ExeName);
end;

procedure TForm1.plFolderWatcher1Change(Sender: TObject; AEvent: Integer;
  BeforeFullPath, BeforeFileName, AfterFullPath, AfterFileName: string);
begin
  Memo1.Lines.Add(IntToStr(TplFolderWatcher(Sender).Tag) + '   ' +
                  BeforeFullPath);
end;

追記:
このコードをそのままテストしてみようという方は,usesにplFolderWatcherが
必要です.また,Formには,TMemoとTButtonを1つづつ配置します.



[4196] Re:修正版UP返信 削除
2011/1/10 (月) 18:23:57 たてぐや
▼ Mr.XRAYさん

> 大変お待たせしました.
> 修正版アップしました.
> UPの前に少しコンポ内部の説明をカキコしたのですが,削除しました.


 ありがとうございます。昨日は1日外出、今日は来客があり、そのすきを見
つけてやっとパソコンに向かったところです。明日以降、試してみます。

[4199] Re:修正版UP返信 削除
2011/1/10 (月) 21:16:28 たてぐや
▼ Mr.XRAYさん

> 大変お待たせしました.
> 修正版アップしました.


 今やっと動作を確認できました。期待通りの動作を得られました。
 ただ、これを利用させていただこうとしている自作アプリでは、
なぜか「無効なクラス型キャスト」というエラーが
   OwnerWindowProc := (Owner as TWinControl).WindowProc;
の行で発生していまい、うまく動きません。これは自作アプリ側の
問題なんだろうと思い、いじってみています。


[4200] Re2:修正版UP返信 削除
2011/1/10 (月) 21:41:58 Mr.XRAY
> なぜか「無効なクラス型キャスト」というエラーが
>    OwnerWindowProc := (Owner as TWinControl).WindowProc;
> の行で発生していまい、うまく動きません。これは自作アプリ側の
> 問題なんだろうと思い、いじってみています。



あっ,ちょっと待ってください.
思い当たる節ありです.


[4201] Re3:修正版 再UP返信 削除
2011/1/10 (月) 22:09:59 Mr.XRAY
スミマセン.
今,再しました.
ちょっと遅くなってしまったのであせってしまいました.

コンポのCreateのOwnerをSelfでテストしていました.
FolderWatch[p] := tplFolderWatcher.Create(Self);

Self --> nil でテストするのを忘れていました.


[4202] Re4:plFolderWatcherについて返信 削除
2011/1/11 (火) 19:51:13 たてぐや
▼ Saraさん
▼ Mr.XRAYさん こんばんは

 おかげさまで希望通りの動作を得ることができました。

>     //何故か、関係ないはずのFolderWatchも通るのでとりあえず、判定(^^;

 ここが気になっています。関係ないはずのものもイベントが発生しますね。
配列定義した数だけ呼ばれてしまいます。ここはちょっとセコいですが、
BeforFullpathとDirectoryを比較して判断するしかないのでしょう。


[4203] Re5:plFolderWatcherについて返信 削除
2011/1/11 (火) 21:50:01 Mr.XRAY
▼ たてぐやさん

>  ここが気になっています。関係ないはずのものもイベントが発生しますね。
> 配列定義した数だけ呼ばれてしまいます。ここはちょっとセコいですが、


今回の修正で,
う〜む.気にはなっていたのですが.
やっぱり変ですか... 変ですよね.直しますか...  (^^;
今度は少し慎重にいくことにします.


[4204] Re6:plFolderWatcherについて返信 削除
2011/1/11 (火) 22:08:57 たてぐや
▼ Mr.XRAYさん

> やっぱり変ですか... 変ですよね.直しますか...  (^^;

 それと、もうひとつ気付いたことを。監視フォルダ内にテキストファイルを
作ります。この時には当然CREATEでファイル名フルパスが帰ってきます。で、
そのテキストファイルをエディタで編集して上書き保存します。多分UPDATEITEM
が帰ってくるような気がしますが、実際はUPDATEDIRで帰ってきます。いろいろ
試してみたのですが、UPDATEITEMが帰ってくる操作は見つからなかったんですけ
ど、これはAPIがそういう仕様なのでしょうか?

[4205] Re7:plFolderWatcherについて返信 削除
2011/1/11 (火) 22:33:30 Mr.XRAY
▼ たてぐやさん

修正しました.今UPしました.

> が帰ってくるような気がしますが、実際はUPDATEDIRで帰ってきます。

これはUPDATEDIRですね.
UPDATEITEMが帰ってくる操作はありますが,失念しました.
前に調べたときに書いておいたのがあったハズなんでが,今みたら
見つかりません.

> ど、これはAPIがそういう仕様なのでしょうか?

ということですね.フォルダ監視のところにイベントの表がありますが,
この表の説明は,MSDNのを私が訳しただけで,実態に我々が考える,直感的
に感じるものと一致しない場合があるようです.
UPDATEDIRが発生する内容は結構多いようです.これまでの観測では.


[4206] Re8:plFolderWatcherについて返信 削除
2011/1/11 (火) 22:37:34 Mr.XRAY
▼ たてぐやさん

> UPDATEITEMが帰ってくる操作はありますが,失念しました.

今,こんなメモを見つけました.
テスト中のプログラムの記述です.

-------------  引用開始 ------------------------------------------------
//  SHCNE_UPDATEITEMは操作しないこと
//  このイベントを処理すると,更にSHCNE_UPDATEITEMが発生して循環してしまう
-------------  引用終わり ------------------------------------------------

で,この手元のコードでは,SHCNE_UPDATEITEMの処理を削除しています.

では,これで.
実は,夕方から「解決まではあと6人」を読んでいるんです(笑).


[4209] Re8:plFolderWatcherについて返信 削除
2011/1/11 (火) 23:39:53 Mr.XRAY
▼ たてぐやさん
> 修正しました.今UPしました.

たんですが,1つ注意が,
StartWatchメソッドの引数がなくなりました.いやなくしました.
今回の修正で必要なくりなりましたので.


[4210] Re9:plFolderWatcherについて返信 削除
2011/1/12 (水) 12:27:01 Mr.XRAY
> たんですが,1つ注意が,
> StartWatchメソッドの引数がなくなりました.いやなくしました.
> 今回の修正で必要なくりなりましたので.


この仕様なんですが,例えばListViewにファイル一覧を表示したとします.
フォルダ監視を配置して,そのフォルダ内を監視する時,そのListViewの
ハンドルを指定して,メッセージ処理,という考えたんです.

もし,複数のListViewを配置して,その各々にフォルダ監視コンポを配置
した場合,各々のウィンドウ(ハンドル)を指定すれば...
ということを想定しました.

今回の複数のフォルダ監視コンポ生成のテストをしてみて,
あれっ!? と思ったわけです.
動作そのものは,極めて単純なのですが,どうして中々...
ちゃんとテストしないからだろう,
と言われてしまえばそれまでなんですが.(^^;

以上,言い分けでした.


[4211] Re9:plFolderWatcherについて返信 削除
2011/1/12 (水) 15:35:09 たてぐや
 ▼ Mr.XRAYさん

> 修正しました.今UPしました.

 さっそくインストールしなおしたのですが、今度は監視フォルダに作成した
ファイルを編集してもUPDATEDIRすら来なくなりました。


[4212] Re10:plFolderWatcherについて返信 削除
2011/1/12 (水) 16:05:37 Mr.XRAY
▼ たてぐやさん

>  さっそくインストールしなおしたのですが、今度は監視フォルダに作成した
> ファイルを編集してもUPDATEDIRすら来なくなりました。


ひぇ〜 ???


[4213] Re11:plFolderWatcherについて返信 削除
2011/1/12 (水) 16:11:57 Mr.XRAY
> > ファイルを編集してもUPDATEDIRすら来なくなりました。

今,ダウンロードしたソースコードでテストしてみましたが,
[4195] のコードで動作しているようです.


[4214] Re10:plFolderWatcherについて返信 削除
2011/1/12 (水) 16:18:25 Mr.XRAY
▼ たてぐやさん

>  さっそくインストールしなおしたのですが、今度は監視フォルダに作成した
> ファイルを編集してもUPDATEDIRすら来なくなりました。


これ,例えばテキストファイルの中身を編集した場合ですよね.
たしかに[4195] のテストコードでは検出できませんでした.

  Options := Options + [evt_UPDATEDIR];

追加したら検出できました.


[4215] Re11:plFolderWatcherについて返信 削除
2011/1/12 (水) 16:19:32 Mr.XRAY
▼ Mr.XRAYさん
> ▼ たてぐやさん
>
> >  さっそくインストールしなおしたのですが、今度は監視フォルダに作成した
> > ファイルを編集してもUPDATEDIRすら来なくなりました。
>
> これ,例えばテキストファイルの中身を編集した場合ですよね.
> たしかに[4195] のテストコードでは検出できませんでした.
>
>   Options := Options + [evt_UPDATEDIR];
>
> 追加したら検出できました.

ハズしていたらゴメンなさい.


[4218] Re12:plFolderWatcherについて返信 削除
2011/1/14 (金) 23:01:23 Mr.XRAY
現状報告です.
進展なし(笑)


[4219] Re13:plFolderWatcherについて返信 削除
2011/1/15 (土) 18:17:21 たてぐや
▼ Mr.XRAYさん
> 現状報告です.
> 進展なし(笑)


 済みません。一昨日からひどい風邪にやられてしまって、いろいろ滞ってい
ました。テキストファイルを編集したような場合、Optionsに追加することで
帰ってくるようになりました。だけれどもこれ、監視フォルダのトップしか帰っ
てこないんですね。更新されたファイル名まで得られるといいのですが…

[4221] Re14:plFolderWatcherについて返信 削除
2011/1/15 (土) 22:19:46 Mr.XRAY
▼ たてぐやさん

>  済みません。一昨日からひどい風邪にやられてしまって、

今はやっていますね.お大事に.
時間が許せば「睡眠に勝る療法なし」なんですけどね.なかなか.

> ました。テキストファイルを編集したような場合、Optionsに追加することで
> 帰ってくるようになりました。だけれどもこれ、監視フォルダのトップしか帰っ
> てこないんですね。更新されたファイル名まで得られるといいのですが…


確かに,このAPIではできないようです.
Vista以降ですと,新らしいインターフェイスがあるらしいです.
確認はしていませんが,できたとしても,Vista以降で,Delphi 2010
以降となってしまいますね.


[4222] Re15:plFolderWatcherについて返信 削除
2011/1/16 (日) 21:15:46 たてぐや
▼ Mr.XRAYさん
> 今はやっていますね.お大事に.
> 時間が許せば「睡眠に勝る療法なし」なんですけどね.なかなか.


 ありがとうございます。木曜日、起きたら頭はくらくらするし、身体はふら
つくしで休暇を取りました。金・土となんとかこなして今日日曜日は一日寝て
食べてまた寝るという自分的には許せない一日(何なん振りだろう…)を過ご
したらどうにか復活してきました。まだ少し咳が出るものの頭はクリアになっ
てきました。
 寒い日が続きます。みなさんもお気を付けくださいね。

[4220] Re13:plFolderWatcherについて返信 削除
2011/1/15 (土) 20:30:32 Sara
▼ Mr.XRAYさん こんばんは


 //ファイルやフォルダ名の変更等は同じイベントが2回以上くることがある
 //イベントや名前が前とおなじだった場合はOnChangeイベントに送らない
ここの判定なんですが、時間も取得して前回時間と今回時間がある程度離れて
いるようなら、イベントを起こしたほうが良いかと・・・

例えば、aというフォルダを監視中にその中のa1というテキストファイルを
編集して何度か保存を行った場合、最初の1回しかUpdateItemが発生しませんよね・・・

どうでしょう?

(間隔は1〜2秒程度で良いかな)


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82