Excelからのクリップボード更新イベントで処理をするとエラーメッセージが出てしまう

解決


maco  2005-09-14 23:17:58  No: 17566

・クリップボードが更新された時のイベントを取得する
  http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=10#0209.txt

上記URLに掲載されているサンプルを利用し、
Excelでのクリップボード更新イベントで処理を行なおうとしています。

しかし、クリップボード更新イベント内の処理で、
処理の度に「クリップボードが開けません」といったエラーメッセージが表示されます。

メモ帳などからのクリップボード更新イベントでは
エラーメッセージは表示されません。

またクリップボード更新イベントでなく、
Delphi内のイベント(クリックなど)で処理をすると、エラーは出ません。

何かよい解決方法はないでしょうか?
お知恵をお貸しください。
よろしくお願いします。


maco  2005-09-14 23:31:33  No: 17567

追加です。

このサイトの
Delphi > 過去のTIPS集 > 特選サンプル集 > クリップボードを監視する
に サンプルプログラムがあります。
http://madia.world.coocan.jp/delphi/Tokusen/HookClip.lzh

このサンプルは先ほどの方法と同じ方法で作られています。
このサンプルでも、Excelでコピーを行なうと、
「クリップボードを開くことが出来ません.」とエラーメッセージが出ます。


anone  2005-09-15 01:07:13  No: 17568

両方とも ClipboardViewer ですよね。それって、クリップボードの内容が変更された
ことを検出するだけですから、Open できるかどうかとはまったく関係ないです。

単独で Button1Click で Open 出来るかどうか試してみたらいいと思います。
出来なければ Excel が Close してないのかもしれません。


anone  2005-09-15 01:09:39  No: 17569

> Delphi内のイベント(クリックなど)で処理をすると、エラーは出ません。

あっ、トライしてるんですね。じゃ、タイミングの問題でしょう。検出してから
Sleep(1000) とかしてから、Open してみては?


maco  2005-09-15 17:41:51  No: 17570

anoneさん、ありがとうございます。

procedure TForm1.WMDrawClipboard(var Msg: TWMDrawClipboard);
begin
  Sleep(500);
  //クリップボード更新イベントでの処理
  …
end;

とSleepを噛ませることで、
「クリップボードを開くことが出来ません」というメッセージは出なくなりました。

ただSleepの有無に関わらず、Excelからデータをコピーすると、
更新イベントが複数回発生します。
上記のサンプルプログラムでも複数回処理されることが確認できます。

Excelのデータを一回のコピーすると更新イベントが複数回発生する現象は、
何故起こるのでしょうか?


anone  2005-09-16 22:53:10  No: 17571

> Excelのデータを一回のコピーすると更新イベントが複数回発生する現象は、
> 何故起こるのでしょうか?

さぁ、知りませんが、Excel の方の仕様なんじゃないですか。
TTimer と Boolean な変数ひとつで解決できそうですね。


maco  2005-09-17 11:48:35  No: 17572

anoneさん、回答ありがとうございます。

anoneさんの言われるように、Excelの仕様なのでしょうね。


maco  2005-09-17 11:51:45  No: 17573

変数に前回データを格納しておき、それをチェックすることで、
一度のコピーで複数回発生するイベントを回避しました。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加