喫茶XRAYトップページ

[スレッド全体
]

[9823] TplPrevで描画開始原点を移動返信 削除
2016/4/25 (月) 12:11:47 Mr.XRAY
>(画面の(0,0)が,紙の印刷可能範囲の開始位置であれば分かりやすいかと...)

そのような仕様にすることは,絶対と言っていいほどありません !!
帳票類を作成する際,用紙の上端から,あるいは左端からというように作成できる
ようにしています.
そんなことしたら,プリンタドライバによって,印刷位置が狂ってしまいます.
TplPrev コンポは,プリンタドライバに関係なく,印刷の DPI (インチ当たりのドット数)
を意識しないで,0.1 mm 単位で印刷コードが書けるのが特徴なのですから.

印刷可能な領域の左上を原点 (0, 0) にしたいのであれば,
例えば,以下のようにできます.

//=============================================================================
//  用紙の印刷可能領域の左上を原点(0,0)とする方法
//
//  新規のプロジェクトに
//  TButtonと拙作のTplPrevコンポを配置
//
//  poLandscape等の定数名の使用にはusesにPrintersが必要
//
//  動作確認 Widnows 7 U64(SP1) + Delphi XE(UP1) Pro
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LOffsetX : Integer;
  LOffsetY : Integer;
  LLeft    : Integer;
  LTop     : Integer;
  LWidth   : Integer;
  LHeight  : Integer;
  LRect    : TRect;
begin
   //用紙の設定をA4縦方向の印刷とする
   plPrev1.plSetPrinter.PaperNumber := DMPAPER_A4;
   plPrev1.plSetPrinter.Orientation := poPortrait;

   //印刷用のコードを書く
   plPrev1.BeginDoc;
   try
     //------------------------------------------------------------------------
     //  描画原点移動のために追加した部分
     //------------------------------------------------------------------------

     //描画原点を描画可能の左上にするためのオフセット値
     //プリンタには物理的な誤差があるので少し値を調整
     //プリンタドライバによって調整する必要あり
     //用紙トレイへの用紙のセット状態と描画する内容にもよる
     LOffsetX := plPrev1.LeftOffset + 2;
     LOffsetY := plPrev1.TopOffset + 2;

     //これ以降は,用紙の描画可能領域の左上が(0, 0)となる
     SetViewPortOrgEx(plPrev1.Canvas.Handle, LOffsetX, LOffsetY, nil);
     //印刷の時も描画原点の移動が必要
     //これがないと用紙の左上が原点として印刷される
     plPrev1.PrintOffsetX := LOffsetX;
     plPrev1.PrintOffsetY := LOffsetY;
     //-------  描画原点移動のために追加した部分はここまで ------------------

     LLeft   := 0;
     LTop    := 0;
     LWidth  := 1000;
     LHeight := 700;
     LRect   := Rect(LLeft, LTop, LLeft + LWidth, LTop + LHeight);

     //上の座標設定値で四角形を描画
     plPrev1.Canvas.Pen.Color := clBlue;
     plPrev1.Canvas.Pen.Width := 70;
     plPrev1.Canvas.Rectangle(LRect);

     //線の描画は,線の太さの半分であることを確認するための描画
     //少し右と下に移動して,半分の太さで四角形を描画
     OffsetRect(LRect, 250, 250);
     plPrev1.Canvas.Pen.Width := plPrev1.Canvas.Pen.Width div 2;
     plPrev1.Canvas.Rectangle(LRect);
   finally
     plPrev1.EndDoc;
   end;
   //プレビュー表示開始
   plPrev1.ShowModal;
end;

↓ 実行結果

[9840] 解決です返信 削除
2016/4/27 (水) 23:57:48 Mr.XRAY
> >(画面の(0,0)が,紙の印刷可能範囲の開始位置であれば分かりやすいかと...)
>
> そのような仕様にすることは,絶対と言っていいほどありません !!
> 帳票類を作成する際,用紙の上端から,あるいは左端からというように作成できる
> ようにしています.
> そんなことしたら,プリンタドライバによって,印刷位置が狂ってしまいます.
> TplPrev コンポは,プリンタドライバに関係なく,印刷の DPI (インチ当たりのドット数)
> を意識しないで,0.1 mm 単位で印刷コードが書けるのが特徴なのですから.


この件につきましては,先ほど,以下のような返信メールを送りました.

>残念ですが,私の理解の及ぶところではありません. (※ 先方の文章が理解できないということです)
>で,私が添付したテストは無駄になったようですね. (※ 丁重に無視してくださいました)
>ゴミをお送りしまして,申し訳ありませんでした.   (※ 送ったのは上のコードではありません)
>今後もご健闘をお祈り致します.
>
># 既に解決済みということですので,返事は無用です.(※ お相手可能の限界です)


ということですので,この,用紙の印刷可能な領域の左上を描画の原点 (0, 0) と
する案はボツとさせて頂きます.
多くの賛成の方のレスがありましたが (ウソつけ !!),誠に申し訳ありません.
期待していた皆様方には,深くお詫び申し上げます m(_ _)m


[9845] Re:解決です返信 削除
2016/4/28 (木) 13:57:00 Mr.XRAY
> この件につきましては,先ほど,以下のような返信メールを送りました.

まっ,コミュニティの場でたまに見かける,よくある質問者のパターンです.
でも,前にも何回か書いていますが,何か月も質問関係のメールがこないことが
あるのに,来ると,不思議と同じようなのが続くんですよね.
何なんだろう ?

同じ職場とか,知人が意識的に... まさかね.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82