C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[52379] Re:구현에서는 어떻게 해야 하나요 죄송합니다. 초보입니다.
장성호 [nasilso] 2216 읽음    2008-02-22 11:33
상속요?
무얼 어떻게 상속받아 만드신다는것인지?

제가 구현한것에 대해 설명해 드리겠습니다.


[조건]
- TQuickRep 의 Preview 를 호출할때 prewview 폼
- 앞에 답변에서 방법2로합니다.
- 그리고 Timer를 이용 하였습니다.

[방법]
  
1. 보통 아래와 같이 preview를 호출하죠?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    QuickRep1->Preview();
}

2. preview 함수 호출하기전에  timer를 enabled시켜놓고 호출합니다.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Timer1->Interval=50;       //50ms
    Timer1->Enabled=true;
    QuickRep1->Preview();
}

3. 그리고 Timer의 이벤트핸들러 함수에서 ToolBar를 찾아서 설정합니다.

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
       //여기서 Print  Preview폼의 toolbar설정
      // 왜냐하면 preview폼이 show된 후에 해야하기때문에...
      //쓰레드를 이용할수도 있고 다른방법도 있음..
}

4. 문제는 Preview폼과 Preview폼안에 있는 toolbar를 찾는것입니다.

5. Preview폼 찾기
   - prewview폼의 classname이 "TQRStandardPreview" 이고 caption이  "Print Preview" 입니다.
   - 그러므로 아래처럼 FindWindow하면 HWND를 찾을수 있겠죠
     HWND hWnd =    FindWindow("TQRStandardPreview", "Print Preview") ;
   - 그리고 찾은 hWnd에서 FindWindowEx로 ToolBar 핸들을 찾을수 있겠죠
     HWND hToolWnd = FindWindowEx(hWnd,0, "TToolBar",0);

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
        HWND  hWnd=FindWindow("TQRStandardPreview", "Print Preview") ;
        HWND hToolWnd = FindWindowEx(hWnd,0, "TToolBar",0);
    }
   

   Toolbar의 핸들을 찾으면 SendMessag로 Tool Button  클릭 기능 같은것을 구현할수도 있겠고
   WindowProc를 바꿔치기하여서 여러가지를 구현할수 있을것입니다.
 
   근데 여기서 ToolBar의 특정 ToolButton의  Enabled  설정이나 Visible설정을 ToolBar핸들만을가지고
   구현하는 방법은 저도 잘 모르겠습니다.
  
   여기서 찾은것은 단지 윈도우 핸들이지 객체(오브젝트)의 포인터가 아니니까요

6. 그래서 핸들이 아닌 객체의 포인터를 찾아야 더욱 손쉽게 마음대로 주무를수 있을것입니다.

  먼저   Preview폼인 TQRStandardPreview  객체의 포인터찾아야 겠죠

  앞에 답변했듯이 TQRStandardPreview  는 TQRPrinter 의 PreviewControl 이었습니다.
  TQRPrinter->PreviewControl ; 

   그리고  TQuickRep 에서는 TQRPrinter가  QuickRep->Printer 이죠

   결론적으로 QuickRep->Printer->PreviewControl 를 가져오면 되는것입니다.
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
        QuickRep1->Printer->PreviewControl ; 
    }
    근데 해보시면 아시겠지만 위와같이 하면 안될것입니다.
    왜냐하면 PreviewControl 은 TQRPrinter의 private멤버이니까요
  
   그리고 또하나  QuickRep1->Printer는 평소에 NULL입니다. Preview폼이 호출된후에 생성됩니다.


7. 그럼 난제는 TQRPrinter에서 PreviewControl 을 찾는것이 문제인데....

   앞에 답변에 예기했듯이 팁&트릭 게시판에 보면 private멤버 access하는 다양한 방법을 소개해 뒀습니다.
    http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=723
 
   위 팁에서 저는 방법4를 이용해서 해봤습니다.

  
   QRPrntr.hpp 파일을 open하여서
   TQRPrinter 클래스선언 부분을 보면 PreviewControl 라는것이 private멤버로 있습니다.
   private멤버 PreviewControl 에 접근하기 위해서는 TQRPrinter와 붕어빵 클래스를 만듭니다.


   class TMyQRPrinter : public Classes::TPersistent
   {
      private:
         ...
         ...
      public:
         Controls::TWinControl* PreviewControl;
   };

   이렇게 하면 PreviewControl 에 접근이 가능하겠죠?


8. 자 그럼 다시 Timer핸들러에서 PreviewControl에 접근해보면?

   class TMyQRPrinter : public Classes::TPersistent
   {
      private:
         ...
         ...
      public:
         Controls::TWinControl* PreviewControl;
   };

  void __fastcall TForm1::Timer1Timer(TObject *Sender)
  {
      TQuickRep *QuickRep=QuickRep1;
      if(QuickRep->Printer)//Printer가 있어야
      {
          TMyQRPrinter *MyPrinter=(TMyQRPrinter *)QuickRep->Printer;
          String sClsName=MyPrinter->PreviewControl->ClassName(); // "TQRStandardPreview"
      }
  }
  
  이와같이 하면 에러가 나지 않죠

9. TQRStandardPreview 의 포인터를 찾았다고 끝난것은 아닙니다.
   TQRStandardPreview 폼 즉 PreviewControl에서  다시 ToolBar를 찾아야죠

   이건 쉽습니다.
   TQRStandardPreview폼에 있는ControlCount만큼  for문 돌리면서
   classname이 TToolBar 인것 만 찾으면 되니까요
 

   for(  int c=0;c<MyPrinter->PreviewControl->ControlCount;c++)
   {
       sClsName=MyPrinter->PreviewControl->Controls[c]->ClassName();
       if(sClsName=="TToolBar")
       {
           TToolBar *ToolBar = ( TToolBar *) MyPrinter->PreviewControl->Controls[c];
           //찾았다.
       }
   }

