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

📄 cnreport.cpp

📁 自定义的报表
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                scale = 100;
                TargetFile->Read((char *)&FPageWidth, sizeof(FPageWidth));
                TargetFile->Read((char *)&FPageHeight, sizeof(FPageHeight));
                pgw = FPageWidth; //1999->1->23
                pgh = FPageHeight; //1999->1->23
                Width = FPageWidth;
                Height = FPageHeight;
                TargetFile->Read((char *)&FLeftMargin, sizeof(FLeftMargin));
                TargetFile->Read((char *)&FTopMargin, sizeof(FTopMargin));
                TargetFile->Read((char *)&FRightMargin, sizeof(FRightMargin));
                TargetFile->Read((char *)&FBottomMargin, sizeof(FBottomMargin));

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

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

                // 多少行
                TargetFile->Read((char *)&Count1, sizeof(Count1));
                for (I = 0 ; I < Count1; I++)
                {
                        ThisLine = new TCNReportLine;
                        ThisLine->FReportControl = this;
                        FLineList->Add(ThisLine);
                        TargetFile->Read((char *)&Count2, sizeof(Count2));
                        ThisLine->CreateLine(0, Count2, FRightMargin - FLeftMargin);
                }
                // 每行的属性
                for (I = 0 ; I < FLineList->Count; I++)
                {
                        ThisLine = (TCNReportLine *)FLineList->Items[I];

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

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

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

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

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

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

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

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

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

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

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

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

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

                                TargetFile->Read((char *)&Count1, sizeof(Count1));

                                memset(TempPChar,0,MAX_TEXT_LEN);

                                TargetFile->Read((char *)TempPChar,Count1);

                                ThisCell->FCellText = StrPas(TempPChar);

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

                                TargetFile->Read((char *)&Count1, sizeof(Count1));
                                TargetFile->Read((char *)&Count2, sizeof(Count2));

                                if ((Count1 < 0) || (Count2 < 0))
                                        ThisCell->FOwnerCell = NULL;
                                else
                                        ThisCell->FOwnerCell = (TCNReportCell *)(((TCNReportLine *)FLineList->Items[Count1])->FCells->Items[Count2]);

                                TargetFile->Read((char *)&Count3, sizeof(Count3));

                                for (K = 0; K < Count3 ; K++)
                                {
                                        TargetFile->Read((char *)&Count1, sizeof(Count1));
                                        TargetFile->Read((char *)&Count2, sizeof(Count2));
                                        ThisCell->FCellsList->Add((TCNReportCell *)(((TCNReportLine *)FLineList->Items[Count1])->FCells->Items[Count2]));
                                }
                        }
                }
        }
        __finally{
                delete TargetFile;
        };
        UpdateLines();
        CalcWndSize();
        Invalidate();
}
void __fastcall TCNReportControl::PrintIt(void)
{
        HDC hPrinterDC;
        int I, J;
        TCNReportLine *ThisLine;
        TCNReportCell *ThisCell;
        SIZE PageSize;
        TPrinter *CurPrinter = Printer();

        CurPrinter->Title = "Report";
        
        CurPrinter->BeginDoc();

        hPrinterDC = CurPrinter->Handle;
        SetMapMode(hPrinterDC, MM_ISOTROPIC);
        PageSize.cx = CurPrinter->PageWidth;
        PageSize.cy = CurPrinter->PageHeight;

        SetWindowExtEx(hPrinterDC, Width, Height, &PageSize);
        SetViewportExtEx(hPrinterDC, CurPrinter->PageWidth, CurPrinter->PageHeight, &PageSize);

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

                for(J = 0 ; J < ThisLine->FCells->Count; J++)
                {
                        ThisCell = (TCNReportCell *)ThisLine->FCells->Items[J];

                        if( ThisCell->OwnerCell == NULL )
                        {
                                ThisCell->PaintCell(hPrinterDC, True);
                        }
                }
        }
        CurPrinter->EndDoc();
}
void __fastcall TCNReportControl::ResetContent(void)
{
        TCNReportLine *ThisLine;

        FSelectCells->Clear();

        for (int i= FLineList->Count - 1; i >= 0; i--)
        {
                ThisLine = (TCNReportLine *)FLineList->Items[i];
                delete ThisLine;
        }
        FLineList->Clear();
        Refresh();
}
void __fastcall TCNReportControl::SetScale(const int Value)
{
        FReportScale = Value;
        scale = Value;
        CalcWndSize();
        Refresh();
}
void __fastcall TCNReportControl::CalcWndSize(void)
{
        HDC hClientDC;
        TPrinter *CurPrinter = Printer();

        IsPrint = 0;
        if (CurPrinter->Printers->Count <= 0)
        {
                IsPrint = 1; //未安装打印机
                if (pgw != 0 )
                {
                        FPageWidth = pgw;
                        FPageHeight= pgh;
                }
        }
        // 根据用户选择的纸来确定报表窗口的大小并对该窗口进行设置。
        hClientDC = GetDC(0);
        if (pgw == 0 )
        {
                if (IsPrint == 1 )
                {
                        FPageWidth  = 768; //未安装打印机时,设置默认纸宽
                        FPageHeight = 1058; //未安装打印机时,设置默认纸高
                }
                else
                {
                        FPageWidth  = trunc(CurPrinter->PageWidth / GetDeviceCaps(CurPrinter->Handle, LOGPIXELSX)
                                        * GetDeviceCaps(hClientDC, LOGPIXELSX) + 0.5);
                        FPageHeight = trunc(CurPrinter->PageHeight / GetDeviceCaps(CurPrinter->Handle, LOGPIXELSY)
                                        * GetDeviceCaps(hClientDC, LOGPIXELSY) + 0.5);
                }
        }
        pgw = FPageWidth;
        pgh = FPageHeight;
        Width  = trunc(FPageWidth * FReportScale / 100 + 0.5);
        Height = trunc(FPageHeight * FReportScale / 100 + 0.5);
        ReleaseDC(0, hClientDC);

}
void __fastcall TCNReportControl::NewTable(int ColNumber, int RowNumber)
{
        int I;
        TCNReportLine *FirstLine;
        TRect PaintRect;

        if (FLineList->Count > 0 )
        {
                Application->MessageBox("关闭正在编辑的文件后,才能建立新表格。", "警告", MB_OK | MB_ICONWARNING);
                return;
        }
        FirstLine = new TCNReportLine;
        FirstLine->ReportControl = this;
        FirstLine->LineTop = FTopMargin;
        FirstLine->CreateLine(FLeftMargin, ColNumber, Width - FLeftMargin - FRightMargin);
        FirstLine->Index = 0;
        FLineList->Add(FirstLine);

        PaintRect = FirstLine->LineRect;
        PaintRect.Right = PaintRect.Right + 1;
        PaintRect.Bottom = PaintRect.Bottom + 1;
        InvalidateRect(Handle, &PaintRect, False);

        ((TCNReportLine *)(FLineList->First()))->Index = 0;

        for (I = 1 ; I < RowNumber; I++)
        {
                AddLine();
                PaintRect = ((TCNReportLine *)FLineList->Items[I])->LineRect;
                PaintRect.Right = PaintRect.Right + 1;
                PaintRect.Bottom = PaintRect.Bottom + 1;
                InvalidateRect(Handle, &PaintRect, False);
        }
}
void __fastcall TCNReportControl::InsertLine(void)
{
        TCNReportLine *TempLine;

        if ( !CanInsert() ) return;

        TempLine = new TCNReportLine;
        TempLine->ReportControl = this;
        TempLine->LineTop = ((TCNReportCell *)FSelectCells->Items[0])->OwnerLine->LineTop;
        TempLine->CopyLine( ((TCNReportCell *)FSelectCells->Items[0])->OwnerLine, True);
        TempLine->Index = ((TCNReportCell *)FSelectCells->Items[0])->OwnerLine->Index;
        FLineList->Insert( ((TCNReportCell *)FSelectCells->Items[0])->OwnerLine->Index, TempLine);

        UpdateLines();
}
bool __fastcall TCNReportControl::CanInsert(void)
{
        return (FSelectCells->Count > 0);
}
void __fastcall TCNReportControl::AddLine(void)
{
        TCNReportLine *TempLine;

        if ( !CanAdd() ) return;

        TempLine = new TCNReportLine;
        TempLine->ReportControl = this;
        TempLine->LineTop = ((TCNReportLine *)FLineList->Last())->LineTop + ((TCNReportLine *)FLineList->Last())->LineHeight;
        TempLine->CopyLine( ((TCNReportLine *)FLineList->Last()), False);
        FLineList->Add(TempLine);
        TempLine->Index = FLineList->Count - 1;

        UpdateLines();
}
bool __fastcall TCNReportControl::CanAdd(void)
{
        return (FSelectCells->Count < 2);
}

void __fastcall TCNReportControl::DeleteLine(void)
{
        int i,j;
        TList *LineArray;
        TRect ThisLineRect;
        TCNReportCell *ThisCell;

        if( FSelectCells->Count < 1) return;

        LineArray = new TList;


        for( i = 0; i < FLineList->Count; i++)
        {
                LineArray->Add(NULL);
        }

        for( i = 0; i < FSelectCells->Count; i++)
        {
                LineArray->Items[ ((TCNReportCell *)FSelectCells->Items[i])->OwnerLine->Index] =((TCNReportCell *)FSelectCells->Items[i])->OwnerLine;
        }

        RemoveAllSelectedCell();

        for (i  = FLineList->Count - 1 ; i >= 0; i --)
        {

⌨️ 快捷键说明

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