dataset을 이용하지 않고 StringGrid의 값들을 넘겨주는 작업을 하려고 하는데..
preview를 보면 아무것도 안보입니다.
물론 실행해서 보고있구요
아래와 같이 코딩을 했는데..잘안되네요..뭐가 문제인지요?
값들을 모두 확인한 결과 값들은 다 잘넘어가고 단지 Preview해서 아무것도 안보인다는 겁니다.
아시는 분 가르쳐주세요..
//버튼으로 퀵리포트의 내용을 보여주도록 하였습니다.
procedure TfrmMD_WH_ConsumptionCalculation_Modify.btnPrintClick(
Sender: TObject);
begin
qrpMaterialConsumption.Prepare;
qrpMaterialConsumption.Preview;
end;
// StringGrid로 값을 넘길때는 OnNeedData 이벤트를 이용하라고 하더군요
procedure TqrpMaterialConsumption.QuickRepNeedData(Sender: TObject;
var MoreData: Boolean);
var
I , intRowNO : integer ;
begin
//MoreData값이 True이면 출력작업이 계속되고 false이면 출력이 끝난다.
//SomeList는 TsringList 클래스의 인스턴스로서 출력하고자 하는 데이터가 들어있다.
//Current Index는 현재 출력한 개수를 가리키고 SomeList.count는 총 프린트할 개수를 가리키고 있다.
//따라서 출력할 데이터가 남아 있는 동안은 MoreData의 값은 true가 된다.
i := 0;
intRowNO := frmMD_WH_ConsumptionCalculation_Modify.hpgConsumption.RowCount ; // 총 프린트할 개수
for i := 0 to intRowNO do // 현재 출력상태를 나타내는 개수
begin
MoreData := (i < intRowNO );
if MoreData then
begin
// Label에 값을 할당한다.
qlbNO.caption := IntToStr(i);
// Material Name
qlbMaterialNameData.caption := frmMD_WH_ConsumptionCalculation_Modify.hpgConsumption.Cells[0,i];
// Size
qlbSize.Caption := frmMD_WH_ConsumptionCalculation_Modify.hpgConsumption.Cells[9,i];
//Color
qlbColor.Caption := frmMD_WH_ConsumptionCalculation_Modify.hpgConsumption.Cells[8,i];
//Parts Name
qlbPartsName.Caption := frmMD_WH_ConsumptionCalculation_Modify.hpgConsumption.Cells[1,i];
//Length
qlbLength.Caption := frmMD_WH_ConsumptionCalculation_Modify.hpgConsumption.Cells[2,i];
//Width
qlbWidth.Caption := frmMD_WH_ConsumptionCalculation_Modify.hpgConsumption.Cells[3,i];
//NO of Parts
qlbPartsNO.Caption := frmMD_WH_ConsumptionCalculation_Modify.hpgConsumption.Cells[4,i];
//Cons
qlbCons.Caption := frmMD_WH_ConsumptionCalculation_Modify.hpgConsumption.Cells[5,i];
//Total Cons
qlbTTLCons.Caption := frmMD_WH_ConsumptionCalculation_Modify.hpgConsumption.Cells[6,i];
//Actual Cons
qlbActualCons.Caption := frmMD_WH_ConsumptionCalculation_Modify.hpgConsumption.Cells[7,i];
// Progress
qrpMaterialConsumption.QRPrinter.Progress := (Longint(i) * 100) div intRowNO ;
end
else
qrpMaterialConsumption.QRPrinter.Progress := 100;
end; // for end
end;
그리드에 있는것만 보여준다면 다음과 같이 하시면 될듯합니다.
//private 쪽에 변수 선언해주세요.
DataCnt,iRow: Integer;
{$R *.DFM}
//1. 스트링그리드의 카운터 만큼만 리스트를 보여준다면 스트링 카운터를
//따로 iRow에 넣습니다.
//datacnt란 놈은 0번으로 초기화 하는데 보통 저는 스링그리에 첫번째 로우를
//타틀로 사용을 안하고 바로 데이타를 넣습니다.
//그러다보면 1번째 실데이타는 즉 첫번째레코드는 스트링그리드 0번째 로우
//에서 시작하겠죠..그넘을 초기화 하는 겁니다.
procedure TForm2.QuickRep1BeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin
iRow := form1.sgdData.RowCount;
DataCnt := 0//Init!
end;
//2. 요기서 datacnt을 하나씩 체크합니다. 위에서 그리드의 마지막
//까지만 데이타를 찍어 주고 빠져 나와야 하기때문이죠.
procedure TForm2.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);
begin
if dataCnt < iRow then
MoreData := dataCnt <= iRow;
//위 구분은 moredata에 True또는 False를 반환 하겠죠
//찍을까 말까????
end;
//3.실데이타가 찍습니다.
//for루프를 왜안돌릴까요?? 저도 몰랐죠.
//detailband란 놈이 자동으로 루프를 돈답다.
//onneed에서 카운터 체크해서 true면 beforprint넘도 자동으로 한번더 이벤트
//를 거치겠죠.
procedure TForm2.DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
var
begin
L1.Caption := Form1.sgdData.Cells[0,DataCnt];
L2.Caption := Form1.sgdData.Cells[1,DataCnt];
L3.Caption := Form1.sgdData.Cells[2,DataCnt];
L4.Caption := Form1.sgdData.Cells[4,DataCnt];
//카우터를 하나씩 증가 시켜주고요...
Inc(DataCnt);
end;
procedure TTForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2 := nil;
end;
/////////////////////////////////////
순서
1. 위 폼이 첫번째 create되면 quicrep beforeprint 이번트 1번만 탑니다.
2. 두번째 디테일벤드의 onneeddata이벤트를 탑니다.
3. 세번째 detailband onbeforeprint를 탑니다.
4. 2,3,이 스트링그리드의 마지막까지 반복하다가 onneeddata에서 마지막인지 체크하고 빠져나오겠죠...
에고 저도 예전에 누구거 빼끼고, 한델에서 찾아서 흉내낸겁니다.
그럼 즐프하세요