初めて書き込みします。
検索でここにたどり着きました。
XPにてTurboDelphi2006無料版とDelphi3を使用しています。
画像を正常に印刷出来ず困っています。
A4の用紙に、画像を印刷した場合、
左上端に2センチ四方に、縮小されて印刷されてしまいます。
用紙全体に写真を印字したいのですが、
何度試しても上記のエラーになり困っています。
初代DelphiやDelphi2等の参考書を元に、以下のコードで試したのですが、
正常に印刷されません。
XP環境では異なるコードでないと駄目なのでしょうか?
もし詳しい方がおりましたら、誰かご指南下さると助かります。
with printer do begin
begindoc;
canvas.Draw(0,0,image1.Picture.Bitmap);
enddoc;
end;
>何度試しても上記のエラーになり困っています。
>正常な動作です、プリンターの解像度に合わせて拡大しないといけません。
Mr.XRAYさんのホームページをご存じですか
http://mrxray.on.coocan.jp/Delphi/plPrev/index.htm
TPrinter を使って印刷すればいいのですよ。
詳しくはヘルプを見てください。
TPrinter の Canvas は
プリンターの解像度(800DPIとすれば)により余白無しの場合
A4(210mmx298mm)であれば
Printer.Canvas = 6614dot x 9354dot
のキャンバスが存在することになるなのです
つまり、6614x9354 のビットマップを印刷するとA4前面に印刷されます。
Printer.Canvas に ビットマップデータを
表示したい位置に拡大など好きなように行って印刷してください。
Win32APIにGetDeviceCapsがあり
これを使うとPrinterのPixels Per Inchが調べられます。
色々ありがとうございます、
早速試してみたいと思います。
コンポーネントは、昨日こちらでも過去検索で
NKPrinterというコンポーネントを見つけ、
早速インストールしてみました。
今日の夜にもTPRINTERで早速試してみます。
APIもありがとうございます、早速参考書で調べて使ってみたいと思います。
何故か仕事場のプリンタが動かなくなったので、自宅のMypcから試してます。
印刷プレビューコンポーネントは、
手持ちのdelphi3&無料版TurboDelphiでは使えませんでした;
NKPrinterは無事インストールできデモも問題なく使えました^^
が、TPrinterの使い方がまるで判りませんでした;;
無理やり下のように書いてみましたが、実行時エラーに・・・TT
自分にはまだ難しすぎというか力量不足でした^^;
コード例を載せてもらえると、ものすごく助かります^^。
var
p:TPrinter;
begin
with p do begin
begindoc;
canvas.Draw(0,0,image1.Picture.Bitmap);
enddoc;
end;
end;
無事解決しました^^。
過去トピックのコード例(全体画面を印刷するには?)を参考にしたところ、
無事印刷サイズを自由に変えられるようになりました。
ありがとうございます、助かりましたm(__)m。
プログラミングには色んな手法があるのですね^^。
Mr.XRAYです.
TS さん,紹介していただきありがとうごさいます.
「ありがとうございます」さん,こんにちは.
既に解決済みで,また用途も違うようですか,
>手持ちのdelphi3&無料版TurboDelphiでは使えませんでした;
拙作のコンポーネント類はDelphi5以上でないと使用できません.
プリンタ設定と印刷プレビュー制御コンポは,多少の(uses部等)を修正すれば
使用可能となりますが面倒です.
(Delphi3.1で使用している方もいらっしゃいます)
また,TurboDelphi2006(?)であれば使用可能です.
ただしTurboDelphi2006(?)では,コンポーネントのインストールはできません.
したがって,コンポーネントを実行時に生成して利用することになります.
もし必要な状況になった時にでも参考にしてください.
アドバイスありがとうございます、
質問者のDelphi大好きです。
お蔭様でソフトが完成しました^^!!
JPEGの使い方も、過去ログを参考にして学習させていただきました^^。
とても助かります。
delphi3.1でも使えるのですね^^
先ほどチャレンジしましたが、案の定挫折しました^^;。
気長にチャレンジしてみます^^。
TurboDelphi2006です^^。
無料版でも実行時生成で使えるのですね^^。
勉強になりますm(__)m。
最後になりますが、過去トピックを参考にして、
以下のコードで落ち着きました^^。
本当に助かりましたm(__)m。
それではありがとうございました^^。
var
Rect: TRect;
pheight,pwidth: integer;
begin
pheight := 4000 div image2.Height;
pwidth := 4000 div image2.Width;
pheight := image1.Height * pheight;
pwidth := image1.Width * pwidth;
Rect.Top := 0;
Rect.Left := 0;
Rect.Right := pwidth;
Rect.Bottom := pheight;
Printer.BeginDoc;
Printer.Canvas.StretchDraw(Rect, image1.Picture.Bitmap);
Printer.EndDoc;
end;
Mr.XRAYです.
>delphi3.1でも使えるのですね^^
変更修正は,ある程度コンポーネント作成の知識が必要です.
また,次回のバージョンアップでは,完全にDelphi6以降でないと利用できなります (^^;
使用しない方が無難でしょう(笑)
コード拝見しました,ほとんど同じですが,印刷プレビューコンポを使用したコードです.
実行時に生成して使用する方法にはバグがあります.特にプレビューフォームの
位置やサイズの設定に問題があります.
以下はプレビューをしない場合のコードです.
拙作コンポの宣伝ですね.
//=============================================================================
// 印刷プレビュー制御コンポーネントを実行時に生成して利用する方法
// プレビューしないですぐ印刷する場合
// Image1に表示しているビットマップ画像を印刷
//
// usesにplSetPrinter,plPrevが必要
// plSetPrinter.pasとplPrev.pasはバスの通った場所(フォルダ)に置いておくこと
// またpoLandscapeの使用にはusesにPrintersが必要
// TplPrevはVer 4.81以上を使用のこと
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
plPrev1 : TplPrev;
ARect : TRect;
ARatio : Double;
begin
//印刷プレビュー制御コンポーネントを生成
plPrev1 := TplPrev.Create(Self);
plPrev1.plSetPrinter := nil;
//プリンタや用紙の設定はここで行(ここでは用紙を横向き)
plPrev1.plSetPrinter.Orientation := poLandscape;
try
//描画コード開始
plPrev1.BeginDoc;
try
//印刷位置を設定
Image1.Picture.Width;
Image1.Picture.Height;
ARatio := Image1.Picture.Height/Image1.Picture.Width;
ARect.Left := 200; //印刷位置の左端(20mm)
ARect.Right := 1800; //印刷位置の右端(180mm)
ARect.Top := 300; //印刷位置の上端(30mm)
ARect.Bottom := Round((ARect.Right-ARect.Left)*ARatio)+ARect.Top;
plPrev1.StretchDrawBitmap(ARect,Image1.Picture.Bitmap);
finally
//描画コード終了
plPrev1.EndDoc;
end;
//プレビューしないですぐに印刷
plPrev1.Print;
finally
FreeAndNil(plPrev1);
end;
end;
ツイート | ![]() |