DELPHIで描いた図形を他のアプリケーションに貼り付けるには?

解決


パーソナル  2005-07-03 03:23:59  No: 16140

いつも参考にさせていただきありがとうございます。
DELPHIのLineTo関数で描いた線や文字を他のアプリの画面に貼り付けたいのですが、方法がまったくわかりません。エクセルに貼り付けるにはOLE2とかでできる?みたいですが、これもよくわかりません。どなたかわかる人教えてください。
使用環境はDELPHI6パーソナルです。


a  2005-07-03 03:58:10  No: 16141

どんな形で貼りたいのかがわかりません。

単純に
・ビットマップ
・メタファイル
を①クリップボートへコピー
もしくは、
②ソフトを呼び出して貼り付け。

③難しく
・OLE

など  どちらか書くと解答がつくと思います。
①なら簡単です。


パーソナル  2005-07-03 04:18:52  No: 16142

aさん。
ありがとございます。
可能であるならば、勉強も兼ねて
OLEでやってみたいです。


Mr.XRAY  URL  2005-07-03 05:49:17  No: 16143

既にレスがあるように,どんな形式で,という問題もありますが,
取敢えず以下のコードで現象は確認できます.
FormにTImageとButtonをひとつづつ配置して下さい.
ボタンクリックの後,ワードでも起動して[貼付け]をして確認します.

//===================================================
//  取敢えずクリップ゛ードにコピー
//  ueseにClipbrdが必要
//===================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
     with Image1.Canvas do begin
       Pen.Width:=5;
       Pen.Color:=clRed;
       Rectangle(20,20,100,200);
     end;
     Clipboard.Assign(Image1.Picture);
end;


パーソナル  2005-07-03 17:58:51  No: 16144

Mr.XRAYさん。
ありがとうございます。
すんなり、ワードに貼り付けることができました。
この方法ですとビットマップまたはメタファイルでワードに貼り付けたことになるのでしょうか?

できればOLEに挑戦してみたいです。
簡単なサンプルなどありませんか?


メラトニン  2005-07-04 02:35:13  No: 16145

OLEは簡単に数行でサンプルを提示できるほど楽なものではありません。
勉強するのであれば
『DelphiによるCOM徹底活用 シェルプログラミング入門』
http://www.cmagazine.jp/bookreview/19990402.html
がサンプルつきで凄く分かりやすいと思います。
ですがこのサンプルでもテキストやビットマップを扱ってますので、
独自のOLEオブジェクトを作成するのであればもう一段階進んだ作業が必要です。少なくとも私には無理。


パーソナル  2005-07-04 18:31:04  No: 16146

メラトニンさん。
ありがとうございます。
>『DelphiによるCOM徹底活用 シェルプログラミング入門』
現在この書籍は品切れみたいです。
この書籍以外でもいいのですが、独自のOLEオブジェクトに関するサンプルソース等を掲載しているホームページなどありませんか?


メラトニン  2005-07-04 19:05:41  No: 16147

以前私もOLE関連をネット検索したことありますが、サンプルとして提示されてるものは少ないようです。
http://www.google.co.jp/search?q=IDataObject+Delphi+OLE&hl=ja&lr=lang_ja&c2coff=1&start=0&sa=N
上でぱっと調べた限りだとやっぱり「TEditor」と「進め!中級プログラマー」が引っかかりますね。
もっと、そのものずばりが欲しければソース付きの「OLE Drag&Dropコンポーネント」を探してそのソースを見てみたらいかがでしょうか?
・・・と言いつつ私はソースだけでは全く理解できませんでしたが。
私の知る限りDelphi&日本語で初心者向けに解説してくれるのは上の書籍しかしりません。お役に立てず申し訳ないです。

>>『DelphiによるCOM徹底活用 シェルプログラミング入門』
>現在この書籍は品切れみたいです。
もう手に入らないんですね…もうボロボロ、大切に保管しとこ…


パーソナル  2005-07-04 19:35:25  No: 16148

メラトニンさん。
ありがとうございます。
>私の知る限りDelphi&日本語で初心者向けに解説してくれるのは上の書籍しかしりません。
Delphiをはじめるのがチョッと遅かったです。トホホ。
>もう手に入らないんですね…もうボロボロ、大切に保管しとこ…
ほんとに残念です。

「TEditor」と「進め!中級プログラマー」あたりを調べてみます。


ウォレス  2005-07-05 01:29:24  No: 16149

既にOLEと方針を決めておられるようですが・・
私はメタファイルに心惹かれマス。

Delphiだと  TMetafileがあるので楽チンです。


anone  2005-07-05 02:22:42  No: 16150

いや、他アプリにどうやって渡すか、が問題であって、ファイル形式はどうでもいいと思いますが。


ウォレス  2005-07-05 02:34:40  No: 16151

いや、ここでのメタファイルはオブジェクトの事であってファイルではないです。
「どうやって渡すか」の部分については、恥ずかしながら、ファイル経由かクリップボード経由しか思いつきません。