10. 드디어 마지막 입니다.
   toolBar에서 해당 ToolButton의 Enable이나 Visible속성을 변경해주면 되겠죠
 
   ToolBar->Buttons[11]->Visible=false;   //Print
   ToolBar->Buttons[10]->Visible=false;   //Print Setting

   문론 여기서 timer를 Enabled=false하구요



[추신]  

A. 코드를 거의다 써줬는데...
  마무리는 2번 8번 9번 10번의 코드를 조합만 하면 될것입니다.

B. QuickRep를 여러장 모아서 출력하는 QRCompositeReport를 이용하는경우는
   거의 똑같은데 쬐~끔 다릅니다.(똑같이 해도 되려나?)


그럼...
  

  
  



암흑사제 님이 쓰신 글 :
: 2번째 방법으로
: 상속은 받았는데 어떻게 쓰는지 모르겠습니다.
:
: 장성호 님이 쓰신 글 :
: : 저도 전에 잠깐 해보다가 잘 안되어서 덮어두고 있었는데...
: : 질문 올라오는것 보고 다시 해봤습니다.
: :
: : QuickRep 버젼은 정확히 잘 모르겠고  Builder6.0 pro 깔면 기본적으로 설치되는 버젼으로
: : Builder6.0에서 테스트 해 봤습니다.
: :
: :
: : [Spy로 정보 획득]
: : 먼저 Preview하면 보여지는 폼을 spy로 확인해 보니 ..
: :
: : 메인프레임     =  TQRStandardPreview 였습니다.
: : 툴바               =  TToolBar
: : 보여지는 부분 =  TQRPreview
: :
: : 이었습니다.
: :
: : 저 ToolBar의 포인터만 찾으면 되는데...
: : QuickReport 소소는 없도 hpp밖에 없으니...
: : FindWindow로 찾는것은 HWND핸들뿐이구...
: :
: : [예전에..]
: :  예전에 preview폼이  맨처음에 보일때
: :  Zoom to Width 가 아닌 Zoom to Fit로 보이게 하기 위해서
: :
: :  1. FindWindow 로   TQRStandardPreview 의  HWND 핸들을 찾고
: :  2. 다시 FindWindowEx로 TQRStandardPreview 에서 TToolBar 핸들을 찾은다음
: :  3. SendMessage로 WM_LBUTTONDOWN , WM_LBUTTONUP 메세지를 보내 toolbar에서 첫번째 버튼이 클릭되도록 하여서
: :     구현한적이 있습니다.
: :
: :
: : [해결 방법]
: : 
: : 방법1.
: :    ; 아이디어 입니다.
: :    FindWindow , FindWindowEx  로  ToolBar 핸들을 찾은다음 WindowProc를 바꿔서 서브클래싱으로
: :    WM_LBUTTONDOWN , WM_LBUTTONUP 메세지를 보고.. LPARAM으로 들어오는 마우스 좌표를 보고 print부분이면
: :    return해버리는 방식으로 구현 가능할것 같습니다.
: :
: :
: : 방법2.
: :    ; 퀵리포트 해더파일( *.hpp)을 보다보니까..
: :      QRPrntr.hpp 의 TQRPrinter 클래스에 보니까
: :      PreviewControl라는게  private 멤버로  있더군요
: :
: :      그래서 FindWindow로 찾은  TQRStandardPreview 의 핸들과
: :      PreviewControl의 Handle을 비교해 봤습니다.
: : 
: :      결론은 같았습니다.  ===> 앗싸
: :
: :      자  이제 TQRStandardPreview 를 찾았으니
: :      TQRStandardPreview 에서 TToolBar * 를 찾는것은 금방이겠죠
: :
: :      TToolBar를 찾았으면 ToolBar의 12번째 TToolButton을 Visible=false 시키면 깔끔하더군요
: :      Enabled=false 해도 되구
: :      ToolBar->Buttons[11]->Visible=false;
: :   
: :      저도 이기능이 필요했는데...
: :      질문덕택에 해결했네요
: :
: : [참고사항]
: :
: : 1. PreviewControl 은  TQRPrinter 클래스의 private 멤버인데
: :    class의 private멤버 access하는 방법은 팁&트릭 게시판에 있습니다. 참고하시구요
: :
: :
: : 2. Preview 또는 PreviewModal등이 호출되기 전에는 
: :    TQuickPre 의 Printer 가 없다는것이 중요합니다.
: :  
: :    Preview 가 호출된 직후에
: :    위 방법1,방법2의 작업을 해줘야 합니다.
: :   
: :    요건  쓰레드 , 타이머, 포스트메세지 등의 방법이 있겠네요
: :
: : 그럼..
: :   
: :
: : 암흑사제 님이 쓰신 글 :
: : : QReport의 미리보기에서 프린트하는 것을 막을 려고 합니다.
: : : 어떻게 해야 하나요?

+ -

관련 글 리스트
52361 QReport의 미리보기 기능중에 프린트 하는 것을 막는 기능이 있나요? 암흑사제 1331 2008/02/20
52367     Re:QReport의 미리보기 기능중에 프린트 하는 것을 막는 기능이 있나요? 장성호 1901 2008/02/21
52374         구현에서는 어떻게 해야 하나요 죄송합니다. 초보입니다. 암흑사제 1551 2008/02/22
52379             Re:구현에서는 어떻게 해야 하나요 죄송합니다. 초보입니다. 장성호 2216 2008/02/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.