상쾌한 오전임다.. 그런데 저에겐 그리 상쾌한 오전이 되지 않네욤. ^^;
이곳에서 델파이 프로그램에 대해 많은 도움을 받고 있슴다. 저에게 많은 도움이 되고 있구요.. 첨으로 질문을 하나 하려고 하는데 많은 도움 부탁드림다. 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개까지 들어갈수 있습니다)
------
| 주 |
| 소 |
| |
| 대 |
| 구 |
| 시 |
| |
| 서 |
| 구 |
| |
| |
------