例えば描画したものをOfficeに貼り付ける場合、ベクトルか、ラスターか、という選択に対しての意見を述べたものです。
描いたものが線や文字列で出来ているなら、前者の方がベターであると思います(って当たり前ですね)


パーソナル  2005-07-05 03:46:54  No: 16152

ウォレスさん。
ありがとうございます。
プログラム初心者のパーソナルです。
今日一日『OLE』をネット検索していましたが、やはり皆さんの言われる通り難解で私にはまったく理解不能でこの勉強は半分あきらめ状態です。

メタファイルの場合ですとビットマップ形式より画像がきれいだということがどこかのサイトに書いてありました。
メタファイルで貼り付け保存した図形を自作アプリに図形(座標)データとして読込み込むことが可能なのでしょうか?
的をはずした質問かもしれませんがプログラム初心者ということでお許しください。


パーソナル  2005-07-05 04:19:03  No: 16153

anoneさん。
ありがとうございます。
ベクトルデータを他のアプリに貼り付ける場合、やはり『OLE』がいいのでしょうか?
『OLE』は情報がすくないのと私のスキルでは難しすぎて悩んでいます。


poe  2005-07-05 04:55:02  No: 16154

OLE  COM 関連の説明として、こちらもあります。

http://www.geocities.co.jp/SiliconValley-SanJose/2560/delphi4/activex/OLE2.htm

http://www.geocities.co.jp/SiliconValley-SanJose/2560/delphi4/activex/index.htm


anone  2005-07-05 05:29:43  No: 16155

なぜOLEにこだわるのかわかりません。これから発展する技術でもないし、応用は
限られているので新しく勉強する価値はないです。

クリップボードの方がよほど汎用的かと思います。


ウォレス  2005-07-05 06:53:00  No: 16156

>メタファイルの場合ですとビットマップ形式より画像がきれい
あまりに複雑で複雑で複雑な画像の場合、ビットマップにした方が軽くなって(≧∇≦)b 良い場合もあります。
ビットマップ形式でも充分な解像度を与えてやれば、キレイになりますし。

月並みですが、「目的に応じて使い分け」が肝要です。


パーソナル  2005-07-05 18:21:26  No: 16157

poeさん。anoneさん。ウォレスさん。
ありがとうございます。

私自身この質問の中で『OLE』だの『ビットマップ』『メタファイル』などと、ころころ心変わりをしてしまい大変申し訳なく思っております。

手がけているのはDraw系のアプリです。
実際にやりいたいことは、ベクトルデータ(TPaintBoxにcanvasメソドを使って描いた任意の図形)をワードまたはエクセルに貼り付けたいのです。

『OLE』にこだわったわけではないのですが、Draw系のアプリのためこちらの方がいいのかなぁ?と思ったのです。ですが私の技量ではとても無理!です。現在あきらめています。

Draw系のアプリなので貼り付けに『メタファイル』と『ビットマップ』の両方の貼り付け機能を持たせてもいいかなぁと考えたりもします。

ちなみにMr.XRAYさんに書いていただいたソース
>//===================================================
>//  取敢えずクリップボードにコピー
>//  ueseにClipbrdが必要
>//===================================================
>procedure TForm1.Button1Click(Sender: TObject);
>begin
>     with Image1.Canvas do begin
>       Pen.Width:=5;
>       Pen.Color:=clRed;
>       Rectangle(20,20,100,200);
>     end;
>     Clipboard.Assign(Image1.Picture);
>end;
を    
TPaintBoxに図形を描画しているので
Clipboard.Assign(Form1.GetImage);で作動確認したのですが、
TPaintBoxの任意の領域をクリップボードにコピーするにはどうすればいいのでしょうか?

またTPaintBoxの図形を『メタファイル』での貼り付けするにはどのように行うのでしょうか?


ん?  2005-07-05 18:56:06  No: 16158

> TPaintBoxの図形を『メタファイル』での貼り付けするにはどのように行うのでしょうか?

厳密には貼り付けではないが、TPaintBoxのCanvasではなく、
TMetafileCanvasに描画する。

var
  myMetaFile: TMetaFile;
  myMetaCanvas: TMetafileCanvas;
begin
  myMetafile := TMetafile.Create;

  myMetafile.Width  := 300;
  myMetafile.Height := 300;

  //メタファイルキャンバスの作成:TMetafileCanvasのサイズはCreate時の
  //TMetafileのサイズになり、以降TMetafileのサイズを変えても無効
  myMetaCanvas := TMetafileCanvas.Create(myMetafile, 0);

  //描画
  //Canvasに対する描画を別メソッドにしておけば、引数に
  //TPaintBox.Canvas, TMetafileCanvas, TBitmap.Canvas と
  //いろいろ対応できるでしょう。
  Draw(myMetaCanvas);

  myMetaCanvas.Free;
  Clipboard.Assign(myMetafile);
  myMetafile.Free;
end;

//描画用メソッド
procedure Draw(aCanvas: TCanvas);
begin
  aCanvas.Pen.Width := 5;
  aCanvas.Pen.Color := clRed;
  aCanvas.Rectangle(20,20,100,200);
