喫茶XRAYトップページ

[スレッド全体
]

[13320] 文字化け返信 削除
2020/4/18 (土) 07:17:45 Mr.XRAY
> まずは,AssignPrn を使用した方法です.

印刷の余白設定のテストをして気づきました.
一部の文字が文字化けしていました.


[13321] Re:文字化け返信 削除
2020/4/18 (土) 07:22:20 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;


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