Q&A

  • TPrinter관련 질문임다.
안녕하세요...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.19 20:37
      저 가 확인 해 봤는 네 잘 되는군요 이상하네요 혹 델파이 6을 업그레이드 안하셨는지 ? 그리고 ...
    • 이추형
      2002.07.19 20:19
      혹시 FormCreate 이벤트에서 작업을 하신다면 각각의 components 생성에 문제가 생깁니다. FormActivate...
    • 임지수
      2002.07.19 20:32
      님.. procedure TFrm_buyer.edit_enabled(x:boolean); begin Btn_insert.Enabled := x; Btn_edit.Ena...
    • 이기정
    • 2002.07.19 19:33
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 민병범
    • 2002.07.19 19:17
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2002.07.19 19:32
      모달 다이얼로그라고 하셨으니까, 버튼의 ModalResult 값을 세팅하셨겠군요. 예를 들어, 확인 버튼에는 mr...
    • 박명성
    • 2002.07.19 18:08
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김도형
      2002.07.19 18:24
      //찾기 procedure TFrm_Main.Dlg_FindFind(Sender: TObject); var   FoundAt: LongInt; &nbs...
    • 함희주
    • 2002.07.19 14:41
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박종삼
    • 2002.07.19 06:04
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이현철
      2002.07.20 19:57
      흠.. 저도 안해봤던 부분이라.. 어떻게 말씀드려야 할지 모르겠네요... 그렇다고 그 상황을 제가 직접 만...
    • 성대현
    • 2002.07.19 05:54
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2002.07.19 19:06
      ImageList 의 이미지를 캔버스에 그려주는 메소드가 있습니다. Draw 라는 메소드인데... 이를 이용해 보세...
    • 서기원
      2002.07.19 06:35
      저도 Imagelist는 안써봐서 어떻게 쓰는지는 잘 모르는데 이렇게 하니까 되네요. iCount를 전역으로 선...
    • 짱아
    • 2002.07.19 04:20
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2002.07.19 18:56
      연산상으로는 따로 잘못된 부분은 없는 것 같습니다. 0이 넘어가는 경우는, ComboBox2.text 에서 가져온 ...
    • 박영수
    • 2002.07.19 04:02
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.07.19 20:22
      건수가 얼마되지 않는다면 출력용 dataset을 하나더 가져가는건 어떨까요?
    • 송재훈
    • 2002.07.19 03:43
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2002.07.19 19:14
      글쎄요. 참 논란의 소지가 있는 질문이네염 ^^ 한 가지 확실한 것은 비베는 베이직 언어를 사용하고, 델...
    • 최석기
      2002.07.19 19:47
      TForm안에 선언한 함수의 선언은 TForm의 Public 멤버 함수로 사용되어진다는 의미에 선언이기 때문에 함수...
    • 신연근
      2002.07.19 05:59
      자세한건 저도 초보이기 때문에 잘 모르겠지만 선언부(public)에 써준 function을 삭제하시던가 아니면...
    • 박영수
      2002.07.19 04:08
      function TForm1.MyProc(FirstInt: Integer; SecondInt: Integer): Integer; var    ...
    • hidel
      2002.07.19 04:05
      {$R *.dfm} function TForm1.MyProc(FirstInt: Integer; SecondInt: Integer): Integer; 로 ..해보세요...
    • 넘버3
    • 2002.07.19 03:11
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 2002.07.19 02:28
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 2002.07.20 02:57
    • 최용일
      2002.07.19 03:16
      안녕하세요. 최용일입니다. 그냥 빈문자열주시면 됩니다... Registry.ReadString(''); ^^ 항상 즐...
    • 이병협
      2002.07.19 03:16
      Registry.ReadString(''); 하시면 됩니다.
    • 이현철
      2002.07.19 02:50
      아래의 예제는 제가 예전에 작성했던 코드인데.. HKEY_LOCAL_MACHINE 밑에 softwaremicrosoftwindowscur...
    • 뿡뿡이
    • 2002.07.19 01:46
    • 2 COMMENTS
    • /
    • 0 LIKES
    • withcount
      2002.07.19 03:21
      형호님이 미리 답변하셨네요..^^ 델코 초보강좌란에 "Interbase Q&A 모음" 이 있는데 읽어보시면 도움...
    • 임형호
      2002.07.19 02:17
      interbase 초기설정하는것은 요즘 나오는 델파이 책을 보면... 나와있는것들이 많이있습니다. 질문하신 내...
    • 나상진
    • 2002.07.19 01:29
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.07.19 01:32
      안녕하세요. 최용일입니다. uses절에 CommCtrl유닛을 추가하세요... ^^ 항상 즐코하세요...
    • 이현철
      2002.07.19 01:31
      이 컴포한번 써보세용.. 프로그래스바고 머고.. 다 상태바에 올릴수 있습니다..