end;

いかがかな?


パーソナル  2005-07-05 19:43:03  No: 16159

ん?さん。
ありがとうございます。
できました!!
TPaintBoxに描画しているのと同じことをaCanvasに対して行えばいいわけですね。
>procedure Draw(aCanvas: TCanvas);
このメソッドを自分のアプリに対応させてみます。
解決までしばらく時間をください。


パーソナル  2005-07-06 01:58:50  No: 16160

無事に組み込み作業が終了しました。
エクセル、ワードにコピーしてみたところ貼り付けて図形を拡大していくと図形の線が太くなるという現象がありましたが、満足しています。
みなさん。どうもありがとうございました。


ウォレス  2005-07-06 03:13:52  No: 16161

詳細はよく分かりませんが、officeの描画オブジェクトに変換するという手順を踏めば、拡大したときに線の太さなどは変わりません。

WORD2000  の場合  
      形式を選択して貼り付け  ->  メタファイル  の後、グループ解除する

PowerPoint2000  の場合
      貼り付け  ->  グループ解除

のようにするとOKみたいです。


ん?  2005-07-06 03:43:47  No: 16162

> 詳細はよく分かりませんが、officeの描画オブジェクトに変換するという手順を踏めば、拡大したときに線の太さなどは変わりません。

へ〜と思ってうちのソフトで、メタファイルコピーし、「形式を選択して貼り付け」しました。
そのまま拡大すると、線が太くなりましたが、グループ解除すると太くなりません。
ここまでは、パーソナルさん、ウォレスさんの報告の通り。

ただし、クリップボードに貼り付けたデータが、線、文字が複数ある図形だったため、
それらがすべて選択解除後にそれぞれ別の部品になってしまいました。
線は、一つの線分図形(という表現でいいのかな?)
全てを選択してサイズ変更しても、全体的な拡大になりませんでした。
それぞれの部品の相対的なサイズ変更になるからでしょう。
それじゃぁ・・・と思って再度グループ化したら、拡大しても線が太くならずに拡大できました。
なんだこりゃ?

などと、ゴミレスつけてみる。

2倍サイズのCanvasに、2倍の大きさで描画しておくと、拡大したときに太くなる現象が出るのを遅らせることができる気がします。


パーソナル  2005-07-06 04:16:43  No: 16163

ウォレスさん。
ありがとうございます。
知らないことがたくさんありとても勉強になります。
助かります。
ちなみにWORD等には塗りつぶす色がありますが、貼り付けたメタファイルの背景色を自作アプリ側から操作するにはどうすればいいのでしょうか?


パーソナル  2005-07-06 04:34:17  No: 16164

ん?さん。
色々情報ありがとうございます。
こちらではWORD98での報告ですが、グループ解除する  を実行しましたが線の太さに何の変化も確認できませんでした。
拡大すれば線が太くなります。


ウォレス  2005-07-06 08:06:39  No: 16165

>グループ解除する  を実行しましたが線の太さに何の変化も確認できませんでした
おかしいですね・・・Word98といえど、メタファイル形式なら拡大したときに線の太さが変わらないようになる気がしますが。
Word98で試すのは無理そうです。

もしかしてMr.XRAYさんのサンプルで試していませんか?(そんなことはないですか・・・)

それと、「貼り付けた後、Wordを操作する」んですか?
既に最初の質問と大きく変わってますよね。
オブジェクトの色を変えるのなら、Canvas.Brushを調べてみてください。


パーソナル  2005-07-06 09:11:14  No: 16166

それと、線の太さがこのように変化したとしてもなんら不都合はないのです。ただ報告ということで記述したしだいです。申し訳ありません。

>既に最初の質問と大きく変わってますよね。
大変申し訳ありません。
>アプリでもオブジェクトの色を変えるのなら、Canvas.Brushを調べてみてください。
自作アプリに組み込んだ状態でCanvas.Brush.ColorとFillRectを使ってみたのですが、背景は変化しませんでした。もう一度ん?さんにいただいたサンプルで確かめてみます。
本当にありかとうございました。


パーソナル  2005-07-06 09:28:18  No: 16167

ウォレスさん。
ありがとうございます。
あれから他のアプリケーションでメタファイルをワードやエクセルに貼り付けてみました。同じように貼り付けたあとにマウスで図形を拡大したところ線が太くなり、図形を縮小すると線は細くなり元の太さにもどりました。
このような現象が他のアプリでも現れたのでこれはワードやエクセルの仕様だと思います。
それと、線の太さがこのように変化したとしてもなんら不都合はないのです。ただ報告ということで記述したしだいです。申し訳ありません。

>既に最初の質問と大きく変わってますよね。
大変申し訳ありません。
>アプリでもオブジェクトの色を変えるのなら、Canvas.Brushを調べてみてください。
自作アプリに組み込んだ状態でCanvas.Brush.ColorとFillRectを使ってみたのですが、背景は変化しませんでした。もう一度ん?さんにいただいたサンプルで確かめてみます。
本当にありかとうございました。


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

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






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