::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-05 10:38:35, Hit : 4563, Vote : 1123
 한 장당 두 페이지 인쇄하기

unit Unit1;

interface

uses
  Classes, Controls, Dialogs, Forms, Graphics, Messages, Printers, StdCtrls,
  SysUtils, WinProcs, WinTypes;

type
  TForm1 = class(TForm)
    OpenDialog: TOpenDialog;
    BB_Print: TButton;
    CB_TwoPages: TCheckBox;
    procedure BB_PrintClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.BB_PrintClick(Sender: TObject);
var
  linesPerPage, charsPerLine, offset, rOffset, rowHeight,  pageWidth,
  pageNum, adjPhysWidth, pagesPerPage : integer;
  f : TextFile;
  fileName, dateTime : string;
  havePrinted : Boolean;
  PhysSize, PrintOffset : TPoint;

  procedure DoLayout;
  var
    s : string;
    i, j, row, col : integer;
  begin
    col := offset;

    inc(pageNum, 1);
    // 페이지번호 + 파일명 + 인쇄일자 출력
    s := lowercase(format('Page %d: %s @ %s', [pageNum, fileName, dateTime]));
    Printer.Canvas.TextOut(col, 0, s);

    for i := 1 to pagesPerPage do // 한 장당 몇page 만큼
    begin
      row := 2 * rowHeight; // 위에서 페이지번호 + 파일명 + 인쇄일자를 출력했으므로 다음칸부터
      for j := 3 to linesPerPage do // 한페이지당 행의 갯수
      begin
        if eof(f) then
          exit;

        readln(f, s);
        s := copy(s, 1, charsPerLine); // 한페이지당 문자의 갯수만큼만 잘라서
        Printer.Canvas.TextOut(col, row, s);
        havePrinted := True; // 한줄이라도 인쇄되었다를 표시
        inc(row, rowHeight); // 다음행으로 이동
      end;
      inc(col, pageWidth); // 한 장당 2 page 인쇄시 두번째 면의 시작 X
    end
  end;

  procedure WritePages;
  begin
    dateTime := DateTimeToStr(FileDateToDateTime(FileAge(fileName)));
    AssignFile(f, fileName);
    Reset(f); // 출력할 파일 열기
    havePrinted := False;
    pageNum := 0;
    repeat
      if havePrinted then
        Printer.NewPage;
      havePrinted := False;
      DoLayout;
    until eof(f);
    if havePrinted then
      Printer.NewPage;
    CloseFile(f);
  end;

begin
  // 인쇄할 파일을 선택한다
  if not OpenDialog.Execute then
    System.Exit;

  if CB_TwoPages.Checked then // 한 장당 2 page 인쇄
  begin
    Printer.Orientation := poLandscape;
    PagesPerPage := 2;
    Printer.Canvas.Font.Size := 7;
  end
  else
  begin
    Printer.Orientation := poPortrait;
    PagesPerPage := 1;
    PRinter.Canvas.Font.Size := 7;
  end;

  // 프린터 폰트
  Printer.Canvas.Font.Name := 'Courier New';
  // 인쇄시 한행의 높이
  rowHeight := Printer.Canvas.TextHeight('0');
  // 한페이지당 행의 갯수
  linesPerPage := Printer.PageHeight div rowHeight;

  // 물리적인 page의 폭을 구한다(physical page size)
  Escape(Printer.Handle, GETPHYSPAGESIZE,   0, nil, @PhysSize);
  // 물리적인 page에서 실제 인쇄가 시작되는 곳의 offset을 구한다
  Escape(Printer.Handle, GETPRINTINGOFFSET, 0, nil, @PrintOffset);
  // 물리적인 page의 폭 - Printer object의 page 폭 - offset
  rOffset := PhysSize.x - Printer.PageWidth - PrintOffset.x;

  if rOffset > PrintOffset.x then
  begin
    offset := rOffset - PrintOffset.x;
    adjPhysWidth := Printer.PageWidth - offset;
  end
  else
  begin
    offset := 0;
    adjPhysWidth := Printer.PageWidth - (PrintOffset.x - rOffset);
  end;

(* 옆의 숫자는 제 컴퓨팅 환경에서 출력해본 것입니다
  showmessage(inttostr(PhysSize.x)); // 3507
  showmessage(inttostr(Printer.PageWidth)); // 3382
  showmessage(inttostr(PrintOffset.x)); // 75
  showmessage(inttostr(rOffset)); // 50
*)

  // pageWidth는 한 page의 폭(전체 화면의 폭이 아님)
  pageWidth := adjPhysWidth div pagesPerPage;
  // 한페이지당 문자의 갯수
  charsPerLine := (pageWidth div Printer.Canvas.TextWidth('0')) - 2;

  Printer.BeginDoc;
  fileName := OpenDialog.FileName;
  WritePages;
  Printer.EndDoc;
end;

end.





