第一个问题:
我需要在vc程序中使用水晶报表,但是我不能打开现有的报表,代码如下:
变量定义:
//水晶报表变量IApplicationPtr m_Application;IReportPtr m_Report;//水晶报表控件变量,在对话框中加入该控件CCrystalReportViewer9 m_CRViewer1;
程序执行
this->m_Application.CreateInstance(__uuidof(Application));
m_Report=m_Application->OpenReport("C:\\Report1.rpt");
但是我在open 一个rpt文件的时候发现了错误!不知道怎么解决,编译的时候没有任何错误,但是执行的时候就是由非法操作,该rpt文件存在,并且可使用、打开。为什么在这里不能用?请帮忙!
第二个问题:
我的代码不能进入消息处理函数。
RESOURCE.H
#define ID_STARTBUT 10000
#define ID_ENDBUT 10010
testdlg.h
afx_msg void OnFileMenuItems(UINT nID,NMHDR * pNotifyStruct, LRESULT * pResult);
testdlg.cpp
消息响应部分
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CTestDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
ON_NOTIFY_RANGE( NM_DBLCLK, ID_STARTBUT, ID_ENDBUT,OnFileMenuItems )
END_MESSAGE_MAP()
动态按钮的产生部分
for (int i=10000;i<=10010;i++)
{ str.Format("%d",i);
DWORD dwStyle = WS_CHILDWINDOW | WS_VISIBLE | BS_PUSHBUTTON;
m_hButton = ::CreateWindow("BUTTON",TEXT(str),dwStyle,
100*j,0,70,40,this->m_hWnd,NULL,AfxGetInstanceHandle(),(LPVOID)i);
j++;
::ShowWindow(m_hButton,SW_SHOW);
}
按钮的id和ID_STARTBUT,ID_ENDBUT是对应的,而且在按钮的cation上可以看到了
消息处理部分:
void CTestDlg::OnFileMenuItems(UINT nID,NMHDR * pNotifyStruct, LRESULT * pResult)
{ CString temp;
temp.Format("%d",nID);
AfxMessageBox(temp);
}
就是这一部分,怎么也不能进行处理,不知道是哪里出了问题
难道我在定义的时候资源的时候,一定要连续的存在的?如果我需要定义30个按钮,就要定义30个资源变量?
我需要在vc程序中使用水晶报表,但是我不能打开现有的报表,代码如下:
变量定义:
//水晶报表变量IApplicationPtr m_Application;IReportPtr m_Report;//水晶报表控件变量,在对话框中加入该控件CCrystalReportViewer9 m_CRViewer1;
程序执行
this->m_Application.CreateInstance(__uuidof(Application));
m_Report=m_Application->OpenReport("C:\\Report1.rpt");
但是我在open 一个rpt文件的时候发现了错误!不知道怎么解决,编译的时候没有任何错误,但是执行的时候就是由非法操作,该rpt文件存在,并且可使用、打开。为什么在这里不能用?请帮忙!
第二个问题:
我的代码不能进入消息处理函数。
RESOURCE.H
#define ID_STARTBUT 10000
#define ID_ENDBUT 10010
testdlg.h
afx_msg void OnFileMenuItems(UINT nID,NMHDR * pNotifyStruct, LRESULT * pResult);
testdlg.cpp
消息响应部分
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CTestDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
ON_NOTIFY_RANGE( NM_DBLCLK, ID_STARTBUT, ID_ENDBUT,OnFileMenuItems )
END_MESSAGE_MAP()
动态按钮的产生部分
for (int i=10000;i<=10010;i++)
{ str.Format("%d",i);
DWORD dwStyle = WS_CHILDWINDOW | WS_VISIBLE | BS_PUSHBUTTON;
m_hButton = ::CreateWindow("BUTTON",TEXT(str),dwStyle,
100*j,0,70,40,this->m_hWnd,NULL,AfxGetInstanceHandle(),(LPVOID)i);
j++;
::ShowWindow(m_hButton,SW_SHOW);
}
按钮的id和ID_STARTBUT,ID_ENDBUT是对应的,而且在按钮的cation上可以看到了
消息处理部分:
void CTestDlg::OnFileMenuItems(UINT nID,NMHDR * pNotifyStruct, LRESULT * pResult)
{ CString temp;
temp.Format("%d",nID);
AfxMessageBox(temp);
}
就是这一部分,怎么也不能进行处理,不知道是哪里出了问题
难道我在定义的时候资源的时候,一定要连续的存在的?如果我需要定义30个按钮,就要定义30个资源变量?
一、导入水晶报表使用的动态联接库:根据实际修改文件路径。
#import "C:\Documents and Settings\Administrator\桌面\cr\craxdrt9.dll" no_namespace二、定义接口指针变量
//水晶报表变量
IApplicationPtr m_Application;
IReportPtr m_Report;//水晶报表控件变量,在对话框中加入该控件
CCrystalReportViewer9 m_CRViewer1;三、具体实现步骤
//实例化m_Application
m_Application.CreateInstance (__uuidof(Application));//获取m_Report变量
//staff.rpt为通过向导建立的报表文件,数据库采用SQL Server 7.0
m_Report =m_Application->OpenReport ("C:\\Documents and Settings\\Administrator\\桌面\\cr\\debug\\staff.rpt");//设置报表标题
m_Report->put_ReportTitle (_bstr_t("Title"));//设置数据库连接变量
//数据库服务器(local),数据库名staff,用户名sa,密码sa
m_Report->Database ->Tables ->Item [1]->SetLogOnInfo("(local)","staff","sa","sa");//设置检索SQL命令
m_Report->put_SQLQueryString ((_bstr_t)"select * from person where id<'4' order by id");//不显示重复字段
m_Report->PutEnableSelectDistinctRecords (TRUE);//设置检索条件,采用水晶报表语法,功能同设置检索SQL命令
m_Report->PutRecordSelectionFormula ((_bstr_t)"{person.id}='1'");//设置报表作者
m_Report->PutReportAuthor ("xiaojin");//将m_Report与报表控件连接
m_CRViewer1.SetReportSource(m_Report);//显示报表工具条
m_CRViewer1.SetDisplayToolbar (TRUE);//不显示报表左边的分组树
m_CRViewer1.SetDisplayGroupTree (FALSE);//不显示控件边框
m_CRViewer1.SetDisplayBorder (FALSE);//刷新数据
m_CRViewer1.Refresh ();//显示报表内容
m_CRViewer1.ViewReport(); 这样,漂亮的水晶报表就显示出来了。程序异常处理部分省略,请自行加入。用的是水晶报表8.0,需做一些改动。craxdrt9.dll改为craxdrt.dll,m_CRViewer1.Refresh ();去掉。另外9.0的OpenReport与8.0的有些不同。代码如下:
IApplicationPtr m_Application;
IReportPtr m_Report;
VARIANT dummy;
VariantInit (&dummy);
dummy.vt = VT_EMPTY;
m_Application.CreateInstance (__uuidof(Application));
m_Report = m_Application->OpenReport("d:\\my document\\ip.rpt", dummy);
m_view.SetReportSource(m_Report);
// m_view.Refresh();
m_view.ViewReport();