いつも参考にさせていただきありがとうございます。
DELPHIのLineTo関数で描いた線や文字を他のアプリの画面に貼り付けたいのですが、方法がまったくわかりません。エクセルに貼り付けるにはOLE2とかでできる?みたいですが、これもよくわかりません。どなたかわかる人教えてください。
使用環境はDELPHI6パーソナルです。
どんな形で貼りたいのかがわかりません。
単純に
・ビットマップ
・メタファイル
を①クリップボートへコピー
もしくは、
②ソフトを呼び出して貼り付け。
③難しく
・OLE
など どちらか書くと解答がつくと思います。
①なら簡単です。
aさん。
ありがとございます。
可能であるならば、勉強も兼ねて
OLEでやってみたいです。
既にレスがあるように,どんな形式で,という問題もありますが,
取敢えず以下のコードで現象は確認できます.
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;
Mr.XRAYさん。
ありがとうございます。
すんなり、ワードに貼り付けることができました。
この方法ですとビットマップまたはメタファイルでワードに貼り付けたことになるのでしょうか?
できればOLEに挑戦してみたいです。
簡単なサンプルなどありませんか?
OLEは簡単に数行でサンプルを提示できるほど楽なものではありません。
勉強するのであれば
『DelphiによるCOM徹底活用 シェルプログラミング入門』
http://www.cmagazine.jp/bookreview/19990402.html
がサンプルつきで凄く分かりやすいと思います。
ですがこのサンプルでもテキストやビットマップを扱ってますので、
独自のOLEオブジェクトを作成するのであればもう一段階進んだ作業が必要です。少なくとも私には無理。
メラトニンさん。
ありがとうございます。
>『DelphiによるCOM徹底活用 シェルプログラミング入門』
現在この書籍は品切れみたいです。
この書籍以外でもいいのですが、独自のOLEオブジェクトに関するサンプルソース等を掲載しているホームページなどありませんか?
以前私も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徹底活用 シェルプログラミング入門』
>現在この書籍は品切れみたいです。
もう手に入らないんですね…もうボロボロ、大切に保管しとこ…
メラトニンさん。
ありがとうございます。
>私の知る限りDelphi&日本語で初心者向けに解説してくれるのは上の書籍しかしりません。
Delphiをはじめるのがチョッと遅かったです。トホホ。
>もう手に入らないんですね…もうボロボロ、大切に保管しとこ…
ほんとに残念です。
「TEditor」と「進め!中級プログラマー」あたりを調べてみます。
既にOLEと方針を決めておられるようですが・・
私はメタファイルに心惹かれマス。
Delphiだと TMetafileがあるので楽チンです。
いや、他アプリにどうやって渡すか、が問題であって、ファイル形式はどうでもいいと思いますが。
いや、ここでのメタファイルはオブジェクトの事であってファイルではないです。
「どうやって渡すか」の部分については、恥ずかしながら、ファイル経由かクリップボード経由しか思いつきません。
例えば描画したものをOfficeに貼り付ける場合、ベクトルか、ラスターか、という選択に対しての意見を述べたものです。
描いたものが線や文字列で出来ているなら、前者の方がベターであると思います(って当たり前ですね)
ウォレスさん。
ありがとうございます。
プログラム初心者のパーソナルです。
今日一日『OLE』をネット検索していましたが、やはり皆さんの言われる通り難解で私にはまったく理解不能でこの勉強は半分あきらめ状態です。
メタファイルの場合ですとビットマップ形式より画像がきれいだということがどこかのサイトに書いてありました。
メタファイルで貼り付け保存した図形を自作アプリに図形(座標)データとして読込み込むことが可能なのでしょうか?
的をはずした質問かもしれませんがプログラム初心者ということでお許しください。
anoneさん。
ありがとうございます。
ベクトルデータを他のアプリに貼り付ける場合、やはり『OLE』がいいのでしょうか?
『OLE』は情報がすくないのと私のスキルでは難しすぎて悩んでいます。
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
なぜOLEにこだわるのかわかりません。これから発展する技術でもないし、応用は
限られているので新しく勉強する価値はないです。
クリップボードの方がよほど汎用的かと思います。
>メタファイルの場合ですとビットマップ形式より画像がきれい
あまりに複雑で複雑で複雑な画像の場合、ビットマップにした方が軽くなって(≧∇≦)b 良い場合もあります。
ビットマップ形式でも充分な解像度を与えてやれば、キレイになりますし。
月並みですが、「目的に応じて使い分け」が肝要です。
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の図形を『メタファイル』での貼り付けするにはどのように行うのでしょうか?
> 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;
いかがかな?
ん?さん。
ありがとうございます。
できました!!
TPaintBoxに描画しているのと同じことをaCanvasに対して行えばいいわけですね。
>procedure Draw(aCanvas: TCanvas);
このメソッドを自分のアプリに対応させてみます。
解決までしばらく時間をください。
無事に組み込み作業が終了しました。
エクセル、ワードにコピーしてみたところ貼り付けて図形を拡大していくと図形の線が太くなるという現象がありましたが、満足しています。
みなさん。どうもありがとうございました。
詳細はよく分かりませんが、officeの描画オブジェクトに変換するという手順を踏めば、拡大したときに線の太さなどは変わりません。
WORD2000 の場合
形式を選択して貼り付け -> メタファイル の後、グループ解除する
PowerPoint2000 の場合
貼り付け -> グループ解除
のようにするとOKみたいです。
> 詳細はよく分かりませんが、officeの描画オブジェクトに変換するという手順を踏めば、拡大したときに線の太さなどは変わりません。
へ〜と思ってうちのソフトで、メタファイルコピーし、「形式を選択して貼り付け」しました。
そのまま拡大すると、線が太くなりましたが、グループ解除すると太くなりません。
ここまでは、パーソナルさん、ウォレスさんの報告の通り。
ただし、クリップボードに貼り付けたデータが、線、文字が複数ある図形だったため、
それらがすべて選択解除後にそれぞれ別の部品になってしまいました。
線は、一つの線分図形(という表現でいいのかな?)
全てを選択してサイズ変更しても、全体的な拡大になりませんでした。
それぞれの部品の相対的なサイズ変更になるからでしょう。
それじゃぁ・・・と思って再度グループ化したら、拡大しても線が太くならずに拡大できました。
なんだこりゃ?
などと、ゴミレスつけてみる。
2倍サイズのCanvasに、2倍の大きさで描画しておくと、拡大したときに太くなる現象が出るのを遅らせることができる気がします。
ウォレスさん。
ありがとうございます。
知らないことがたくさんありとても勉強になります。
助かります。
ちなみにWORD等には塗りつぶす色がありますが、貼り付けたメタファイルの背景色を自作アプリ側から操作するにはどうすればいいのでしょうか?
ん?さん。
色々情報ありがとうございます。
こちらではWORD98での報告ですが、グループ解除する を実行しましたが線の太さに何の変化も確認できませんでした。
拡大すれば線が太くなります。
>グループ解除する を実行しましたが線の太さに何の変化も確認できませんでした
おかしいですね・・・Word98といえど、メタファイル形式なら拡大したときに線の太さが変わらないようになる気がしますが。
Word98で試すのは無理そうです。
もしかしてMr.XRAYさんのサンプルで試していませんか?(そんなことはないですか・・・)
それと、「貼り付けた後、Wordを操作する」んですか?
既に最初の質問と大きく変わってますよね。
オブジェクトの色を変えるのなら、Canvas.Brushを調べてみてください。
それと、線の太さがこのように変化したとしてもなんら不都合はないのです。ただ報告ということで記述したしだいです。申し訳ありません。
>既に最初の質問と大きく変わってますよね。
大変申し訳ありません。
>アプリでもオブジェクトの色を変えるのなら、Canvas.Brushを調べてみてください。
自作アプリに組み込んだ状態でCanvas.Brush.ColorとFillRectを使ってみたのですが、背景は変化しませんでした。もう一度ん?さんにいただいたサンプルで確かめてみます。
本当にありかとうございました。
ウォレスさん。
ありがとうございます。
あれから他のアプリケーションでメタファイルをワードやエクセルに貼り付けてみました。同じように貼り付けたあとにマウスで図形を拡大したところ線が太くなり、図形を縮小すると線は細くなり元の太さにもどりました。
このような現象が他のアプリでも現れたのでこれはワードやエクセルの仕様だと思います。
それと、線の太さがこのように変化したとしてもなんら不都合はないのです。ただ報告ということで記述したしだいです。申し訳ありません。
>既に最初の質問と大きく変わってますよね。
大変申し訳ありません。
>アプリでもオブジェクトの色を変えるのなら、Canvas.Brushを調べてみてください。
自作アプリに組み込んだ状態でCanvas.Brush.ColorとFillRectを使ってみたのですが、背景は変化しませんでした。もう一度ん?さんにいただいたサンプルで確かめてみます。
本当にありかとうございました。
ツイート | ![]() |