喫茶XRAYトップページ

[スレッド全体
]

[388] Re4:リッチエディットの印刷で悩んでいます返信 削除
2005/8/7 (日) 23:56:40 Andy
▼ Mr.XRAYさん
> ▼ Andyさん

> 切り取りをして、1ページ内ですると最終の位置がちゃんと出ませんでした。
> 文中に、次の行が表示されます。

ファイルをロードせずに、1行ずつ入力して、プレビューしました。
次の行の表示が一定間隔で表示できればいいですが、ずれてきます。

> もしかしたら,「次の行」の印刷の際,マップモードの前に実行していません
> でしょうか.

 
>   //TplPrevでは0.1mmm単位に戻すということ
>   SetMapMode(Range.hdc,OldMap);
>   //この後にplPrevのCanvasのコードを実行する
>   //そうしないと,論理座標値がRichEdit描画マップモードのまま
>
> # Twipsなんて単位やめて欲しい!?


until (LastChar >= MaxLen) or (LastChar = -1);
  plPrev1.Canvas.TextOut(200,TwipsToMili(Range.rc.Bottom)+50,'次の行');
finally
  plPrev1.EndDoc;
end;
のように書きましたが、うまくいきません。

[389] Re5:リッチエディットの印刷で悩んでいます返信 削除
2005/8/8 (月) 00:34:16 Mr.XRAY
▼ Andyさん

> ファイルをロードせずに、1行ずつ入力して、プレビューしました。
> 次の行の表示が一定間隔で表示できればいいですが、ずれてきます。


了解しました.こちらでもテストしてみます.
お急ぎのところ申し訳ありませんが,しばらく時間を下さい.


[392] Re6:リッチエディットの印刷で悩んでいます返信 削除
2005/8/8 (月) 15:09:16 Mr.XRAY
> 了解しました.こちらでもテストしてみます.

やってみました.現象を確認しました.
RichEditの印刷の後のMapModeが狂ってしまっているのが原因の様です.
う〜む(こればっかり).さ〜て,どうしたらいいのか...

つまり,こういうことです.MapModeが狂っているということは,プリンタの
解像度によっても印刷位置が変化します.したがって,

plPrev1.Canvas.TextOut(200,TwipsToMili(Range.rc.Bottom)+50,'次の行');

plPrev1.Canvas.TextOut(200,1500,'次の行');

としても所定の位置に印刷されません.



[394] Re7:リッチエディットの印刷で悩んでいます返信 削除
2005/8/8 (月) 17:19:01 Mr.XRAY
> う〜む(こればっかり).さ〜て,どうしたらいいのか...

こうしましょう.TplPrevの継承元であるTCustomplPrevのprotected部の
メソッドを使用してみることにします.
まず適当な場所に(ここではimplementationにしている)
(TPrevはなんでもよい)

implementation

type
   TPrev = class(TCustomplPrev);

と定義して下さい.次に,
//TplPrevでは0.1mmm単位に戻すということ
  SetMapMode(Range.hdc,OldMap);
の後に以下の行を追加して下さい.

TPrev(plPrev1).ScaleInitialize(plPrev1.Canvas,False);
(第2引数はFalseでもTrueでもどちらでも可)

そして,例えば,印刷のルーチンを以下の様にします.

//====================================================================
//  印刷プレビュー(逐次表示方式)の印刷メソッド
//  で,ここでは別の描画ルーチン作成して呼出している.
//====================================================================
procedure TForm1.TestPrint;
begin
     plPrev1.FontHeight(60);
     plPrev1.TextOut(200,200,'リッチエディトの印刷例');
     RichEditPrint(300,1900,450,1800,RichEdit1);

     plPrev1.Canvas.Font.Height:=80;
     plPrev1.Canvas.TextOut(200,2000,{LastY+50,}'次の行');
     plPrev1.Canvas.TextOut(200,2300,{LastY+50,}'次の行');
end;

これでしばらく様子をみて下さい.
参考までに,RichEdit1,RichEdit2のサンプルコードは,VCLのRichEditのPrint
メソッドを真似たものです(コードはComCtrls.pas内).




[395] Re8:リッチエディットの印刷で悩んでいます返信 削除
2005/8/8 (月) 23:36:52 Mr.XRAY
おっと間違えました.

> TPrev(plPrev1).ScaleInitialize(plPrev1.Canvas,False);
> (第2引数はFalseでもTrueでもどちらでも可)


この後に,

plPrev1.Canvas.TextOut(200,TwipsToMili(Range.rc.Bottom)+50,'次の行');

ですね.TPrev(plPrev1)... で再スケーリングしています.
TextOutの前にFontの設定をした方がいいです.
また,プリンタによって,微妙に位置がズレるようです.

[396] Re9:リッチエディットの印刷で悩んでいます返信 削除
2005/8/9 (火) 01:08:49 Andy
▼ Mr.XRAYさん
> おっと間違えました.
>
> > TPrev(plPrev1).ScaleInitialize(plPrev1.Canvas,False);
> > (第2引数はFalseでもTrueでもどちらでも可)
>
> この後に,
>
> plPrev1.Canvas.TextOut(200,TwipsToMili(Range.rc.Bottom)+50,'次の行');
>
> ですね.TPrev(plPrev1)... で再スケーリングしています.
> TextOutの前にFontの設定をした方がいいです.
> また,プリンタによって,微妙に位置がズレるようです.


ありがとうございます。
今度は、うまくいくみたいです。
こんなやり方は露と知りませんでした。

ただ、気が付いた点ですが、サンプルのRichtEdit1とRichtEdit2ではプレビューが
違うみたいで、RichtEdit2の方では大きくなって、はみ出ます。
印刷では、正常に印刷されますが

まあ、何はともあれ、悶々としていた、気分が晴れて着ました。

あれから、海外のホームページを色々見まして、印刷だけではうまくいくように
なりましたが、半分眠気眼でやっていましたので、わけ分からなくなってきました
ので寝ました。

先ほど、病院から帰ってきて、見まして、感謝感激です。




[398] Re10:リッチエディットの印刷で悩んでいます返信 削除
2005/8/15 (月) 00:03:50 Mr.XRAY
▼ Andyさん

> こんなやり方は露と知りませんでした。

これは作者でないと思いつかないかも...
でも,VCLのソースをみて,実は他のDelhi附属のコンポーネントでも同じよう
なことをやっていたりして (^_^)

> ただ、気が付いた点ですが、サンプルのRichtEdit1とRichtEdit2ではプレビューが
> 違うみたいで、RichtEdit2の方では大きくなって、はみ出ます。
> 印刷では、正常に印刷されますが


時間がとれたら再度確認してみます.


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