クリップボードからFormに貼り付け

解決


DelDel  2007-10-10 06:48:17  No: 27978

教えてください
今、wordとExcelからクリップボードにコピーしたデータを
メタファイル形式でFormに表示するプログラムを作成中で、
コピーしたデータとFormの大きさが同じになるようにしたいのですが。

wordは

public
  Meta_F    : TMetaFile;
procedure TForm1.Button1Click(Sender: TObject);
begin

  if Clipboard.HasFormat(CF_ENHMETAFILE) = False then
  begin
    showmessage('貼り付けファイルが存在しません');
    Exit;
  end;
  Clipboard.Open;

  Meta_F.LoadFromClipboardFormat
          (CF_ENHMETAFILE,Clipboard.GetAsHandle(CF_ENHMETAFILE), 0);
  //メタファイルの大きさをフォームに
  Form1.Height := Meta_F.Height;
  Form1.Width  := Meta_F.Width;

  Clipboard.Close;

  Refresh;
end;

でコピーした大きさでちゃんと表示されるのですが、
Excelではちゃんとした大きさでは表示されません。
これは、エクセルとワードではメタファイルのWidth値とHeight値の取得方法が異なる方法で取得しなければいけないんでしょうか?

エクセルをコピーし、Formにメタファイルで表示するときに、コピーした大きさで表示されるようにするには、どうしたらよいのですか?

ご教授お願いします。


Mr.XRAY  URL  2007-10-11 08:22:17  No: 27979

>Excelではちゃんとした大きさでは表示されません。

エクセルワードでは画像の保持の仕組みが違います.
また,バージョンによっても違うことがあります.

例えばえばクリップボードのサイズから取得してみてはいかがですか.

MetaClip : TMetaFile;

とか定義しておいて

MetaClip.Assign(Clipboard);

で取得して

Height := MetaClip.Height;
Width  := MetaClip.Width;

どうなるかは責任もてませんが....

具体例は,残念ながらFormに対してではありませんが,
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_Clipboard.htm


Mr.XRAY  URL  2007-10-11 09:30:54  No: 27980

>例えばえばクリップボードのサイズから取得してみてはいかがですか.

スミマセンね.
LoadFromClipboardFormatではなく,Assignではどうかという意味です.
違いについては....


DelDel  2007-10-11 20:22:06  No: 27981

>>Mr.XRAYさん
アドバイスありがとうございます!
Mr.XRAYさんの例で試したのですが、やはり上手くいきませんでした・・・

自分なりに、これでいいかなぁ〜・・・
ってな所まで何とか表示できるようになりました。

追加したのは、縦・横の論理インチを求めて
MMWidthプロパティ * 論理インチ(X) ÷  2540
MMHeightプロパティ * 論理インチ(Y) ÷  2540  
から
WidthプロパティとHeightプロパティを求める方法をとりました

これで良いのかどうかはわからないですが、とりあえず望んでいたような形にはなりましたので解決としときます。

procedure TForm1.Button1Click(Sender: TObject);
var
  xlinch : integer;
  ylinch : integer;
begin

  if Clipboard.HasFormat(CF_ENHMETAFILE) = False then
  begin
    showmessage('貼り付けファイルが存在しません');
    Exit;
  end;

//**追加**
  xlinch := GetDeviceCaps(Canvas.Handle, LOGPIXELSX);
  ylinch := GetDeviceCaps(Canvas.Handle, LOGPIXELSY);
//**追加**

  Clipboard.Open;

  Meta_F.LoadFromClipboardFormat(CF_ENHMETAFILE,
             Clipboard.GetAsHandle(CF_ENHMETAFILE), 0);
  //メタファイルの大きさをフォームに

//**追加**
  meta_f.Width  := int64(meta_f.MMWidth * xlinch) div 2540;
  meta_f.Height := int64(meta_f.MMHeight * ylinch) div 2540;
//**追加**

  Form1.Height := Meta_F.Height;
  Form1.Width := Meta_F.Width;

  Clipboard.Close;

  Refresh;
end;


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

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






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