教えてください
今、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にメタファイルで表示するときに、コピーした大きさで表示されるようにするには、どうしたらよいのですか?
ご教授お願いします。
>Excelではちゃんとした大きさでは表示されません。
エクセルワードでは画像の保持の仕組みが違います.
また,バージョンによっても違うことがあります.
例えばえばクリップボードのサイズから取得してみてはいかがですか.
MetaClip : TMetaFile;
とか定義しておいて
MetaClip.Assign(Clipboard);
で取得して
Height := MetaClip.Height;
Width := MetaClip.Width;
どうなるかは責任もてませんが....
具体例は,残念ながらFormに対してではありませんが,
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_Clipboard.htm
>例えばえばクリップボードのサイズから取得してみてはいかがですか.
スミマセンね.
LoadFromClipboardFormatではなく,Assignではどうかという意味です.
違いについては....
>>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;
ツイート | ![]() |