Q&A

  • 퀵리포트 문제입니다...
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;
2  COMMENTS
  • Profile
    hobakpa 2002.04.23 02:03
    폼위에 QuickRep를 올려두고 리포트를 만드는 스타일입다.
    그리드에 있는것만 보여준다면 다음과 같이 하시면 될듯합니다.


    //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에서 마지막인지 체크하고 빠져나오겠죠...

    에고 저도 예전에 누구거 빼끼고, 한델에서 찾아서 흉내낸겁니다.
    그럼 즐프하세요
  • Profile
    김태훈 2002.04.23 01:20
    음..저도 아직 초보입니다만..

    OnNeedData 이벤트 이용할 때

    For문은 한 번도 안 써봐서

    잘 모르겠구요..

    일단 제가 Report 짤 때 쓰는 코딩 스타일은 다음과 같습니다..


    procedure TqrpMaterialConsumption.QuickRepNeedData(Sender: Object;
      var MoreData: Boolean);
    begin
      캡션  := 스트링그리드[1,X];
      캡션1 := 스트링그리드[2,X];
      .
      .
    //스트링그리드 첫 ROW의 DATA 쓴 다음

    If (x <= CurrIdx) Then
          MoreData := TRUE
       Else    MoreData := FALSE;

      INC(x);

    end;

    //  X는 글로벌 변수로 잡아 주구요..
    // CurrIdx는 써야 할 총 ROW의 수입니다...
    // 그리고 X의 초기화는 써머레이밴드비포프린트 정도에서
    // X := 0;로 초기화 해 줍니다.
    //걍 MoreData의 값만 빠꿔주면 자동적으로..되는 듯..^^;
    //지도 맨땅에 헤딩해서 안 것이라..쩝..
    //
    //그럼 즐코되세용......



    • 윤도상
    • 2002.04.23 06:57
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 정경철
      2002.04.23 19:48
      이 내용을 읽다가 궁금 한것이 생겨서 질문을 합니다.. 1. 바탕이나 특정 Form의 좌표값을 읽을 수 있습...
    • 최용일
      2002.04.23 09:50
      안녕하세요. 최용일입니다. 마우스클릭이벤트 두번 발생시키시면 됩니다... procedure TMainForm.But...
    • 프리맨
      2002.04.23 23:12
      컴포넌트의 프로퍼티에는 배열을 사용할수 없는데요.. 컬렉션이 그 대안입니다. 컬렉션으로 프로퍼티...
    • 최용일
      2002.04.23 10:08
      안녕하세요. 최용일입니다... 설명하자면 끝이 없지만... 조금 간단히 말해서... 배열을 객체화해놨다고...
    • 정진영
    • 2002.04.23 04:18
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이기택
      2002.04.23 05:04
      음 삭제 하는 경우는 delete 명령후 post를 쓰지 않아도 되구요 update나 insert는 post 명령어를 씁니...
    • 정진영
      2002.04.23 20:04
      insert모드에서의 추가가 아닌 sql을"insert into..."로 주고 excutesql을 실행한후에 grid...
    • 박종민
    • 2002.04.23 04:08
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.04.23 05:12
      안녕하세요. 최용일입니다. 간단한건데요... 쩝~ 쉽게 설명하면... 윈도우보시면 네모모양으로 생겼...
    • 어린왕자A
      2002.04.24 01:05
      구별하시면 되죠 --; if TField(Sender).FieldName = 'bunho' then text :='본호' else text := '기타'...
    • 김경록
      2002.04.23 18:59
      is 연산자를 쓰세여.. If Sender is TField Then Begin        //TFie...
    • 한대필
      2002.04.23 04:18
      if Sender = CDS1.FieldByname('aaa') then 이나 if Sender = CDS1.Fields[0] then 등으로 ...
    • 까치
      2002.04.23 07:22
      일단 2번과 3번 사이의 처리는 신용카드의 승인을 받아야 하니깐... 어느정도(괄호1:국가나 국민들이 승인...
    • 강동순
    • 2002.04.23 02:41
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 까치
      2002.04.23 07:35
      일단 combobox.TabStop := false; 로 지정하면 될거같구유~~ 만약에 포커스를 가지구 있으면서두 ...
    • 멀라여
      2002.04.23 03:15
      음. 방금 콤보박스만 컴파일시켜서 해보니깐, 휠마우스 컨트롤이 안되는데영,,ㅡㅡㅋ 웹상에선 콤보박...
    • 강동순
      2002.04.23 03:58
      답변에 감사 드립니다. ComboBox1 1 2 3 4 5 6 7 8 ... procedure TFmacolorse.ComboBox1Ch...
    • 최용일
      2002.04.23 04:09
      안녕하세요. 최용일입니다. 폼의 OnMouseWheel이벤트에서 아래와 같이 코딩해보세요... procedure TF...
    • 강동순
      2002.04.23 19:56
      여러분들이 보내준 답변에 의해 문제를 해결 했습니다. 이제 살이 찔것 같습니다. 너무너무 고맙습니...
    • 장민석
    • 2002.04.23 01:23
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최은석
      2002.04.24 03:18
      물론 가능하지여... Options 프로퍼티의 하위프로터피에서    goColSizing, goRowSizing 를 Tr...
    • 이기택
    • 2002.04.23 01:12
    • 1 COMMENTS
    • /
    • 0 LIKES
    • major
      2002.04.23 01:50
      혹시 값은 하나인가요? 흠 그러시다면 전역변수로 하나를 잡으시고 마지막으로 출력을 하는 After print...
    • 이정규
    • 2002.04.22 23:20
    • 2 COMMENTS
    • /
    • 0 LIKES
    • hobakpa
      2002.04.23 02:03
      폼위에 QuickRep를 올려두고 리포트를 만드는 스타일입다. 그리드에 있는것만 보여준다면 다음과 같이 하...
    • 김태훈
      2002.04.23 01:20
      음..저도 아직 초보입니다만.. OnNeedData 이벤트 이용할 때 For문은 한 번도 안 써봐서 잘 모르...
    • 김상준
    • 2002.04.22 22:48
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 한대필
      2002.04.23 02:37
      델파이4의 마이다스 기능은 5로 넘어오면서 많은 부분이 변경되었습니다. 질문하신 unit이나 함수가 없어...
    • jungsuk
    • 2002.04.22 21:13
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이기택
    • 2002.04.22 20:45
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 강기철
    • 2002.04.22 20:00
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.04.23 10:13
      안녕하세요. 최용일입니다. 인터넷 컴포넌트는 별로 사용 안 해봤지만... 별다른 추가사항은 없을걸요.....
    • 이기택
      2002.04.23 00:00
      db control 부분인가요 그쪽에서 dbgrid를 폼에 가져다 놓으시고 연결 부분이 있어야 겠죠? 1. dat...
    • 이승수
      2002.04.22 20:04
      흠... 뭐가 문제인지 정확하게 모르겠습니다만... 간단하게 어떤 부분을 지우셔야 한다면 Query 에서 간...
    • 강기철
      2002.04.22 20:24
      답변 정말 감사드리구요. 우선 테이블을 클라이언트에서 보여지게하고 싶습니다. 엑셀처럼요. 그럼어떤 ...
    • 김경록
      2002.04.23 19:03
      읔.. 이런.. 이런점에 대해서는 제가 답변을 써 놓은적이 있는데.. ADO에 대해서 질문했을때 제가 포함해...
    • 안영달
    • 2002.04.22 11:34
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 오프라인
      2002.04.22 23:08
      추천할 책으로는 가남사에서 출판한 "API 정복" 이라는 책이 있습니다.. 앞서 답변하신 님...
    • 이경문
      2002.04.22 12:54
      한두개도 아니고 엄첨 많은 API를 따로 공부하지는 마시구여, 그냥 컴터에 MSDN 깔아 놓고 팔요할 때마다 ...
    • 안영달
    • 2002.04.22 10:33
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김명화
    • 2002.04.22 10:06
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이경문
      2002.04.22 12:55
      c언어 : return pascal : exit
    • 김명화
      2002.04.22 20:33
      진심으로 감사드려요. 프로시저 종료문제는 해결이 되었어요. 오늘도 즐거운 하루 되세요.
    • 김명화
    • 2002.04.22 10:01
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김경록
      2002.04.22 19:04
      델파이에는 동적 배열을 지정하는 방법이 2가지정도 있습니다.. 하나는 포인터, 나머지 하나는 array입니...
    • 김명화
      2002.04.22 20:31
      => 답변 감사드립니다.     해제를 Form의 CloseQuery이벤트에서 코딩하면, ...