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

📄 yb_base.h

📁 网吧电量采集、温湿度采集串口通信实例程序
💻 H
📖 第 1 页 / 共 4 页
字号:
  __property long D111  = { read = fGetD111  , write = fSetD111  };
  __property long S000  = { read = fGetS000  , write = fSetS000  };
  __property __int64 TimeStamp = { read = fGetTStamp, write = fSetTStamp };

  __property int  MonthDays = { read = fGetMonthDays };
  __property bool IsLeap    = { read = fGetIsLeap    };
  __property bool IsValid   = { read = fIsValid      };

  __property DateX Date = { read = _xDate, write = _xDate };
  __property TimeX Time = { read = _xTime, write = _xTime };

  inline operator __int64() { return TimeStamp; }
  inline operator TDateTime() { return EncodeDate(Year,Month,Day) + EncodeTime(Hour,Minute,Second,0); }

  inline DateTimeX operator ++(int)    { DateTimeX tt(*this); TimeStamp++; return tt; }
  inline DateTimeX operator --(int)    { DateTimeX tt(*this); TimeStamp--; return tt; }
  inline DateTimeX operator ++()       { TimeStamp++; return *this;  }
  inline DateTimeX operator --()       { TimeStamp--; return *this;  }

  inline DateTimeX operator +=(long L) { TimeStamp+=L; return *this; }
  inline DateTimeX operator -=(long L) { TimeStamp-=L; return *this; }

  inline DateTimeX operator +(int   i) { DateTimeX tt(*this); tt.TimeStamp+=i; return tt; }
  inline DateTimeX operator -(int   i) { DateTimeX tt(*this); tt.TimeStamp-=i; return tt; }
  inline __int64   operator -(DateTimeX t) { return TimeStamp - t.TimeStamp;              }

  inline bool operator > (DateTimeX x) { return TimeStamp >  x.TimeStamp; }
  inline bool operator < (DateTimeX x) { return TimeStamp <  x.TimeStamp; }
  inline bool operator >=(DateTimeX x) { return TimeStamp >= x.TimeStamp; }
  inline bool operator <=(DateTimeX x) { return TimeStamp <= x.TimeStamp; }
  inline bool operator ==(DateTimeX x) { return TimeStamp == x.TimeStamp; }
  inline bool operator !=(DateTimeX x) { return TimeStamp != x.TimeStamp; }

  bool SetToSystem(void);

private:
  inline int  fGetMonth(void)   { return _xDate.Month;  }
  inline int  fGetDay(void)     { return _xDate.Day;    }
  inline int  fGetYear(void)    { return _xDate.Year;   }
  inline int  fGetHour(void)    { return _xTime.Hour;   }
  inline int  fGetMinute(void)  { return _xTime.Minute; }
  inline int  fGetSecond(void)  { return _xTime.Second; }
  inline long fGetD111(void)    { return _xDate.D111;   }
  inline long fGetS000(void)    { return _xTime.S000;   }
  inline int  fGetDOW(void)     { return _xDate.DOW;    }

  inline void fSetMonth(int m)  { _xDate.Month  = m; }
  inline void fSetDay(int d)    { _xDate.Day    = d; }
  inline void fSetYear(int y)   { _xDate.Year   = y; }
  inline void fSetHour(int h)   { _xTime.Hour   = h; }
  inline void fSetMinute(int m) { _xTime.Minute = m; }
  inline void fSetSecond(int s) { _xTime.Second = s; }
  inline void fSetD111(long d)  { _xDate.D111   = d; }
  inline void fSetS000(long s)  { _xTime.S000   = s; }

  __int64 fGetTStamp(void);
  void fSetTStamp(__int64);
  bool fIsValid(void);

  inline int  fGetMonthDays(void) { return _xDate.MonthDays; }
  inline bool fGetIsLeap(void)    { return _xDate.IsLeap;    }

  DateX _xDate;
  TimeX _xTime;
};
//---------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
//                            Class TRelPath                               //
//-------------------------------------------------------------------------//
//   文件路径处理, 支持网络路径,而 C++ Builder 的文件名函数不支持         //
//   在“网上邻居”上执行文件的路径 \\COMPUTER\SHARENAME\PATH\FILENAME.EXT //
//   Novell Netware  支持另一种路径 FS\VOLUMNNAME:PATH\FILENAME.EXT        //
//-------------------------------------------------------------------------//
class PACKAGE TRelPath
{
public:
  enum TPathType
   {
     ptExecutable,    // .exe 文件的路径
     ptWindows,       // C:\\WINDOWS
     ptSystem,        // C:\\WINDOWS\\SYSTEM
     ptCurrent,       // 当前路径
     ptTemporary,     // 临时文件存放的路径 %TEMP%
     ptCustom,        // 自定义
     ptModule,        // 当前 module 路径, .exe 或 .dll 等
     ptProgFiles,     // C:\\Program Files
     ptProgCommon,    // C:\\Program Files\\Common Files
     ptDesktop,       // C:\\Documents and Settings\\username\\Desktop
     ptMyDocuments,   // C:\\Documents and Settings\\username\\My Documents
     ptAppData,       // C:\\Documents and Settings\\username\\Application Data
     ptStartMenu,     // C:\\Documents and Settings\\username\\Start Menu
     ptStMenuProg,    // C:\\Documents and Settings\\username\\Start Menu\\Programs
     ptStMenuStartup, // C:\\Documents and Settings\\username\\Start Menu\\Programs\\Startup
   };

