喫茶XRAYトップページ

[スレッド全体
]

[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 でテストするのを忘れていました.


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