Q&A

  • TPrinter사용 Print시 에러에 관한 짧은 질문..
상쾌한 오전임다.. 그런데 저에겐 그리 상쾌한 오전이 되지 않네욤.  ^^;
이곳에서 델파이 프로그램에 대해 많은 도움을 받고 있슴다. 저에게 많은 도움이 되고 있구요.. 첨으로 질문을 하나 하려고 하는데 많은 도움 부탁드림다. 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개까지 들어갈수 있습니다)
------
|  주  |
|  소  |
|       |
|  대  |
|  구  |
|  시  |
|       |
|  서  |
|  구  |
|       |
|       |
------
0  COMMENTS
    • 박국성
    • 2002.07.16 23:11
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2002.07.16 23:23
      델파이 코리아에 가보시면 뉴스레더에서 아마 찾아보실 수 있으실 겁니다. 오래전에 "민성기"님이 ...
    • 박영진
    • 2002.07.16 22:57
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 진성열
      2002.07.16 23:04
      이전 파일에 엎퍼치면 됩니다.
    • 최용일
      2002.07.16 23:04
      안녕하세요. 최용일입니다. 델파이 메뉴에 보시면 Help/Customize...란게 있을겁니다. 그거 클릭해서 실...
    • 김진건
    • 2002.07.16 22:56
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 열심히
      2002.07.17 03:00
      아 일단 위의 그림을 보니 초딩떄 처음 접했던 가우스 함수가 생각나네요.. 여러분 1 부터 10까지...
    • 구창민
      2002.07.16 23:25
      될때까지 끝까지 해 보시구요, 어떻게 어떻게 코드를 작성해 보았는데 제 생각은 이래서 이렇게 코...
    • 강동순
      2002.07.16 23:59
      KDDG_MIN님의 말이 맞습니다. 다음에는 KDDG_MIN님 말씀대로 하시고 제가 답변을 한것은 아니지만&nb...
    • 김광율
    • 2002.07.16 22:11
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최석기
      2002.07.16 22:57
      FindWindow를 통해 해당 핸들을 구한후 FindWindowex 함수를 이용해서 원하는 콘트롤들의 핸들을 구하실 수...
    • 이정택
    • 2002.07.16 21:53
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.07.16 22:59
      안녕하세요. 최용일입니다. 윈도우에 보시면 시작프로그램있잖아요... 거기에다가 등록시키시면 컴퓨터 ...
    • 이추형
      2002.07.16 22:59
      Demon이나 CRON등을 이용하여 자동으로 실행하게 할수 있습니다. (서버가 유닉스의 경우에 말이죠.. NT라...
    • 홍동훈
    • 2002.07.16 21:51
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박준영
    • 2002.07.16 21:19
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최석기
      2002.07.16 23:31
      소스로 올립니다.. 참고하세요 unit Unit1; interface uses   Windows, Messages, Sys...
    • 이추형
      2002.07.16 23:26
      procedure TForm1.Button1Click(Sender: TObject); var   ADate: TDateTime;   day...
    • 햇살
      2002.07.16 23:37
      이유가 뭘까요?.. 제가 짠 프로그램을 실행시키던 중 누군가가 이름입력창에는 한글이 먼저 입력될 수...
    • 최석기
      2002.07.17 01:38
      한글로 쓰시기 원하는 Edit에서 Ime mode를 imSHanguel로 설정하시고 사용하시면 원하는 효과를 얻으실 수 ...
    • 이기정
      2002.07.17 00:16
      IME Mode를 imHangul로 변경하면 입력되는 문자가 모두 2바이트로 인식이 되는것 같슴다. 한글을 표현하는...
    • KDDG_ZZOM
      2002.07.16 21:14
      혹시 ImeMode의 프로퍼티가 어케 되었나요? 여기때문에 그러는건 아닐가요? 잘모르겠네요... 즐프하세요...
    • 머슴
      2002.07.16 21:14
        editbox의 속성중 imeMode가 imAlpha로 되어 있지 않은지   확인해보시고요.. ...
    • 이기정
    • 2002.07.16 20:11
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 주관석
    • 2002.07.16 19:29
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 진성열
      2002.07.16 23:03
      ctrl + j
    • 최석기
      2002.07.16 19:43
      도움말에 찾아보면 단축키 리스트가 있네요. Ctrl+Shift+P       &...
    • 1학년
    • 2002.07.16 19:20
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이명호
      2002.07.16 22:18
      delphi 툴중에 있는 DATAPUMP 를 이용해 보세요 파라독스든 인터베이스등 아님 엑셀화일이등등.. BDE...
    • KDDG_ZZOM
      2002.07.16 19:29
      www.delphikorea.com가시면 초보강좌에 조복기님이 올리신 강좌가 있어요... 보시고 참고하시면 될것같네...
    • 이상협
    • 2002.07.16 18:48
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이현철
      2002.07.19 02:52
      먼저, 어떤 명령을 한꺼번에 처리하시려는지 구체적으로 적어주세요.. 단순히 키보드 이벤트를 발생시키면...
    • 박준열
      2002.07.17 10:25
      1. Windows에서 Apple을 실행시키려고 하는지 ?    또한 Apple을 Run후에 Return값을 받을 것인...
    • 최석기
      2002.07.16 19:53
      간단한 질문 같지만 상당히 어려운 부분이 있는거 같네요. 먼저 명령을 어떤 식으로 표현할껀지부터 정...
    • oss
    • 2002.07.16 14:11
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김호규
    • 2002.07.16 08:21
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.07.16 18:34
      혹, 오라클을 쓰신다면 MONTHS_BETWEEN 이란걸 써보시면 어떨지.. select MONTHS_BETWEEN(to_date('2002...
    • oss
    • 2002.07.16 08:07
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 유영권
    • 2002.07.16 08:06
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 열심히
      2002.07.17 03:22
      흠....이상하네요... 님 오라클 까실때 어떻게 까셨는지 오라클 서버의 성능은 파라미터를 어떻게 하느...
    • 조승식
      2002.07.24 06:13
      먼저 답변 감사합니다. 오라클은 어떻게 설치하는것이 가장 좋은지...한번더 조언을 부탁합니다. ...