  TRelPath(TVictorString asRelative="");
  TRelPath(TPathType ptType, TVictorString asRelative="");
  TRelPath(TVictorString asRootPath, TVictorString asRelative);
  virtual ~TRelPath() {}

  void Assign(TRelPath *);
  void Assign(TVictorString p, TVictorString r="");

  __property TPathType     PathType = { read=_PathType   , write=SetPathType  };
  __property TVictorString RootPath = { read=_asRootPath , write=SetRootPath  };
  __property TVictorString Relative = { read=_asRelative , write=SetRelative  };
  __property TVictorString FullPath = { read=fGetFullPath, write=fSetFullPath };

  operator AnsiString();
  operator TVictorString();

  TRelPath &operator = (TRelPath    &rp);
  TRelPath &operator = (AnsiString    s);
  TRelPath &operator = (TVictorString s);

  TVictorString FileName(TVictorString s);  //RootPath+Relative+s
  TVictorString FileName(TVictorString s, TVictorString e);  //RootPath+Relative+s+"."+e
  TVictorString Extension(TVictorString s);  //RootPath+Relative+ExeFileName+"."+s
  TVictorString FormatName(const char *fmt, ...); //printf(fmt, ...);
  TVictorString FormatExtension(const char *fmt, ...); //printf(fmt, ...);

private:
  void Initialize(TPathType ptType, TVictorString asRootPath, TVictorString asRelative); //Called internally
  void SetPathType(TPathType t);
  void SetRootPath(TVictorString s);
  void SetRelative(TVictorString s);

  TVictorString fGetFullPath(void);
  void fSetFullPath(TVictorString);

  TPathType _PathType; //default = ptExecutable
  TVictorString _asRootPath; //"D:\\PATH\\", "\\SERVER\\VOL\\PATH\\", "SERVER\\VOL:PATH\\"
  TVictorString _asRelative; //"DATAPATH\\"
  TVictorString _asExeFulln; //"D:\\PATH\\FILENAME.EXT"
};
//---------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
//      TBinFile: 带格式的二进制文件读写,文件格式:文件头 + 记录[]        //
//        错误信息用 try ... catch 捕捉,错误类名:EBinFileError           //
//---------------------------------------------------------------------------
class PACKAGE TBinFile
{
public:
  enum TOpenMode { omRead=1, omWrite=2, omCreateNew=4, omAutoCreate=8 }; //读, 写, 建新文件, 如果文件不存在建新文件
  enum TShareMode { shDenyNone=0, shDenyRead=1, shDenyWrite=2, shDenyAll=3, shDefault=8}; //不锁, 锁读, 锁写, 全锁, 缺省

  __fastcall TBinFile(size_t nHeaderSize=0, size_t nRecordSize=0);
  virtual __fastcall ~TBinFile();

  __property TVictorString FileName  = { read=_asFileName, write=fSetFileName }; //文件名

