델파이

퀵리포트(TQuickReport) TDBGrid 선택된 것만 인쇄 OnNeedData

미스터몽키 2017. 7. 12. 18:15

디비그리드(TDBGrid) 에서 다중 선택된 것 만 퀵리포트(TQuickReport)에서 인쇄할 때 두가지 방법이 있다


1. 퀵리포트에 데이터셋(DataSet)을  연결하여 사용할 경우 

  

디테일 밴드의 onBeforePrint 이벤트에 다음과 같이 작성한다.


procedure TForm1.QRBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);

begin

  if dbGrid1.SelectedRows.CurrentRowSelected then

  begin

    QRLabel1.Caption := qrTest.FieldByName('book_cd').AsString;

    PrintBand := True;

  end

  else

    PrintBand := False;

end;  


이 방법은 간단하고 쉽다. 디비그리드 전체 자료를 루프 돌면서 선택된 것만 인쇄한다.


단점은 디비그리드 전체 자료가 많다면 즉 몇 백건이 넘으면 시간이 그 만큼 더 걸린다.


2. onNeedData 이용하는 방법

 

데이터셋 연결없이 onNeedData 이벤트에 작성하면 선택된 레코드만 접근하여 빠르게 인쇄할 수 있다

전체 레코드가 많은 상태에서 몇 건만 선택할 경우 매우 빠르다.


우선 전역 변수를 정의한다. 용도는 디비그리드의 선택된 것에 대한 인덱스이다.

그리고 onBeforPrint 에 인덱스를 초기화한다.


...

    fIndex : integer;

...

procedure TForm1.QuickRep1BeforePrint(Sender: TCustomQuickRep; var PrintReport: Boolean);

begin

  fIndex := 0;  //초기 인덱스 0

end;


인쇄는 onNeedData에서 작성한다.


procedure TForm1.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);

begin

  if fIndex < dbGrid1.SelectedRows.Count then                      

  begin

    MoreData := True;

    qrTest.GotoBookmark(Tbookmark(dbGrid1.SelectedRows.Items[fIndex]));

    QRLabel1.Caption  := qrTest.FieldByName('book_cd').AsString ;

    QRLabel2.Caption  := qrTest.FieldByName('book_nm').AsString;


    Inc(fIndex);

  end;


end;


이 방법은 자료가 많던 적든 빠르게 인쇄한다.  전체 레코드를 루프로 돌지않고 선택된 레코드만 이동하면서 인쇄하기 때문이다.


단점은 약간의 코딩이 좀 더 들어간다는 것


OnNeedData 를 이용하면 대부분의 어려운 출력물도 인쇄가능하다.