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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[702] [Controls] QuickReport 의 TQRCompositeReport 미리보기를 Modal로 띄우기
장성호 [nasilso] 8915 읽음    2007-08-22 00:27
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);
}
//---------------------------------------------------------------------------





이상입니다.
쓸만한 팁이 될런지요?
개인적으론 꼭 필요한것이었는데... 이제야 찾았습니다

그럼 즐플하세요
장성호 [nasilso]   2007-08-29 18:02 X
그냥 현재 폼이 Modal폼이면  간단히 아래와 같이 해도 됩니다.

    this->Enabled=false;
    QRCompositeReport->Preview();
    this->Enabled=true;


+ -

관련 글 리스트
702 [Controls] QuickReport 의 TQRCompositeReport 미리보기를 Modal로 띄우기 장성호 8915 2007/08/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.