喫茶XRAYトップページ


[380] リッチエディットの印刷で悩んでいます返信 削除
2005/8/6 (土) 18:32:27 Andy
Mr.XRAYさん

印刷コンポーネントを重宝しています。

リッチエディット・グリッド・リッチエディット・グリッドと並べて
順に印刷をしたいと思っています。
サンプルで、リッチエディットの印刷がありましたが、リッチエディットの
最終の位置が分かりませんので、次のグリッドが印刷できません。
色々と試しましたが、お手上げです、どうしたらいいんでしょうか。

[382] Re:リッチエディットの印刷で悩んでいます返信 削除
2005/8/6 (土) 19:59:18 Mr.XRAY
▼ Andyさん

>色々と試しましたが、お手上げです、どうしたらいいんでしょうか。
                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^
そういう時は素直にあきらめましょう (^^;)

> サンプルで、リッチエディットの印刷がありましたが、リッチエディットの
> 最終の位置が分かりませんので、次のグリッドが印刷できません。


サンプルプログラム,RichtEdit2の場合でしたら,TFormatRange構造体に
Y座標であれば値が戻ってきます.ただし,これはTwips単位ですので0.1mm
単位に換算する必要がありますね.
例えば,サンプルのコードの例であれば,以下の様なコードを試してみて
下さい.

until (LastChar >= MaxLen) or (LastChar = -1);
  plPrev1.Canvas.TextOut(200,TwipsToMili(Range.rc.Bottom)+50,'次の行');
finally
  plPrev1.EndDoc;
end;
//===================================================================
//  Twips単位の値を0.1mm単位の座標値に変換する関数
//===================================================================
function TForm1.TwipsToMili(V: Integer): Integer;
begin
     Result:=Trunc(V*254.0/1440)
end;

参考までに,ペンの移動を伴う描画の後でしたら(文字列はペンではなくFontで
すので違います),描画後のペンの位置は,GetCurrentPositionExというAPIで
取得できます.

[例]
var
   APos : TPoint;

plPrev1.Line(200,1000,600,600);
GetCurrentPositionEx(plPrev1.Canvas.Handle,Addr(APos));
//この時点でAPos.x=1000,APos.y=600となっている
plPrev1.Canvas.TextOut(200,APos.y,'現在のペン位置から描画');


[384] Re2:リッチエディットの印刷で悩んでいます返信 削除
2005/8/7 (日) 11:35:28 Andy
▼ Mr.XRAYさん

どうもありがとうございました。

Twipsということを忘れていました。
ばっちり出来ました。
おまけに、別の方法まで、書いてくださってありがとうございました。

おかげさまで、寝つきが良くなります。


[385] Re2:リッチエディットの印刷で悩んでいます返信 削除
2005/8/7 (日) 19:27:55 Andy
▼ Mr.XRAYさん

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

ぐっすり寝れるかと思いましたが、今晩は酒でも飲まなきゃだめかな


[386] Re3:リッチエディットの印刷で悩んでいます返信 削除
2005/8/7 (日) 22:05:17 Mr.XRAY
▼ Andyさん

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


スミマセン.切取りというのはどういう状態というか,どのようにした
のでしょうか.


[387] Re3:リッチエディットの印刷で悩んでいます返信 削除
2005/8/7 (日) 22:17:47 Mr.XRAY
▼ Andyさん

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


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

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

# Twipsなんて単位やめて欲しい!?


[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