⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cnreport.cpp

📁 自定义的报表
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "CNReport.h"
#include "PreviewWin.h"
#include "MathParser.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
/**************************************
*  表格式报表处理系统  for C++Builder *
*  简称:CReport V3.0  for C++Builder *
*  原创:郭家骏、王寒松               *
*  改写:邓才参                       *
*  最后修改日期:2001.11.11           *
***************************************/
int pgw;
int pgh;
int scale;
int IsPrint;    //用于是否已安装打印机
TCNReportCell* cellline_d; //用于保存选中单元格的属性 1999.1.25
TCNReportCell* celldisp;   //用于显示Mouse位置的单元格属性

bool __fastcall DeleteFiles(AnsiString FilePath, AnsiString FileMask)
{
        WORD Attributes;
        TSearchRec Rec;
        try{
                FindFirst(FilePath + "\\" + FileMask,faAnyFile,Rec);
                if( Rec.Name != "")
                {
                        Attributes = FileGetAttr(FilePath + "\\" + Rec.Name);
                        FileSetAttr(FilePath + "\\" + Rec.Name, Attributes);
                        DeleteFile(FilePath + "\\" + Rec.Name);
                        while( !FindNext(Rec) )
                        {
                                Attributes = FileGetAttr(FilePath + "\\" + Rec.Name);
                                FileSetAttr(FilePath + "\\" + Rec.Name, Attributes);
                                DeleteFile(FilePath + "\\" + Rec.Name);
                        }
                }
                FindClose(Rec);
        }
        catch(...)
        {
                return False;
        }
        return True;
}
/**********************************************************************
        以下为: TCNReportControl 类的实现
 **********************************************************************/
__fastcall TCNReportControl::TCNReportControl(TComponent* AOwner)
        :TWinControl(AOwner)
{
        HDC hDesktopDC;
        int nPixelsPerInch;

        // 设定为无光标,防止光标闪烁。
        //  Cursor := crNone;

        FPreviewStatus = False;

        Color = clWhite;
        FLineList = new TList;
        FSelectCells = new TList;

        celldisp = NULL;
        cellline_d = NULL;
        FEditCell = NULL;

        FNewTable = True;
        FDataLine = 57; //廖伯志 1999.1.16
        FTablePerPage = 1; //

        pgw = 0;
        pgh = 0;

        FReportScale = 100;
        scale = FReportScale;
        FPageWidth = 0;
        FPageHeight = 0;

        hDesktopDC = GetDC(0);
        nPixelsPerInch = GetDeviceCaps(hDesktopDC, LOGPIXELSX);

        FLeftMargin1 = 20;
        FRightMargin1 = 20;
        FTopMargin1 = 20;
        FBottomMargin1 = 20;

        FLeftMargin = trunc(nPixelsPerInch * FLeftMargin1 / 25 + 0.5);
        FRightMargin = trunc(nPixelsPerInch * FRightMargin1 / 25 + 0.5);
        FTopMargin = trunc(nPixelsPerInch * FTopMargin1 / 25 + 0.5);
        FBottomMargin = trunc(nPixelsPerInch * FBottomMargin1 / 25 + 0.5);

        ReleaseDC(0, hDesktopDC);

        // 鼠标操作支持
        FMousePoint.x = 0;
        FMousePoint.y = 0;

        // 编辑、颜色及字体
        FEditWnd = INVALID_HANDLE_VALUE;
        FEditBrush = INVALID_HANDLE_VALUE;
        FEditFont = INVALID_HANDLE_VALUE;
        CalcWndSize();

}
__fastcall TCNReportControl::~TCNReportControl(void)
{
        TCNReportLine *ThisLine;

        delete FSelectCells;
        FSelectCells = NULL;

        for (int I = FLineList->Count - 1 ; I >= 0; I--)
        {
                ThisLine = (TCNReportLine *)FLineList->Items[I];
                delete ThisLine;
        }

        delete FLineList;
        FLineList = NULL;
}

