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