Mam's WebSite
建築CGパース住宅CGパース

Mamの覚書Q&A検索

トップページMamの覚書Q&A検索Delphi(いろいろ)⇒Q&A


大項目:「 Delphi 」 - 中項目:「 いろいろ 」

「 クリップボードの遅延レンダリング 」

クリップボードで遅延レンダリング(delayed rendering)を行うにはどうすればよいか。


回答

クリップボードにデータ0をセットすると
アプリケーションで貼り付け時にWM_RENDERFORMATメッセージが届きます。
WM_RENDERFORMATメッセージが届いたときに改めてデータを作成して
クリップボードにセットしてやれば動きます。

ソース

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure WMRF(var Msg: TMessage); message WM_RENDERFORMAT;
  public
    { Public 宣言 }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{ TForm1 }
 
procedure TForm1.WMRF(var Msg: TMessage);
var st: String;
    hg: HGlobal;
    pst: PChar;
begin
     //アプリケーションでテキストの貼り付け処理が行われると
     //本プロシージャが呼び出されます。
     //そこで実際のデータを遅延レンダリングします。
 
     //以下の変数に貼り付けたい文字列データを設定
     st := '貼り付ける文字列データです';
 
     hg := GlobalAlloc(GMEM_MOVEABLE, Length(st) + 1);
     pst := GlobalLock(hg);
     StrCopy(pst, PChar(st));
     GlobalUnlock(hg);
 
     OpenClipboard(Handle);
     EmptyClipboard;
     SetClipboardData(CF_TEXT, hg);
     CloseClipboard;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
//クリップボードに0のデータをセットする。
//こうすると、貼り付け時にWM_RENDERFORMATメッセージが送られてくる。
     OpenClipboard(Handle);
     EmptyClipboard;
     SetClipboardData(CF_TEXT, 0);
     CloseClipboard;
end;
 
end.


Mam's WebSite