您好,登錄后才能下訂單哦!
Grid++report這是一個國產報表控件,從2.x就開始接觸,基本所有的學習資源,來自于自帶的文檔和例子。能學多少靠摸索。整體功能還是不錯的。他提供了3個控件,一個組件。在VC2015如果不想用控件,只想調用組件實現打印的功能,怎么辦呢?步驟如下:
(1)在afxstd.h文件中包含頭文件如下:
#include <atlbase.h> extern CComModule _Module; #include <atlcom.h>
(2)在程序APP文件中,聲明如下:
CComModule _Module;//全局變量 BOOL CMFCApplication1App::InitInstance() {//初始化報表COM組件 HRESULT hRes = ::CoInitialize(NULL); ATLASSERT(SUCCEEDED(hRes)); _Module.Init(0, AfxGetInstanceHandle()); //...... } int CMFCApplication1App::ExitInstance() {//重寫虛函數 _Module.Term(); ::CoUninitialize(); return CWinApp::ExitInstance(); }
(3)在對話框的頭文件中,加入如下:
#include "GetPath.h" #include "GRImport.h"
(4)當然需要先將Grid++report目錄下的Utility文件夾復制到工程目錄中,并在“項目屬性->VC++目錄->包含目錄”添加Utility文件夾。
(5)在對話框窗口類中添加成員變量:IGridppReportPtr m_pGridppReport;
//.h文件中添加 private: IGridppReportPtr m_pGridppReport; //.cpp文件中 BOOL CMFCApplication1Dlg::OnInitDialog() { //創建報表主對象 m_pGridppReport.CreateInstance(__uuidof(GridppReport)); ATLASSERT(m_pGridppReport != NULL); //加載模板文件 //從文件中載入報表模板數據到報表主對象 CString FileName = GetReportTemplatePath(_T("標準過磅單1.grf")); m_pGridppReport->LoadFromFile((LPCTSTR)FileName); //第(7)步還有代碼 }
void CMFCApplication1Dlg::OnDestroy() { CDialogEx::OnDestroy(); //釋放主報表對象 m_pGridppReport.Release(); } void CMFCApplication1Dlg::OnBnClickedButton1() { //直接打印報表 m_pGridppReport->Print(TRUE); } void CMFCApplication1Dlg::OnBnClickedButton2() { // 顯示預覽窗口 m_pGridppReport->Title = _T("標準過磅單1"); m_pGridppReport->PrintPreview(TRUE); }
(6)同時將導出庫復制到工程路徑下,即gregn.tlb 和 grdes.tlb
(7)要動態修改報表參數,可以新建一個類,繼承報表事件處理接口。
//Scale3DCReportEvent.h頭文件 #pragma once #include "GridppReportEventImpl.h" class CScale3DCReportEvent :public CGridppReportEventImpl { public: CScale3DCReportEvent(); ~CScale3DCReportEvent(); //初始化時自動調用 virtual void Initialize(void); //填充數據時自動調用 virtual void FetchRecord(void); //需要傳入主報表對象 IGridppReportPtr m_pGridppReport; //如果要推數據進報表,需要定義字段接口 IGRFieldPtr m_SerialNo; };
//Scale3DCReportEvent.cpp文件 #include "stdafx.h" #include "Scale3DCReportEvent.h" #include "GridppReportEventImpl.c" CScale3DCReportEvent::CScale3DCReportEvent() { } CScale3DCReportEvent::~CScale3DCReportEvent() { } void CScale3DCReportEvent::Initialize(void) { //報表中的參數賦值 m_pGridppReport->ParameterByName(_T("車號"))->AsString =_T("獵豹太空梭0X29"); //獲取字段接口 m_SerialNo = m_pReportView->m_pGridppReport->FieldByName("磅單流水號"); } void CScale3DCStandardReportEvent::FetchRecord(void) {//為字段接口賦值 for (INT i = 0;i< m_db.m_data.size(); i++) { m_pReportView->m_pGridppReport->DetailGrid->Recordset->Append(); FillRecord1(i); m_pReportView->m_pGridppReport->DetailGrid->Recordset->Post(); } }
(8)在相應的對話框頭文件中包含:
#include "Scale3DCReportEvent.h"//事件包裝類
#include "GetPath.h" //上面步驟已包含過
#include "GRImport.h"
在窗口類中聲明成員變量:
//.h文件中 private: CGridppReportEventImpl *m_pReportEvents;//報表事件代理指針 IGridppReportPtr m_pGridppReport;//報表主對象
在窗口的OnInitDialog()中添加如下代碼:
//創建事件響應對象 CComObject<CScale3DCReportEvent> *pEvent; CComObject<CScale3DCReportEvent>::CreateInstance(&pEvent); m_pReportEvents = pEvent; m_pReportEvents->AddRef(); pEvent->m_pGridppReport = m_pGridppReport;//事件代理指針 HRESULT hr = m_pReportEvents->DispEventAdvise(m_pGridppReport, &__uuidof(_IGridppReportEvents)); ATLASSERT( SUCCEEDED(hr) );
(9)在調用中添加ON_WM_DESTROY消息,第5步中添加過,所以繼續添加代碼:
//釋放事件代理 if (m_pReportEvents != NULL) { HRESULT hr = m_pReportEvents->DispEventUnadvise(m_pGridppReport, &__uuidof(_IGridppReportEvents)); m_pReportEvents->Release(); m_pReportEvents = NULL; ATLASSERT(SUCCEEDED(hr)); } //釋放主報表對象 m_pGridppReport.Release(); //釋放接口指針 m_pPrintViewer.Release();
(10)報表顯示控件的使用
m_printView.Stop(); CString FileName = GetReportTemplatePath(strFileName); m_pGridppReport->LoadFromFile((LPCTSTR)FileName); m_printView.put_Report(m_pGridppReport); m_printView.Refresh(); m_printView.Start(); m_printView.ZoomToHeight();
其他功能:
(1)報表設計器控件使用
在窗口上放上報表設計器控件,在窗口頭文件中加入:
#include "GetPath.h" #include "GRImport.h" #include "GridppReportEventImpl.h" //聲明成員變量: //關聯控件 CGrdesigner1 m_DesignReport; IGRDesignerPtr m_pDesigner;//接口指針 //傳入一個主報表對象 IGridppReportPtr m_pGridppReport; //添加宏聲明 DECLARE_EVENTSINK_MAP()
在窗口的.CPP文件中加入如下內容:
#include "GridppReportEventImpl.c" BEGIN_EVENTSINK_MAP(CScale3DCBillDeisgnDlg, CDialogEx) //{{AFX_EVENTSINK_MAP(CScale3DCBillDeisgnDlg) ON_EVENT(CScale3DCBillDeisgnDlg, IDC_GRDESIGNER1, 7 /* SaveReport */, OnSaveReport, VTS_NONE) //}}AFX_EVENTSINK_MAP ON_EVENT(Scale3DCDesignReportDlg, IDC_GRDESIGNER1, 5, DataChangeGrdesigner1, VTS_NONE)//報表內容已改變 END_EVENTSINK_MAP() VOID CScale3DCBillDeisgnDlg::OnSaveReport() {//響應報表設計控件上的按鈕事件 AfxMessageBox(_T("ok")); m_pDesigner->DefaultAction = FALSE; } void Scale3DCDesignReportDlg::DataChangeGrdesigner1() {//報表內容已改變 m_pDesigner->Dirty = TRUE; }
在窗口的OnInitDialog函數中加入如下代碼:
//報表設計容器指針 LPUNKNOWN spUnk = m_DesignReport.GetControlUnknown(); spUnk->QueryInterface(__uuidof(IGRDesigner), (void**)(&m_pDesigner)); ATLASSERT(m_pDesigner != NULL); m_pDesigner->Report = m_pGridppReport;//編定報表主對象
(2)Grid++report報表中使用js腳本
var price = Sender.DisplayText if (price == "") Sender.DisplayText = "0元" else Sender.DisplayText = price+"元"
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。