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

📄 cnreport.cpp

📁 自定义的报表
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                if (LineArray->Items[i] != NULL)
                {
                        ThisLineRect = ((TCNReportLine *)FLineList->Items[i])->LineRect;
                        ThisLineRect.Right  = ThisLineRect.Right + 1;
                        ThisLineRect.Bottom = ThisLineRect.Bottom + 1;
                        InvalidateRect(Handle, &ThisLineRect, False);

                        for (j = 0; j < ((TCNReportLine *)FLineList->Items[i])->FCells->Count; j++)
                        {
                                ThisCell = (TCNReportCell *)(((TCNReportLine *)FLineList->Items[i])->FCells->Items[j]);
                                if (ThisCell->OwnerCell != NULL)
                                        ThisCell->OwnerCell->RemoveOwnedCell(ThisCell);
                                if (ThisCell->OwnedCellCount > 0)
                                        ThisCell->RemoveAllOwnedCell();
                        }
                        delete ((TCNReportLine *)FLineList->Items[i]);
                        FLineList->Delete(i);
                }
        }

        delete LineArray;

        UpdateLines();
}
void __fastcall TCNReportControl::InsertCell(void)
{
        TCNReportCell *ThisCell, *NewCell;
        TCNReportLine *ThisLine;
        if (FSelectCells->Count != 1 ) return;

        ThisCell = (TCNReportCell *)FSelectCells->Items[0];
        ThisLine = ThisCell->OwnerLine;
        NewCell  = new TCNReportCell;
        NewCell->CopyCell(ThisCell, False);
        ThisLine->FCells->Insert(ThisLine->FCells->IndexOf(ThisCell), NewCell);
        UpdateLines();
}
void __fastcall TCNReportControl::DeleteCell(void)
{
        int I, J;
        TCNReportCell *ThisCell, *TempCell;
        TCNReportLine *ThisLine;

        if (FSelectCells->Count <= 0 ) return;

        for (I = FSelectCells->Count - 1; I >= 0; I--)
        {
                ThisCell = (TCNReportCell *)FSelectCells->Items[I];

                for ( J = ThisCell->FCellsList->Count - 1; J >= 0; J--)
                {
                        TempCell = (TCNReportCell *)ThisCell->FCellsList->Items[J];
                        TempCell->OwnerLine->FCells->Remove(TempCell);
                        delete TempCell;
                }

                ThisCell->FCellsList->Clear();

                ThisCell->OwnerLine->FCells->Remove(ThisCell);
                RemoveSelectedCell(ThisCell);
                delete ThisCell;
        }
        FSelectCells->Clear();

        UpdateLines();

        for (I = FLineList->Count - 1; I >= 0; I--)
        {
                ThisLine = (TCNReportLine *)FLineList->Items[I];
                if (ThisLine->FCells->Count <= 0 )
                {
                        FLineList->Remove(ThisLine);
                        delete ThisLine;
                }
        }
}
void __fastcall TCNReportControl::AddCell(void)
{
        TCNReportLine *ThisLine;
        TCNReportCell *ThisCell, *NewCell;

        if (FSelectCells->Count != 1 ) return;

        ThisCell = (TCNReportCell *)FSelectCells->Items[0];
        ThisLine = ThisCell->OwnerLine;
        NewCell = new TCNReportCell;
        NewCell->OwnerLine = ThisLine;
        NewCell->CopyCell( (TCNReportCell *)(ThisLine->FCells->Items[ThisLine->FCells->Count - 1]), False);
        NewCell->CellLeft = ((TCNReportCell *)(ThisLine->FCells->Items[ThisLine->FCells->Count - 1]))->CellRect.Right;
        ThisLine->FCells->Add(NewCell);

        UpdateLines();

}
void __fastcall TCNReportControl::CombineCell(void)
{
        int I, J, Count;
        TCNReportCell *OwnerCell;
        TList *LineArray;
        TCNReportCell *ThisCell, *FirstCell;
        TCNReportLine *ThisLine;
        int TempLeft, TempRight;
        TList *CellsToDelete;
        TList *CellsToCombine;
        TCNMyRect *TempRect;

        // 判断是否可以合并

        // 选中的CELL数量小于2
        if (FSelectCells->Count < 2 ) return;


        Count = FSelectCells->Count - 1;

        for ( I = 0 ; I <=  Count; I++)
        {
                ThisCell = (TCNReportCell *)FSelectCells->Items[I];

                for (J = 0 ; J < ThisCell->FCellsList->Count; J++)
                {
                        FSelectCells->Add(ThisCell->FCellsList->Items[J]);
                }
        }
        // 各个行的宽度不同

        LineArray = new TList;
        for (I = 0 ; I < FLineList->Count; I ++)
        {
                TempRect = new TCNMyRect;
                TempRect->Left = 65535;
                TempRect->Top = 0;
                TempRect->Right = 0;
                TempRect->Bottom = 0;
                LineArray->Add(TempRect);
        }

        for (I = 0 ; I < FSelectCells->Count; I++)
        {
                ThisCell = (TCNReportCell *)FSelectCells->Items[I];
                if (ThisCell->CellLeft < ((TCNMyRect *)LineArray->Items[ThisCell->OwnerLine->Index])->Left)
                        ((TCNMyRect *)LineArray->Items[ThisCell->OwnerLine->Index])->Left = ThisCell->CellLeft;

                if( (ThisCell->CellRect.Right) > ((TCNMyRect *)LineArray->Items[ThisCell->OwnerLine->Index])->Right )
                        ((TCNMyRect *)LineArray->Items[ThisCell->OwnerLine->Index])->Right = ThisCell->CellRect.Right;
        }
        TempLeft = 0;
        TempRight = 0;

        for (I = 0 ; I < LineArray->Count; I++)
        {
                if ( ((TCNMyRect *)LineArray->Items[I])->Left == 65535)
                        continue;

                if ((TempLeft == 0) && (TempRight == 0))
                {
                        TempLeft  = ((TCNMyRect *)LineArray->Items[I])->Left;
                        TempRight = ((TCNMyRect *)LineArray->Items[I])->Right;
                }
                else
                {
                        if (TempLeft  != ((TCNMyRect *)LineArray->Items[I])->Left) return;
                        if (TempRight != ((TCNMyRect *)LineArray->Items[I])->Right) return;
                }
        }
        // 将同一行上的单元格合并
        CellsToDelete  = new TList;
        CellsToCombine = new TList;

        for (I = 0 ; I < LineArray->Count ; I++)
        {
                if ( ((TCNMyRect *)LineArray->Items[I])->Left == 65535)
                        continue;

                CellsToDelete->Clear();

                FirstCell = NULL;
                ThisLine = (TCNReportLine *)FLineList->Items[I];

                for (J = 0; J < ThisLine->FCells->Count ; J ++)
                {
                        ThisCell = (TCNReportCell *)ThisLine->FCells->Items[J];
                        if (IsCellSelected(ThisCell))
                        {
                                if (FirstCell == NULL)
                                {
                                        FirstCell = ThisCell;
                                        CellsToCombine->Add(ThisCell);
                                }
                                else
                                {
                                        FirstCell->CellWidth = FirstCell->CellWidth + ThisCell->CellWidth;
                                        CellsToDelete->Add(ThisCell);
                                }
                        }
                }
                for (J = CellsToDelete->Count - 1; J >= 0; J --)
                {
                        ThisLine->FCells->Remove(CellsToDelete->Items[J]);
                        RemoveSelectedCell((TCNReportCell *)CellsToDelete->Items[J]);
                        delete ((TCNReportCell *)CellsToDelete->Items[J]);
                }
        }

        delete CellsToDelete;

        // 合并同一列的单元格
        for ( I = 0 ; I < CellsToCombine->Count; I++)
        {
                if (I > 0 )
                {
                        ((TCNReportCell *)CellsToCombine->Items[0])->AddOwnedCell( ((TCNReportCell *)CellsToCombine->Items[I]));
                }
                InvalidateRect(Handle, &(((TCNReportCell *)FSelectCells->Items[I])->CellRect), False);
        }

        while (LineArray->Count > 0)
        {
                delete ((TCNMyRect *)LineArray->Items[0]);
                LineArray->Delete(0);
        }
        delete LineArray;

        OwnerCell = (TCNReportCell *)CellsToCombine->Items[0];
        RemoveAllSelectedCell();
        AddSelectedCell(OwnerCell);
        UpdateLines();

}
void __fastcall TCNReportControl::SplitCell(void)
{
        TCNReportCell *TempCell;
        int I;

        if (CanSplit())
        {
                TempCell = ((TCNReportCell *)FSelectCells->Items[0]);
                RemoveAllSelectedCell();

                AddSelectedCell(TempCell);

                for ( I = 0; I < TempCell->FCellsList->Count; I++)
                        InvalidateRect(Handle, &(((TCNReportCell *)TempCell->FCellsList->Items[I])->CellRect), False);

                TempCell->RemoveAllOwnedCell();

                UpdateLines();
        }
}
void __fastcall TCNReportControl::VSplitCell(int Number)
{
        TCNReportCell *ThisCell, *TempCell, *TempCell2;
        int I, J, CellWidth, MaxCellCount;

        if (FSelectCells->Count != 1) return;

        ThisCell = (TCNReportCell *)FSelectCells->Items[0];

        InvalidateRect(Handle, &(ThisCell->CellRect), False);

        MaxCellCount = trunc((ThisCell->CellRect.Right - ThisCell->CellRect.Left) / 12 + 0.5);

        if (MaxCellCount > Number) MaxCellCount = Number;

        CellWidth = trunc((ThisCell->CellRect.Right - ThisCell->CellRect.Left) / MaxCellCount + 0.5);

        ThisCell->CellWidth = CellWidth;

        for( I = 0; I < MaxCellCount; I++)
        {
                if (I == 0 )
                {
                        ThisCell->CellWidth = CellWidth;
                        for (J = 0; J <  ThisCell->FCellsList->Count; J++)
                        {
                                ((TCNReportCell *)ThisCell->FCellsList->Items[J])->CellWidth = CellWidth;
                        }

                        continue;
                }
                TempCell = new TCNReportCell;
                TempCell->CopyCell(ThisCell, False);
                TempCell->OwnerLine = ThisCell->OwnerLine;

                if ( (ThisCell->OwnerLine->FCells->IndexOf(ThisCell)) == (ThisCell->OwnerLine->FCells->Count - 1) )
                        TempCell->OwnerLine->FCells->Add(TempCell);
                else
                        TempCell->OwnerLine->FCells->Insert(ThisCell->OwnerLine->FCells->IndexOf(ThisCell) + 1, TempCell);

                for (J = 0 ; J < ThisCell->FCellsList->Count ; J++)
                {
                        TempCell2 = new TCNReportCell;
                        TempCell2->CopyCell(TempCell, False);
                        TempCell->AddOwnedCell(TempCell2);
                        TempCell2->OwnerLine = ((TCNReportCell *)ThisCell->FCellsList->Items[J])->OwnerLine;

                        if ((ThisCell->OwnerLine->FCells->IndexOf(ThisCell)) == (ThisCell->OwnerLine->FCells->Count - 1) )
                                ((TCNReportCell *)ThisCell->FCellsList->Items[J])->OwnerLine->FCells->Add(TempCell2);
                        else
                                ((TCNReportCell *)ThisCell->FCellsList->Items[J])->OwnerLine->FCells->Insert(
                                                ((TCNReportCell *)ThisCell->FCellsList->Items[J])->OwnerLine->FCells->IndexOf(
                                                ((TCNReportCell *)ThisCell->FCellsList->Items[J])) + 1, TempCell2);
                }
        }
        UpdateLines();
}
bool __fastcall TCNReportControl::CanSplit(void)
{
        if (FSelectCells->Count == 1)
        {
                if (((TCNReportCell *)FSelectCells->First())->FCellsList->Count > 0 )
                        return True;
                else
                        return False;

⌨️ 快捷键说明

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