▼ ANDYさん
> ▼ 宮さん
>
> 参考までに私の場合、次のようにしています。
>
ANDYさんありがとうございます。私のレベルは初級クラスですがらすぐには
どこに入れたらいいのか理解できませんが、
参考にしていろいろ挑戦してみます。できれば自動判別したいですね。
ちなみに私のコードはMR.XRAYさんの
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/index.htm
そのままです。それに四苦八苦して付け足したりして、
自分で何をやっているのか判らないで使っています。(plPrevを理解していない)
ベテランからみれば「なんじゃ?こりゃ!」だと思いますが。
参考までにコードは下記の通りです。
procedure TForm1.actTextPrintExecute(Sender: TObject);
begin
plPrev1.Title:=ExtractFileName(formMDI.ComboBox1.Text); //ページのタイトルとして印刷する
//マージンセット
plPrev1.TopMargin :=StrToInt(EditUp.Text) *10;
plPrev1.BottomMargin :=StrToInt(EditBottom.Text) *10;
plPrev1.LeftMargin :=StrToInt(EditLeft.Text) *10;
plPrev1.RightMargin :=StrToInt(EditRight.Text)*10;
RichEditPrint( plPrev1.LeftMargin ,
Ceil(plSetPrinter1.PaperWidth*254.0/plSetPrinter1.XResolution)-plPrev1.RightMargin,
plPrev1.TopMargin,
Ceil(plSetPrinter1.PaperHeight*254.0/plSetPrinter1.YResolution)-plPrev1.BottomMargin,
RichEdit1);
plPrev1.ShowModal;
end;
//--------------------------------------------------------------描画ルーチン
procedure TForm1.RichEditPrint(X1,X2,Y1,Y2: Integer; Rich: TRichEdit);
function MiliToTwips(V: Integer): Integer;
begin
Result:=Trunc(V*1440.0/254.0);
end;
var
Range : TFormatRange;
LastChar : Integer;
MaxLen : Integer;
OldMap : Integer;
begin
LastChar := 0;
MaxLen := Rich.GetTextLen;
Range.chrg.cpMin:=0; //テキストの最初から
plPrev1.BeginDoc;
try
repeat //毎回Rangeにセット
//--------------------------------------------------------------ヘッ・#95;ー印刷
plPrev1.FontHeight(MiliToTwips(5));//60);
plPrev1.TextOut((Ceil(plSetPrinter1.PaperWidth*254.0/plSetPrinter1.XResolution) div 3)
,MiliToTwips(10)
,ExtractFileName(formMDI.ComboBox1.Text));
//--------------------------------------------------------------本文印刷
FillChar(Range, SizeOf(TFormatRange), 0); //Rangeを0(null)で埋める
Range.hdc := plPrev1.Canvas.Handle; //出力先デバイスのハンドル
Range.hdcTarget := Range.hdc; //書式設定するデバイスのハンドル
Range.rc.Left :=MiliToTwips(X1); //描画領域の指定(Twips単位)
Range.rc.Right :=MiliToTwips(X2); //最初の頁だけ印刷位置などを変更する場合は分岐処理する
Range.rc.Top :=MiliToTwips(Y1); //ミリ単位をピクセルに変換する
Range.rc.Bottom :=MiliToTwips(Y2);
Range.rcPage := Range.rc; //用紙1頁のサイズ//本当は用紙サイズをTwipsで指定すべき?
Range.chrg.cpMax:= -1; //最後まで(-1で自動計算)
OldMap := SetMapMode(Range.hdc,MM_TEXT); //マップモードMM_TEXTにして前のマップモードをSaveMapに保存
SendMessage(Rich.Handle, EM_FORMATRANGE, 0, 0); //バッファのフラッシュ
try
Range.chrg.cpMin:=LastChar; //この頁の開始は前の最後の文字から
LastChar:=SendMessage(Rich.Handle,EM_FORMATRANGE,1,Longint(@Range)); //実際の印刷
if (LastChar<MaxLen) and (LastChar<>-1) then //まだ印刷すべきデータがある場合は改頁
begin
plPrev1.NewPage;
end;
finally
SendMessage(Rich.Handle, EM_FORMATRANGE,0,0); //バッファのフラッシュ
SetMapMode(Range.hdc,OldMap); //マップモードを元に戻す
TPrev(plPrev1).ScaleInitialize(plPrev1.Canvas,False); //TplPrevでは0.1mmm単位に戻すということ
end;
until (LastChar >= MaxLen) or (LastChar = -1);
finally
plPrev1.EndDoc;
end;
end;
//--------------------------------------------------------------フッター印刷
procedure TForm1.plPrev1BeforeView(Sender: TObject; Page: Integer);
var
PageStr: String;
begin
//文字のサイズ
plPrev1.FontSize(10);
//頁番号の文字列を作成
PageStr:=IntToStr(Page)+'/'+IntToStr(plPrev1.PageCount);
plPrev1.TextOut(Trunc((Ceil(plSetPrinter1.PaperWidth*254.0/plSetPrinter1.XResolution) div 2))
,Ceil(plSetPrinter1.PaperHeight*254.0/plSetPrinter1.YResolution)-80
,PageStr);
end;
|