📄 cnreport.cpp
字号:
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 + -