  __property long OpenMode  = { read=_OpenMode , write=fSetOpenMode }; //打开方式
  __property long ShareMode = { read=_ShareMode, write=fSetShareMode}; //共享模式
  __property bool Buffered  = { read=_bBuffered, write=fSetBuffered }; //是否用缓存

  __property bool Active      = { read=Opened      , write=fSetActive  }; //打开/关闭/判断是否已打开
  __property long RecNo       = { read=_NewRecNo   , write=_NewRecNo   }; //记录号
  __property long RecordCount = { read=fGetRecCount, write=fSetRecCount}; //记录总数, 设置此值会截断/增加文件
  __property long Pos         = { read=fGetCursPos , write=fSetCursPos }; //文件指针位置
  __property long Size        = { read=fGetFileSize, write=fSetFileSize}; //文件长度的字节数
  __property DateTimeX Time   = { read=fGetFileTime, write=fSetFileTime}; //文件时间
  __property int  Attrib      = { read=fGetFileAttr, write=fSetFileAttr}; //文件属性(FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_LABEL|FA_DIREC|FA_ARCH)

  __property long  Handle     = { read=fGetHandle}; //只读属性:文件句柄
  __property FILE* FileStream = { read=_fBin     }; //只读属性:文件流指针
  __property bool  Exists     = { read=fGetExists}; //只读属性:文件是否存在,在不打开文件的情况下可以判断

  __property size_t HeaderSize = { read = _HeaderSize }; //只读属性:文件头长度
  __property size_t RecordSize = { read = _RecordSize }; //只读属性:一条记录的长度

  inline operator FILE* () { return _fBin; }

  virtual int    __fastcall Seek(long offset, int whence);
  virtual size_t __fastcall Read(void *ptr, size_t n);
  virtual size_t __fastcall Write(const void *ptr, size_t n);

  virtual void __fastcall ReadHeader(void *lpHeader);  //读文件头
  virtual void __fastcall WriteHeader(void *lpHeader); //写文件头

  virtual void __fastcall ReadRecord(void *lpBuffer);  //读记录
  virtual void __fastcall WriteRecord(void *lpBuffer); //写记录

  virtual void __fastcall ReadRecord(void *lpBuffer, long iRecNo);  //读指定的记录
  virtual void __fastcall WriteRecord(void *lpBuffer, long iRecNo); //写指定的记录

