상속요?
무얼 어떻게 상속받아 만드신다는것인지?
제가 구현한것에 대해 설명해 드리겠습니다.
[조건]
- 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의 미리보기에서 프린트하는 것을 막을 려고 합니다.
: : : 어떻게 해야 하나요?