void __fastcall TCNReportControl::CreateWnd(void)
{
        TWinControl::CreateWnd();

        if (Handle != INVALID_HANDLE_VALUE)
        {
                SetClassLong(Handle, GCL_HCURSOR, 0);
        }

}
void __fastcall TCNReportControl::SaveToFile(AnsiString FileName)
{
        TFileStream *TargetFile;
        WORD FileFlag;
        int Count;
        int I, J, K;
        TCNReportLine *ThisLine;
        TCNReportCell *ThisCell, *TempCell;
        int TempInteger;
        char TempPChar[MAX_TEXT_LEN];

        TargetFile = new TFileStream(FileName, fmOpenWrite|fmCreate);

        try{
                // 窗口大小
                FileFlag = CN_SIGN;
                //文件标志
                TargetFile->Write((char *)&FileFlag, sizeof(FileFlag));
                FReportScale = 100;
                scale = FReportScale; //1999.1.23

                //页面比例及页面宽、页面高
                TargetFile->Write((char *)&FReportScale, sizeof(FReportScale));
                TargetFile->Write((char *)&FPageWidth, sizeof(FPageWidth));
                TargetFile->Write((char *)&FPageHeight, sizeof(FPageHeight));

                //页边界
                TargetFile->Write((char *)&FLeftMargin, sizeof(FLeftMargin));
                TargetFile->Write((char *)&FTopMargin, sizeof(FTopMargin));
                TargetFile->Write((char *)&FRightMargin, sizeof(FRightMargin));
                TargetFile->Write((char *)&FBottomMargin, sizeof(FBottomMargin));

                TargetFile->Write((char *)&FLeftMargin1, sizeof(FLeftMargin));
                TargetFile->Write((char *)&FTopMargin1, sizeof(FTopMargin));
                TargetFile->Write((char *)&FRightMargin1, sizeof(FRightMargin));
                TargetFile->Write((char *)&FBottomMargin1, sizeof(FBottomMargin));

                //
                TargetFile->Write((char *)&FNewTable, sizeof(FNewTable));
                TargetFile->Write((char *)&FDataLine, sizeof(FDataLine));
                TargetFile->Write((char *)&FTablePerPage, sizeof(FTablePerPage));

                // 多少行
                Count = FLineList->Count;
                TargetFile->Write((char *)&Count, sizeof(Count));

                // 每行有多少个CELL
                for (I = 0; I < FLineList->Count; I++)
                {
                        ThisLine = (TCNReportLine *)FLineList->Items[I];
                        Count = ThisLine->FCells->Count;
                        TargetFile->Write((char *)&Count, sizeof(Count));
                }

                // 每行的属性
                for (I = 0; I < FLineList->Count; I++)
                {
                        ThisLine = (TCNReportLine *)FLineList->Items[I];

                        TargetFile->Write((char *)&ThisLine->FIndex, sizeof(ThisLine->FIndex));
                        TargetFile->Write((char *)&ThisLine->FMinHeight, sizeof(ThisLine->FMinHeight));
                        TargetFile->Write((char *)&ThisLine->FDragHeight, sizeof(ThisLine->FDragHeight));
                        TargetFile->Write((char *)&ThisLine->FLineTop, sizeof(ThisLine->FLineTop));
                        TargetFile->Write((char *)&ThisLine->FLineRect, sizeof(ThisLine->FLineRect));

                        // 每个CELL的属性
                        for (J = 0; J < ThisLine->FCells->Count; J ++)
                        {
                                ThisCell = (TCNReportCell *)ThisLine->FCells->Items[J];

                                // TargetFile->Write Cell's Property here;
                                TargetFile->Write((char *)&ThisCell->FLeftMargin, sizeof(ThisCell->FLeftMargin));
                                TargetFile->Write((char *)&ThisCell->FCellIndex, sizeof(ThisCell->FCellIndex));

                                TargetFile->Write((char *)&ThisCell->FCellLeft, sizeof(ThisCell->FCellLeft));
                                TargetFile->Write((char *)&ThisCell->FCellWidth, sizeof(ThisCell->FCellWidth));

                                TargetFile->Write((char *)&ThisCell->FCellRect, sizeof(ThisCell->FCellRect));
                                TargetFile->Write((char *)&ThisCell->FTextRect, sizeof(ThisCell->FTextRect));

                                TargetFile->Write((char *)&ThisCell->FDragCellHeight, sizeof(ThisCell->FDragCellHeight));
                                TargetFile->Write((char *)&ThisCell->FMinCellHeight, sizeof(ThisCell->FMinCellHeight));
                                TargetFile->Write((char *)&ThisCell->FRequiredCellHeight, sizeof(ThisCell->FRequiredCellHeight));

                                TargetFile->Write((char *)&ThisCell->FLeftLine, sizeof(ThisCell->FLeftLine));
                                TargetFile->Write((char *)&ThisCell->FLeftLineWidth, sizeof(ThisCell->FLeftLineWidth));

                                TargetFile->Write((char *)&ThisCell->FTopLine, sizeof(ThisCell->FTopLine));
                                TargetFile->Write((char *)&ThisCell->FTopLineWidth, sizeof(ThisCell->FTopLineWidth));

                                TargetFile->Write((char *)&ThisCell->FRightLine, sizeof(ThisCell->FRightLine));
                                TargetFile->Write((char *)&ThisCell->FRightLineWidth, sizeof(ThisCell->FRightLineWidth));

                                TargetFile->Write((char *)&ThisCell->FBottomLine, sizeof(ThisCell->FBottomLine));
                                TargetFile->Write((char *)&ThisCell->FBottomLineWidth, sizeof(ThisCell->FBottomLineWidth));

                                TargetFile->Write((char *)&ThisCell->FDiagonal, sizeof(ThisCell->FDiagonal));

                                TargetFile->Write((char *)&ThisCell->FTextColor, sizeof(ThisCell->FTextColor));
                                TargetFile->Write((char *)&ThisCell->FBackGroundColor, sizeof(ThisCell->FBackGroundColor));

                                TargetFile->Write((char *)&ThisCell->FHorzAlign, sizeof(ThisCell->FHorzAlign));
                                TargetFile->Write((char *)&ThisCell->FVertAlign, sizeof(ThisCell->FVertAlign));

                                Count = ThisCell->FCellText.Length();

                                TargetFile->Write((char *)&Count, sizeof(Count));

                                StrPCopy(TempPChar, ThisCell->FCellText);

                                TargetFile->Write(TempPChar,Count);

                                TargetFile->Write((char *)&ThisCell->FLogFont, sizeof(ThisCell->FLogFont));

                                // 属主CELL的行,列索引
                                if (ThisCell->FOwnerCell != NULL)
                                {
                                        TargetFile->Write((char *)&ThisCell->FOwnerCell->OwnerLine->FIndex, sizeof(ThisCell->FOwnerCell->OwnerLine->FIndex));
                                        TargetFile->Write((char *)&ThisCell->FOwnerCell->FCellIndex, sizeof(ThisCell->FOwnerCell->FCellIndex));
                                }
                                else
                                {
                                        TempInteger = -1;
                                        TargetFile->Write((char *)&TempInteger, sizeof(TempInteger));
                                        TargetFile->Write((char *)&TempInteger, sizeof(TempInteger));
                                }
                                Count = ThisCell->FCellsList->Count;
                                TargetFile->Write((char *)&Count, sizeof(Count));

                                for (K = 0; K < ThisCell->FCellsList->Count; K++)
                                {
                                        TempCell = (TCNReportCell *)ThisCell->FCellsList->Items[K];
                                        TargetFile->Write((char *)&TempCell->OwnerLine->FIndex, sizeof(TempCell->OwnerLine->FIndex));
                                        TargetFile->Write((char *)&TempCell->FCellIndex, sizeof(TempCell->FCellIndex));
                                }
                        }
                }
        }
        __finally{
                delete TargetFile;
        };
}
void __fastcall TCNReportControl::LoadFromFile(AnsiString FileName)
{
        TFileStream *TargetFile;
        WORD FileFlag;
        int Count1, Count2, Count3;
        int I, J, K;
        TCNReportLine *ThisLine;
        TCNReportCell *ThisCell, *TempCell;
        int TempInteger;
        char TempPChar[MAX_TEXT_LEN];
        TargetFile = new TFileStream(FileName, fmOpenRead);

        try{
                TargetFile->Read((char *)&FileFlag, sizeof(FileFlag));
                if (FileFlag != CN_SIGN )
                {
                        ShowMessage("打开文件错误");
                        return;
                }

                RemoveAllSelectedCell();

                for (I = 0; I < FLineList->Count; I++)
                {
                        ThisLine = (TCNReportLine *)FLineList->Items[I];
                        delete ThisLine;
                }

                FLineList->Clear();

                if (IsWindowVisible(FEditWnd)) DestroyWindow(FEditWnd);

                TargetFile->Read((char *)&FReportScale, sizeof(FReportScale));
                FReportScale = 100;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -