안녕하세요...TPrinter관련으로 질답란에 올라온 내용중에 제가 원하는 답이 없어 이렇게 글을 올리게 되었슴다. 얼마전에 아래 내용을 올렸었는데 힌트라두 주시는분이 없어 다시 올리게 되었슴다. 힘드시겠지만 저에게 조그마한 힘이라도 되어주셨으면 감사하겠슴다. 도와주십시오.
문제는 TPrinter로 Print시 한번 출력하고 난 후 프린터에서 출력되고 있는 중에 다시 TPrinter로 출력하면 에러가 발생함다. 
에러내용은 프로그램 오류 에러(잘못된 연산)가 뜨면서 플그램이 종료가 됨다. 
프린트 내용은 텍스트와 이미지가 포함이 되어있습니다. 프린트 내용이 세로로 출력되어야 하기때문에 TPrinter를 사용하게 되었습니다. 
왜 프린트 후 프린터에서 출력 완료되기전에 다시 프린트하게 되면 프로그램 오류 에러가 발생할까요? 프린터에서 출력이 완료된 후 프린트하면 이상은 없는데.. 프린터는 삼성 마이젯5000A를 주로 테스트 했슴다. HP 데스크젯1220C와 HP Officejet에서두 테스트 해 봤는데 모두 똑같더군요. 
아래는 코딩내용임다. 델피언 님들 부탁드림다.. 
//Main 루틴 
                with PrintDialog do begin 
                  Printer.Copies := PrintDialog.Copies; 
                  Printer.BeginDoc; 
                  OldOrg := SetOrgPoint(Printer.Canvas.Handle, Point(100, 100));   
                  try 
                    for i := FromPage to ToPage do begin 
                      procDrawText(Printer.Canvas, 1, i); 
                      if i <> ToPage then Printer.NewPage; 
                    end; 
                  finally 
                    SetOrgPoint(Printer.Canvas.Handle, Point(OldOrg.cx, OldOrg.cy)); 
                    Printer.EndDoc; 
                    pnlPrintLabel.Visible := False; 
                  end; 
                end; 
// 
function SetOrgPoint(HWND: THandle; APoint: TPoint): TSize; 
var OrgPoint: TPoint; 
begin 
  Escape(Printer.Canvas.Handle, GETPRINTINGOFFSET, 0, nil, @OrgPoint); 
  SetWindowOrgEx(Printer.Canvas.Handle, OrgPoint.x-APoint.x, APoint.y-OrgPoint.y, @Result); 
end; 
procedure TfrmPreview.procDrawText(ACanvas: TCanvas; AScale: Real; APage: Integer); 
var 
  OldMap : Integer; 
  Item_Cd: PCandle; 
  i, Cnt : Integer; 
begin 
  OldMap := SetMapMode(ACanvas.Handle, MM_LOMETRIC); 
  try 
          Cnt := 0; 
          for i:=(4*Apage-4) to (4*APage-1) do begin 
            if i >= ListCandle.Count then Break; 
            Item_Cd := ListCandle.Items[i]; 
            with Item_Cd^ do 
              DrawData_Candle(ACanvas, mAddr,, Cnt, AScale); 
            Inc(Cnt); 
          end; 
  finally 
    SetMapMode(ACanvas.Handle, OldMap); 
  end; 
end; 
procedure DrawData_Candle(ACanvas: TCanvas; AAddr: String;  ACol: Integer; AScale: Real); 
var 
  Metrics : TTextMetric; 
  i, x, y : Integer; 
  AData : WideString; 
  ARect, BRect : TRect; 
  ASize : TSize; 
  ALeft, ATop, ARight, ABottom: Integer; 
begin 
  GetOutSide(ALeft, ATop, ARight, ABottom); 
  ATop := -(ATop + 50); 
  ABottom := -ABottom; 
  ARect.Top    := Round((ATop) * AScale); 
  ARect.Bottom := Round((ATop - SHAPE_BOTTOM) * AScale); 
  ARect.Left   := Round((ALeft + ((SHAPE_RIGHT + SHAPE_GAP) * ACol)) * AScale); 
  ARect.Right  := ARect.Left + Round(SHAPE_RIGHT * AScale); 
  with ACanvas do begin 
    GetTextMetrics(Handle, Metrics); 
    StretchDraw(ARect, BackGroundBMP); 
    Brush.Style := bsClear; 
    Font.Name := '바탕체'; 
    Font.Style := [fsBold]; 
    AData := AAddr; 
    Font.Height := Round(60 * AScale); 
    x := ARect.Left + Round(CND_BASE_LEFT_ADDR * AScale); 
    y := ARect.Top - Round(CND_BASE_TOP_ADDR * AScale); 
    for i := 1 to Length(AData) do begin 
      TextOut(x, y, AData[i]); 
      Dec(y, Round(70 * AScale)); 
    end; 
    Pen.Width := 2; 
    Rectangle(ARect); 
  end; 
end; 
프린터 내용 (아래내용의 사각바탕엔 이미지가 들어갑니다. 한페이지에는 아래의 내용이 가로로 4개까지 들어갈수 있습니다) 
------ 
|  주  | 
|  소  | 
|       | 
|  대  | 
|  구  | 
|  시  | 
|       | 
|  서  | 
|  구  | 
|       | 
|       | 
------