  virtual void __fastcall Open(void);  //打开文件,相当于设置属性 Active = true
  virtual void __fastcall Close(void); //关闭文件,相当于设置属性 Active = false
  virtual void __fastcall Flush(void); //在不关闭文件的情况下把所有改动和CACHE内容更新到磁盘
  virtual bool __fastcall Opened(void) { return _fBin!=NULL; } //判断文件是否打开,相当于读属性 Active
  virtual void __fastcall Refresh(void) { _OldRecNo=-1; _bHeaderOK=false; } //在 Buffered=true 的情况下,刷新 Buffer 为磁盘最新内容
  virtual void __fastcall Remove(void); //删除文件

private:
  void __fastcall fSetFileName(TVictorString s);
  void __fastcall fSetOpenMode(long m);
  void __fastcall fSetShareMode(long m);
  void __fastcall fSetBuffered(bool b)     { _OldRecNo = -1; _bBuffered = b; _bHeaderOK=false; }
  long __fastcall fGetHandle(void)         { return _fBin ? fileno(_fBin) : -1;  }
  void __fastcall fSetActive(bool bActive) { if(bActive) Open(); else Close(); }
  long __fastcall fGetRecCount(void);
  void __fastcall fSetRecCount(long n);
  long __fastcall fGetFileSize(void);
  void __fastcall fSetFileSize(long n);
  DateTimeX __fastcall fGetFileTime(void);
  void __fastcall fSetFileTime(DateTimeX);
  int  __fastcall fGetFileAttr(void);
  void __fastcall fSetFileAttr(int);
  long __fastcall fGetCursPos(void);
  void __fastcall fSetCursPos(long n);
  bool __fastcall fGetExists(void);

private:
  FILE  *_fBin;
  long   _OpenMode, _ShareMode;
  size_t _HeaderSize, _RecordSize;
  long   _OldRecNo, _NewRecNo;
  char  *_BufHeader, *_BufRecord;
  bool   _bBuffered, _bHeaderOK;
  TVictorString _asFileName;
};
//---------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
class PACKAGE EBinFileError:public Exception
{
public:
  enum TErrorCode
   {
     BFERR_UNKNOWN         =  0, //未知错误
     BFERR_NOFILENAME      =  1, //文件名属性为空
     BFERR_OPEN            =  2, //不能打开文件
     BFERR_CREATE          =  3, //不能建新文件
     BFERR_READHEAD        =  4, //读文件头错误
     BFERR_WRITEHEAD       =  5, //写文件头错误
     BFERR_READRECORD      =  6, //读记录错误
     BFERR_WRITERECORD     =  7, //写记录错误
     BFERR_RECNO           =  8, //记录号错误
     BFERR_NOT_OPENED      =  9, //读写时文件没打开
     BFERR_NOWRITEPROPERTY = 10, //写文件但是没有写属性
     BFERR_CHANGEFILESIZE  = 11, //不能改变文件大小
     BFERR_ERASE           = 12, //不能删除文件
     BFERR_GETFATTRIB      = 13, //不能得到文件属性
     BFERR_SETFATTRIB      = 14, //不能修改文件属性
     BFERR_GETFTIME        = 15, //不能得到文件时间
     BFERR_SETFTIME        = 16, //不能修改文件时间
   };

public:
  __property TErrorCode ErrorCode  = { read = _iErrorCode  };
  __property int        SubErrCode = { read = _iSubErrCode };
  __property TVictorString FileName   = { read = _FileName    };
  __fastcall EBinFileError(TVictorString fName, TErrorCode ecErrCode, int iErrNo);

protected:
  TErrorCode     _iErrorCode;  //BinFile Error
  int            _iSubErrCode; //OS errno
  TVictorString  _FileName;    //FileName

private:
  class MessageStrings
   {
     public:
       __fastcall MessageStrings();

       typedef struct {TErrorCode Code ; char *Msg ; } ERRMSG;
       typedef struct {int        ErrNo; char *Info; } STD_ERRSTR;

       __property TVictorString ErrMsg[TErrorCode] = { read = fGetErrMsg };
       __property TVictorString StdMsg[int       ] = { read = fGetStdMsg };
       __property TVictorString Unknown            = { read = fGetUnknown};
       __property TVictorString CuowuXinxi         = { read = fGetCuowuXx};

     private:
       TVictorString __fastcall fGetErrMsg(TErrorCode ecCode);
       TVictorString __fastcall fGetStdMsg(int iErrNo);
       TVictorString __fastcall fGetUnknown(void);
       TVictorString __fastcall fGetCuowuXx(void);

       ERRMSG     *BfErr_Messages;
       STD_ERRSTR *StdErrInfo;
       char       *Err_Unknown;
       char       *Err_CuowuXinxi;

       static ERRMSG     BfErr_Messages_Chs[], BfErr_Messages_Cht[], BfErr_Messages_Enu[];
       static STD_ERRSTR StdErrInfo_Chs    [], StdErrInfo_Cht    [], StdErrInfo_Enu    [];
       static char       Err_Unknown_Chs   [], Err_Unknown_Cht   [], Err_Unknown_Enu   [];
       static char       Err_CuowuXinxi_Chs[], Err_CuowuXinxi_Cht[], Err_CuowuXinxi_Enu[];
   };
};
//---------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
class PACKAGE TCRC32 //CCITT 校验码是取反的校验码值
{
public:
  TCRC32(unsigned __int32 InitValue=0xffffffffui32);

  inline operator unsigned __int32 () { return CRC; }
  inline TCRC32 & operator << (unsigned __int8 c) { CRC = TB[(CRC^c) & 0xff] ^ (CRC>>8); return *this; }
  __property unsigned __int32 Value = { read = CRC };
  unsigned __int32 Check(void *p, unsigned long n);
  inline void Reset(void) { CRC = _InitValue; }
  inline void Reset(unsigned __int32 InitValue) { CRC = _InitValue = InitValue; }
  __property const unsigned __int32 * Table = { read = fGetTable };

⌨️ 快捷键说明

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