디비그리드(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 를 이용하면 대부분의 어려운 출력물도 인쇄가능하다.
'델파이' 카테고리의 다른 글
TRichEdit 마우스위의 라인값, 행번호, 열번호 구하기 (0) | 2017.08.14 |
---|---|
TRichEdit url링크 (0) | 2017.08.14 |
스트링그리드(TStringGrid) 현재 행에 색깔 넣기, 교차행에 색깔 넣기, 포커스이동문제해결 (0) | 2017.06.21 |
초단위 반올림하여 분단위표현 SQL Server smalldate 형식과 같이 (0) | 2017.05.19 |
메인폼 숨기기 보이기 (0) | 2017.04.05 |