📄 card.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Card.h"
#include "servermodule.h"
#include "option.h"
#include "dido.h"
#include "Param.h"
#include "gridtool.h"
#include "bdbf.h"
#include "editcard.h"
#include "delesome.h"
#include "dido.h"
#include "InqCard.h"
#include "DataProc.h"
#include "dynamic.h"
#include "Cbuilder.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
//设置编辑、链表
static void SetEditText(TCardForm *ta);
//设置编辑格栅的列宽度
static void SetTextDBGridWith(TDBGrid *pDBGrid);
//刷卡机排序
static int SortCardOnTList(void *pHead,int nIndex);
//比较刷卡机节点
static int CompCardDot(void *p1,void *p2);
//获取相同内容的其它记录(0=>无,1=>其它记录)
static int GetOtherCardOnTable(CARDDATA *Sour,int nOld);
//获取相同内容的其它记录(0=>无,1=>其它记录)
static int GetOtherCardOnTable(TADOQuery *pQuery,CARDDATA *Sour,int nOld);
//设置刷卡控制器
static void SetCRCoBox(TComboBox *pBox);
//设置刷卡读卡机
static void SetReaderCoBox(TComboBox *pBox,int nCRNo);
//设置卡片类型
static void SetCardTypeCoBox(TComboBox *pBox);
//刷卡识别处理(若数据未经处理,则返回FALSE)
static int ReadCardProc(void *pIORec);
//根据设定生成卡片数据
static int GetCardDataOnForm(TCardForm *pForm,CARDDATA *pCard);
//根据设定卡片起始编号
static int SetCardNoOnForm(TCardForm *pForm,int nCardNo);
//删除当前一条记录
static int DeleteOneCurCard(TADOQuery *pCardQuery);
//删除一些卡片
static int DeleteSomeCard(TADOQuery *pCardQuery,int nCardNo1,int nCardNo2);
//删除前,确认卡片是否被领用
static int GetCardFreeBeforeDelete(CARDDATA *pCard);
//设置查询编辑框
static void SetInquireText(TCardForm *ta);
static TCardForm *pCardForm;
//---------------------------------------------------------------------------
__fastcall TCardForm::TCardForm(TComponent* Owner)
: TForm(Owner)
{
pCardForm=this;
m_nDone=0;
}
void __fastcall TCardForm::FormDestroy(TObject *Sender)
{
m_PauseButClick(Sender);
pCardForm=NULL;
}
//设置感应卡片
int SetCardData(TObject *Owner)
{
TCardForm *se;
int rc;
rc=FALSE;
se = new TCardForm((TComponent*)Owner);
if(se!=NULL){
SetEditText(se);
se->ShowModal();
rc=se->m_nDone;
delete se;
}
return(rc);
}
//查询感应卡片
int InquireCardData(TObject *Owner)
{
TCardForm *se;
int rc;
rc=FALSE;
se = new TCardForm((TComponent*)Owner);
if(se!=NULL){
SetInquireText(se);
se->ShowModal();
delete se;
rc=TRUE;
}
return(rc);
}
//设置查询编辑框
void SetInquireText(TCardForm *ta)
{
TADOQuery *pQuery;
ta->m_nHex=0;
ta->m_CardFormatCoBox->ItemIndex=0;
ta->m_ReadPanel->Hide();
ta->m_DelBut->Enabled=FALSE;
ta->m_AddBut->Enabled=FALSE;
ta->m_EditBut->Enabled=FALSE;
//用EditADOQuery元件查询一个表中记录
pQuery = (TADOQuery *)GetEditQuery();
ta->m_CardDataSource->DataSet = pQuery;
ta->m_InqButClick(ta->m_InqBut);
}
//设置编辑、链表
void SetEditText(TCardForm *ta)
{
TADOQuery *pQuery;
ta->m_nHex=0;
ta->m_CardFormatCoBox->ItemIndex=0;
//用EditADOQuery元件查询一个表中记录
pQuery = (TADOQuery *)GetEditQuery();
ta->m_CardDataSource->DataSet = pQuery;
if(pQuery==NULL){
ta->m_DelBut->Enabled=FALSE;
ta->m_AddBut->Enabled=FALSE;
ta->m_EditBut->Enabled=FALSE;
}
else ta->m_TextDBGridTitleClick(ta->m_TextDBGrid->Columns->Items[0]);
//设置刷卡识别的控件
SetCRCoBox(ta->m_CRCoBox);//设置刷卡控制器
SetCardTypeCoBox(ta->m_CardTypeCoBox);//设置卡片类型
ta->m_CRCoBoxChange(ta->m_CRCoBox);//刷卡控制器变化
ta->m_PauseBut->Enabled=FALSE;
}
//设置刷卡控制器
void SetCRCoBox(TComboBox *pBox)
{
void *pHead,*pCur;
CONTROLER *pCR;
char szBuf[50],szStr[50];
int i;
pBox->Items->Clear();
pHead = GetControlerList(); //获取本地控制器
for(i=0;;i++){
pCur = GetDotOnTList(pHead,i);
if(pCur==NULL)break;
pCR = LookControler(pCur);
GetCRNameText(szStr,pCR);
wsprintf(szBuf,"%d: %s",pCR->nCRNo,szStr);
pBox->Items->Add(szBuf);
}
pBox->ItemIndex=0;
}
//设置刷卡读卡机
void SetReaderCoBox(TComboBox *pBox,int nCRNo)
{
CONTROLER *pCR;
void *pHead;
int i,n,nRoads;
WORD *pRoadNo;
char szBuf[50],szStr[50];
pBox->Items->Clear();
pHead = GetControlerList(); //获取本地控制器
pCR = (CONTROLER *)GetCROnListWithNo(pHead,nCRNo);//根据编号获取控制器
if(pCR!=NULL){
nRoads = pCR->nRoads;
pRoadNo = pCR->wzRoadNo;
}
else nRoads=0;
for(i=0;i<nRoads;i++){ //获取车道名称文本
n = pRoadNo[i];
GetRoadwayNameText(szStr,n);
wsprintf(szBuf,"%d: %s",n,szStr);
pBox->Items->Add(szBuf);
}
pBox->ItemIndex=0;
}
//设置卡片类型
void SetCardTypeCoBox(TComboBox *pBox)
{
int i;
char szBuf[50];
pBox->Items->Clear();
for(i=0;;i++){
GetCardTypeStr(szBuf,i);
if(szBuf[0]==0)break;
pBox->Items->Add(szBuf);
}
pBox->ItemIndex=0;
}
//刷卡控制器变化
void __fastcall TCardForm::m_CRCoBoxChange(TObject *Sender)
{
int nCRNo;
nCRNo = atoi(m_CRCoBox->Text.c_str());
SetReaderCoBox(m_ReaderCoBox,nCRNo);
}
//---------------------------------------------------------------------------
void __fastcall TCardForm::m_CloseButClick(TObject *Sender)
{
ModalResult=IDOK;
}
//刷卡机排序
int SortCardOnTList(void *pHead,int nIndex)
{
nIndex=SortDotOnTList(pHead,nIndex,CompCardDot);
return(nIndex);
}
//比较刷卡机节点
int CompCardDot(void *p1,void *p2)
{
int m,n;
m = (int)LookCardData(p1)->nCardNo;
n = (int)LookCardData(p2)->nCardNo;
return(m-n);
}
//设置编辑格栅的列宽度
void SetTextDBGridWith(TDBGrid *pDBGrid)
{
int i,m,n,nWidth;
int x[10];
nWidth = pDBGrid->ClientRect.Width()-10;
n = pDBGrid->Columns->Count;
ZeroMemory(x,sizeof(x));
x[0]=55; x[1]=140; x[2]=140; x[3]=55;
for(i=m=0;i<n;i++){
nWidth -= x[i]+1;
if(x[i]!=0)m++;
}
m = n-m;
if(m>1)nWidth = (nWidth-2) / m;
for(i=0;i<n;i++)
if(x[i]==0)x[i]=nWidth;
for(i=0;i<n;i++)
pDBGrid->Columns->Items[i]->Width=x[i];
}
void __fastcall TCardForm::FormResize(TObject *Sender)
{
//设置编辑格栅的列宽度
SetTextDBGridWith(m_TextDBGrid);
}
//---------------------------------------------------------------------------
void __fastcall TCardForm::m_TextDBGridDrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
{
static char *pszFormat[]={"%10u-%010u","%10u","%08X-%08X","%08X"};
CARDDATA a;
TDataSet *pQuery;
int m,n,nFormat;
char szBuf[50],*p;
pQuery = m_CardDataSource->DataSet;
if(pQuery->IsEmpty())return;
if(DataCol==1){
ReadCardRecord(pQuery,&a);
m=a.nCardHI;n = a.nCardID;//内码
nFormat = m_nHex<<1;
if(m!=0)
wsprintf(szBuf,pszFormat[nFormat],m,n);
else if(n!=0)wsprintf(szBuf,pszFormat[nFormat+1],n);
else szBuf[0]=0; //未分配内码
SetDBGridText(Sender,Rect,Column,szBuf);//设置DB格栅文字
}
else if(DataCol==2){//卡片类型
ReadCardRecord(pQuery,&a);
p = GetCardType(a.nType);
SetDBGridText(Sender,Rect,Column,p);//设置DB格栅文字
}
else if(DataCol==3){//持卡人编号
ReadCardRecord(pQuery,&a);
GetNumberText(szBuf,a.nHolderNo);
SetDBGridText(Sender,Rect,Column,szBuf);//设置DB格栅文字
}
else if(DataCol==4){//生效日期
ReadCardRecord(pQuery,&a);
GetDWORDDateText(szBuf,a.nBeginDate);
SetDBGridText(Sender,Rect,Column,szBuf);//设置DB格栅文字
}
else if(DataCol==5){//截止日期
ReadCardRecord(pQuery,&a);
GetDWORDDateText(szBuf,a.nEndDate);
SetDBGridText(Sender,Rect,Column,szBuf);//设置DB格栅文字
}
else if(DataCol==6){//卡片状态
ReadCardRecord(pQuery,&a);
p = GetCardStatusText(&a);
SetDBGridText(Sender,Rect,Column,p);//设置DB格栅文字
}
}
void __fastcall TCardForm::m_CardFormatCoBoxChange(TObject *Sender)
{
m_nHex = m_CardFormatCoBox->ItemIndex;
if(m_nHex>1)m_nHex=0;
m_CardDataSource->DataSet->DisableControls();
m_CardDataSource->DataSet->EnableControls();
}
//---------------------------------------------------------------------------
void __fastcall TCardForm::m_EditButClick(TObject *Sender)
{
TADOQuery *pQuery;
CARDDATA a;
int rc,nCount;
pQuery = (TADOQuery *)m_CardDataSource->DataSet;
ReadCardRecord(pQuery,&a);
rc = (int)pQuery;
nCount = GetRecordIDOnTable(pQuery);
// nCount = GetCurRecno(pQuery);//获取当前记录号
while(rc){
rc=ReworkCard(this,&a,1);
if(rc){ //获取相同内容的其它记录(0=>无,1=>其它记录)
if(GetOtherCardOnTable(&a,nCount)==FALSE)
break; //没有重复
}
}
if(rc){
rc=EditDataSet(pQuery);
if(rc)SaveCardRecord(pQuery,&a);
if(rc)rc=PostDataSet(pQuery);
if(!rc)ShowTableError(1);
}
}
void __fastcall TCardForm::m_AddButClick(TObject *Sender)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -