Builder 6.0 QuickRep를 이용하여 리포트를 종종만든다.
간단한 형식의 리포트는 TQuickRep 를 이용하지만
보다 복잡한 형식의 문서는 TQuickRep 여개를 묶을수 있는 TQRCompositeReport 이용한다.
문서를 미리보기할때
TQuickRep 에는 PreviewModal() 함수가 있는데
이상하게 TQRCompositeReport 에는 Preview만 있을뿐 PreviewModal() 이 없다.
TQRCompositeReport 의 Preview()로 리포터를 띄우면
아랫쪽에 다른폼에 포커스가 갈 수 있게 되고 , Alt+Tab을 눌렀거나
다른프로그램에 갔다가 왔을경우 Prewview폼이 뒤로가버리는경우가 발생하곤 한다.
TQRCompositeReport 미리보기를 Modal로 띄울수 없을까?
그동안 방법을 못찼다가 오늘 VCL의 TCustomForm의 ShowModal 코드를 보고 떠올랐다.
[원리]
1 . 현재 쓰레드의 모든 Window의 Handle , HWND를 Enabled = false 시킨후
2. TQRCompositeReport 를 Preview() 한다.
3. 그리고 TQRCompositeReport preview 폼이 close할때까지 기다리고
4. TQRCompositeReport preview 폼이 Close된후에
Enable = false 시킨 폼들을 다시 Enable=true시킨다.
========================[코드]===================================
HWND TaskActiveWindow;
bool __stdcall DoDisableWindow(HWND hWnd, LPARAM Data)
{
TList *Lst;
Lst=(TList *)Data;
if( (hWnd!=TaskActiveWindow) && IsWindowVisible(hWnd) && IsWindowEnabled(hWnd) )
{
Lst->Add(hWnd);
EnableWindow(hWnd, false);
}
return true;
}
//-------------------------------------------------------------------------
void __fastcall DisableTaskWindows(HWND ActiveHwnd , TList *lst)
{
try
{ TaskActiveWindow=ActiveHwnd;
EnumThreadWindows(GetCurrentThreadId(), (WNDENUMPROC)DoDisableWindow, (LPARAM)lst);
}
catch(...)
{
EnableTaskWindows(lst);
}
}
//-------------------------------------------------------------------------
void __fastcall EnableTaskWindows(TList *lst)
{
for(int i=0;iCount;i++)
{
EnableWindow(lst->Items[i], true);
}
}
//-------------------------------------------------------------------------
void __fastcall CmpReportShowModal(TQRCompositeReport *QRRep_Pages)
{
if(QRRep_Pages==NULL)return;
TList *Lst=new TList;
DisableTaskWindows(NULL,Lst);
QRRep_Pages->Preview();
EnableTaskWindows(Lst);
delete Lst;
}
//-------------------------------------------------------------------------
//사용예
void __fastcall TMain::Button1Click(TObject *Sender)
{
CmpReportShowModal(QRRep_Pages);
}
//---------------------------------------------------------------------------
이상입니다.
쓸만한 팁이 될런지요?
개인적으론 꼭 필요한것이었는데... 이제야 찾았습니다
그럼 즐플하세요
this->Enabled=false;
QRCompositeReport->Preview();
this->Enabled=true;