안녕하세요...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개까지 들어갈수 있습니다)
------
| 주 |
| 소 |
| |
| 대 |
| 구 |
| 시 |
| |
| 서 |
| 구 |
| |
| |
------