・クリップボードが更新された時のイベントを取得する
http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=10#0209.txt
上記URLに掲載されているサンプルを利用し、
Excelでのクリップボード更新イベントで処理を行なおうとしています。
しかし、クリップボード更新イベント内の処理で、
処理の度に「クリップボードが開けません」といったエラーメッセージが表示されます。
メモ帳などからのクリップボード更新イベントでは
エラーメッセージは表示されません。
またクリップボード更新イベントでなく、
Delphi内のイベント(クリックなど)で処理をすると、エラーは出ません。
何かよい解決方法はないでしょうか?
お知恵をお貸しください。
よろしくお願いします。
追加です。
このサイトの
Delphi > 過去のTIPS集 > 特選サンプル集 > クリップボードを監視する
に サンプルプログラムがあります。
http://madia.world.coocan.jp/delphi/Tokusen/HookClip.lzh
このサンプルは先ほどの方法と同じ方法で作られています。
このサンプルでも、Excelでコピーを行なうと、
「クリップボードを開くことが出来ません.」とエラーメッセージが出ます。
両方とも ClipboardViewer ですよね。それって、クリップボードの内容が変更された
ことを検出するだけですから、Open できるかどうかとはまったく関係ないです。
単独で Button1Click で Open 出来るかどうか試してみたらいいと思います。
出来なければ Excel が Close してないのかもしれません。
> Delphi内のイベント(クリックなど)で処理をすると、エラーは出ません。
あっ、トライしてるんですね。じゃ、タイミングの問題でしょう。検出してから
Sleep(1000) とかしてから、Open してみては?
anoneさん、ありがとうございます。
procedure TForm1.WMDrawClipboard(var Msg: TWMDrawClipboard);
begin
Sleep(500);
//クリップボード更新イベントでの処理
…
end;
とSleepを噛ませることで、
「クリップボードを開くことが出来ません」というメッセージは出なくなりました。
ただSleepの有無に関わらず、Excelからデータをコピーすると、
更新イベントが複数回発生します。
上記のサンプルプログラムでも複数回処理されることが確認できます。
Excelのデータを一回のコピーすると更新イベントが複数回発生する現象は、
何故起こるのでしょうか?
> Excelのデータを一回のコピーすると更新イベントが複数回発生する現象は、
> 何故起こるのでしょうか?
さぁ、知りませんが、Excel の方の仕様なんじゃないですか。
TTimer と Boolean な変数ひとつで解決できそうですね。
anoneさん、回答ありがとうございます。
anoneさんの言われるように、Excelの仕様なのでしょうね。
変数に前回データを格納しておき、それをチェックすることで、
一度のコピーで複数回発生するイベントを回避しました。
ありがとうございました。
ツイート | ![]() |