名前 題名 ▼ Mr.XRAYさん > > > まずは,AssignPrn を使用した方法です. > > > > 印刷の余白設定のテストをして気づきました. > > 一部の文字が文字化けしていました. > > 以下のコードのように,行単位で印刷すれば文字化けしないようです. > 知りませんでした. > > //============================================================================= > // TMemo にテキストファイルからテキストを読み込む > // プリンタ設定ダイアログでプリンタの設定 > //============================================================================= // > procedure TForm1.Button1Click(Sender: TObject); > begin > Memo1.ScrollBars := ssVertical; > Memo1.Lines.LoadFromFile('ABC.txt'); > Printer.Canvas.Font.Size := 20; > > PrinterSetupDialog1.Execute; > end; > > //============================================================================= > // TMemo のテキストを余白を設定して印刷 > // 複数頁にまたがる文書の印刷可能 > // > // uses に Printers が必要 > // 拙作の TplSetPritner コンポーネントが必要 > //============================================================================= // > procedure TForm1.Button2Click(Sender: TObject); > var > LPrnFile : TextFile; > LLeftOff : Integer; > LTopOff : Integer; > LRightOff : Integer; > LBottomOff : Integer; > LLineText : string; > LIndex : Integer; > begin > Printer.Title := 'テスト文書'; > > AssignPrn(LPrnFile); > try > Rewrite(LPrnFile); > try > // 余白の値 > LLeftOff := mmToPixelsX(plSetPrinter1, 20); > LTopOff := mmToPixelsY(plSetPrinter1, 30); > LRightOff := mmToPixelsX(plSetPrinter1, 20); > LBottomOff := mmToPixelsY(plSetPrinter1, 20); > > // 余白の設定 > SetViewPortOffset(plSetPrinter1, LLeftOff, LTopOff, LRightOff, LBottomOff); > > // 行単位で印刷 > // 全てのテキストを対象にすると 1 部の文字が文字化けすることがある > for LIndex := 0 to Memo1.Lines.Count - 1 do begin > LLineText := Memo1.Lines[LIndex]; > writeln(LPrnFile, LLineText); > end; > finally > CloseFile(LPrnFile); > end; > except > on EInOutError do > MessageBox(Handle, '印刷エラー', '印刷', MB_ICONWARNING); > end; > end; > > //----------------------------------------------------------------------------- > // 印刷の余白の設定 > // 第 1 引数は TplSetPrinter コンポーネント > // 後の引数は左端,上端,右端,下端のオフセットでピクセル単位 > // > // uses に Printers が必要 > // 拙作の TplSetPritner コンポーネントが必要 > //----------------------------------------------------------------------------- > procedure TForm1.SetViewPortOffset(ASetPrt: TplSetPrinter; ALeft, ATop, > ARight, ABottom: Integer); > var > LPaperW : Integer; > LPaperH : Integer; > begin > LPaperW := ASetPrt.PaperWidth; > LPaperH := ASetPrt.PaperHeight; > > SetMapMode (Printer.Canvas.Handle,MM_ANISOTROPIC); > SetWindowExtEx (Printer.Canvas.Handle, LPaperW, LPaperH, nil); > SetViewPortExtEx (Printer.Canvas.Handle, > LPaperW - (ALeft + ARight), > LPaperH - (ATop + ABottom), > nil); > // 描画原点を移動 > SetViewPortOrgEx(Printer.Canvas.Handle, ALeft, ATop, nil); > end; > // > //----------------------------------------------------------------------------- > // mm 単位を TPrinter.Canvas のピクセル数に変換 > // 横方向用 > //----------------------------------------------------------------------------- > function TForm1.mmToPixelsX(ASetPrt: TplSetPrinter; AValue: Integer): Integer; > begin > Result := Trunc(AValue * ASetPrt.XResolution / 25.4); > end; > > //----------------------------------------------------------------------------- > // mm 単位を TPrinter.Canvas のピクセル数に変換 > // 縦方向用 > //----------------------------------------------------------------------------- > function TForm1.mmToPixelsY(ASetPrt: TplSetPrinter; AValue: Integer): Integer; > begin > Result := Trunc(AValue * ASetPrt.YResolution / 25.4); > end; GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link