본문 바로가기
delphi

TPrinter를 이용한 인쇄 시 무한루프 해결 방법

by doran365 2024. 8. 5.

TListView 또는 TFlyTeeView를 사용하여 트리 노드에 삽입된 객체를 이용해 TPrinter를 사용해 인쇄하려고 할 때, 특정 상황에서 Priner.BeginDoc에서 무한루프에 빠지는 문제를 경험할 수 있습니다. 이 문제는 BeginDoc 내부에서 Application.ProcessMessages를 호출할 때 발생합니다. 이는 ftvSearchResult.OnGetNodeAttributes 이벤트가 계속 호출되며 무한루프에 빠지기 때문입니다.

문제 원인 분석

BeginDoc 내부의 Application.ProcessMessages 호출

BeginDoc 메서드는 인쇄 작업을 시작할 때 호출되는 메서드입니다. 이 메서드는 내부적으로 Application.ProcessMessages를 호출하여 응용 프로그램의 메시지 큐를 처리합니다. 그러나 이 과정에서 ftvSearchResult.OnGetNodeAttributes 이벤트가 계속 호출되어 무한루프에 빠질 수 있습니다.

OnGetNodeAttributes 이벤트의 영향

ftvSearchResult.OnGetNodeAttributes 이벤트는 트리 노드의 속성을 가져오는 데 사용됩니다. 이 이벤트가 BeginDoc 호출 중에 계속 발생하면 무한루프 문제가 발생할 수 있습니다. 이는 인쇄 작업을 시작할 때 화면 리프레시 이벤트가 계속 호출되기 때문입니다.

해결 방법

이벤트 일시 중지 처리

이 문제를 해결하기 위해 인쇄 작업 중에 ftvSearchResult.OnGetNodeAttributes 이벤트를 일시 중지할 수 있습니다. 이렇게 하면 BeginDoc 호출 중에 이벤트가 발생하지 않도록 할 수 있습니다. 다음은 이를 구현하는 예제 코드입니다:

ftvSearchResult.OnGetNodeAttributes := nil;
AArticleViewerForm.ShowModal;
ftvSearchResult.OnGetNodeAttributes := ftvSearchResultGetNodeAttributes;

위 코드에서 인쇄 작업을 시작하기 전에 ftvSearchResult.OnGetNodeAttributes 이벤트를 nil로 설정하여 이벤트 호출을 일시 중지합니다. 인쇄 작업이 완료된 후에는 이벤트를 원래 핸들러로 복원합니다.

상세 코드 설명

TPrinter 초기화 및 인쇄 시작

Printer.BeginDoc;
try
  // 인쇄 작업 내용
finally
  Printer.EndDoc;
end;

이벤트 중지 및 복원

procedure TForm1.PrintTreeView;
begin
  ftvSearchResult.OnGetNodeAttributes := nil;
  try
    Printer.BeginDoc;
    try
      // 인쇄 작업 내용
    finally
      Printer.EndDoc;
    end;
  finally
    ftvSearchResult.OnGetNodeAttributes := ftvSearchResultGetNodeAttributes;
  end;
end;

이 코드는 인쇄 작업 중에 OnGetNodeAttributes 이벤트를 일시 중지하고, 인쇄 작업이 완료된 후에 이벤트를 복원하는 방법을 보여줍니다. 이렇게 하면 무한루프 문제를 방지할 수 있습니다.

실습 예제

단계별 구현 예제

  1. 폼 생성 및 구성: TListView 또는 TFlyTeeView를 포함하는 폼을 생성합니다.
  2. 인쇄 버튼 추가: 인쇄 작업을 시작하는 버튼을 추가합니다.
  3. 이벤트 핸들러 구현: OnGetNodeAttributes 이벤트 핸들러를 구현합니다.
  4. 인쇄 작업 구현: 앞서 설명한 대로 인쇄 작업을 구현합니다.
procedure TForm1.ButtonPrintClick(Sender: TObject);
begin
  PrintTreeView;
end;

procedure TForm1.PrintTreeView;
begin
  ftvSearchResult.OnGetNodeAttributes := nil;
  try
    Printer.BeginDoc;
    try
      // 인쇄 작업 내용
    finally
      Printer.EndDoc;
    end;
  finally
    ftvSearchResult.OnGetNodeAttributes := ftvSearchResultGetNodeAttributes;
  end;
end;

procedure TForm1.ftvSearchResultGetNodeAttributes(Sender: TObject; Node: TTreeNode; var NodeAttributes: TNodeAttributes);
begin
  // 노드 속성 설정
end;

결론

TListView 또는 TFlyTeeView를 사용하여 트리 노드를 인쇄하는 동안 발생하는 무한루프 문제는 BeginDoc 호출 중에 발생하는 OnGetNodeAttributes 이벤트에 의해 발생할 수 있습니다. 이를 해결하기 위해 인쇄 작업 중에 이벤트를 일시 중지하고, 작업이 완료된 후 이벤트를 복원하는 방법을 사용할 수 있습니다. 이 방법을 통해 무한루프 문제를 효과적으로 해결할 수 있습니다.