971   [윈도우즈 API] 휴지통이 비어있는지 확인하기  김영대 2004/08/05 4720 1177
970   [윈도우즈 API] 휴지통에 파일을 버리는 법  신훈재 2003/03/10 4383 1136
969   [윈도우즈 API] 휴지통 비우기  김영대 2003/03/27 5020 1246
968   [윈도우즈 API] 화면캡처하기 Delphi3.0에서...  김영대 2003/03/04 4684 1264
967   [윈도우즈 API] 화면의 Memo 가 보여줄 수 있는 라인수 알아내기  김영대 2003/03/05 4778 1184
966   [시스템] 화면보호기가 설치되어 있는지 검사하기  김영대 2003/03/07 3793 1101
965   [일반/컴포넌트] 화면변경시 콤포넌트 위치와 크기를 조정  김영대 2003/03/06 4408 1069
964   [윈도우즈 API] 화면과 taskbar의 크기와 상태는 ?  김영대 2003/03/04 4621 1308
963   [윈도우즈 API] 화면 캡쳐하여 JPEG로 저장  신훈재 2003/03/10 5018 1005
962   [시스템] 현재 프린터의 출력가능한 용지종류 구하기  김영대 2003/03/07 5956 1592
961   [윈도우즈 API] 현재 키보드 입력 언어 구하기  김영대 2004/07/24 4770 1288
960   [윈도우즈 API] 현재 실행된 모든 프로그램의 Caption 읽어오기  김영대 2003/03/07 5851 1476
959   [시스템] 현재 내 PC의 비디오 정보  김영대 2003/03/04 4392 1166
958   [COM/OLE] 현재 IE 의 HTML 소스 코드 읽어오기  김영대 2004/08/18 5597 1310
957   [시스템] 현재 CD의 Track과 시간 구하기  김영대 2003/03/06 5161 1396
956   [일반/컴포넌트] 해상도(screen resolution)를 변경했는지 검사  김영대 2003/03/07 4463 1271
955   [일반/컴포넌트] 한글이 포함된 문자열 자르기 - 반쪽 한글  김영대 2003/03/04 5853 1168
954   [시스템] 한글 한 음절을 초성,중성,종성 음소로 분해하기('김' => 'ㄱ'+'ㅣ'+'ㅁ')  김영대 2004/10/22 7789 1258
953   [시스템] 한글 초성,중성,종성 음소를 입력받아 한 음절 문자로 만들기('ㄱ'+'ㅣ'+'ㅁ' => '김')  김영대 2004/10/22 6524 1369
  [일반/컴포넌트] 한 장당 두 페이지 인쇄하기  김영대 2003/03/05 4563 1123
951   [일반/컴포넌트] 하나의 프로시저,함수로 다른 함수,프로시저를 처리  김영대 2003/03/05 3829 1117
950   [데이터베이스] 필드의 데이터 타입을 알아내기  김영대 2003/03/04 4388 1169
949   [시스템] 플로피(floppy) 디스크 드라이브의 타입 구하기  김영대 2003/03/07 5815 1526
948   [시스템] 프린트 스풀러 제어방법  김영대 2003/03/07 6140 1770
947   [네트웍/인터넷] 프린터의 용지 크기/공급 설정하기  김영대 2003/03/07 6505 1226
946   [시스템] 프린터의 대기문서,등록정보,추가 마법사 호출하기  김영대 2003/03/05 4288 1138
945   [시스템] 프린터의 "용지 공급" 리스트 구하기  김영대 2003/03/07 4605 1326
944   [시스템] 프린터에 작업중인 job의 리스트 구하기  김영대 2003/03/07 4488 1183
943   [시스템] 프린터에 escape 코드를 전달하는 방법  김영대 2003/03/06 3736 1091
942   [일반/컴포넌트] 프린터로 escape 문자 출력하기(raw print)  김영대 2003/03/07 4564 1091
941   [윈도우즈 API] 프린터 스풀러에 대기중인 job의 수  김영대 2003/03/04 4488 1329
940   [시스템] 프린터 상태가 Ready인지 아닌지 검사  김영대 2003/03/04 5710 1641
939   [시스템] 프린터 리스트를 구하여 기본 프린터 변경하기  김영대 2003/03/07 5174 1217
938   [시스템] 프로세스에 할당된 memory page 구하기  김영대 2004/08/17 4709 1249
937   [시스템] 프로세스가 원도우즈 원격 터미널에서 실행중인지 검사  김영대 2008/11/04 5356 1519
936   [시스템] 프로세스가 사용하는 모듈(DLL) 리스트 구하기  김영대 2004/09/15 5633 1232
935   [시스템] 프로세서를 생성시켜보자!  김영대 2003/03/06 4343 1151
934   [시스템] 프로그램이 동적으로 할당받은 메모리 크기 ?  김영대 2003/03/07 4247 1234
933   [일반/컴포넌트] 프로그램의 bitmap을 MS 그림판으로 편집하여 다시 불러오기  김영대 2005/03/22 5333 1366
932   [네트웍/인터넷] 프로그램으로 네트워크 드라이브 연결/해제  김영대 2003/03/07 6329 1183

1 [2][3][4][5][6][7][8][9][10]..[25] [다음 10개]
 

Copyright 1999-2019 Zeroboard / skin by zero