📄 editroadway.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "EditRoadway.h"
#include "dido.h"
#include "option.h"
#include "Dynamic.h"
#include "CBuilder.h"
#include "Vtl.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//设置编辑内容
static void SetEditText(TEditRoadwayForm *te,void *pHead,int nIndex,int nMode);
//获取编辑内容
static int GetEditText(TEditRoadwayForm *te,void *pHead,int nIndex);
//获取相同地址(-1=>无,0=>原来,1=>其它记录)
static int GetOtherRoadwayOnTList(void *pHead,ROADWAY *Sour,int nOld);
//获取编辑内容
static void GetEditUnit(TEditRoadwayForm *te,ROADWAY *a);
//设置车道组的组合框
static void SetGroupComBox(TComboBox *pBox,int n);
//设置类型组合框
static void SetTypeComBox(TComboBox *pBox,int n);
//设置APB组合框
static void SetAPBComBox(TComboBox *pBox,int n);
//设置ReaderType组合框
static void SetReaderTypeComBox(TComboBox *pBox,int n);
//设置停车场组合框
static void SetParkComBox(TComboBox *pBox,int nParkNo);
//获取车道链表中最大的编号
static int GetMaxRoadNoOnList(void *pHead);
//设置LED网络节点
static void SetLEDNetText(TEditRoadwayForm *te,ROADWAY *pRoad);
//设置串行通讯端口
static void SetCommCoBox(TComboBox *pBox,DWORD nNetID);
//设置VideoType组合框
static void SetVideoTypeComBox(TComboBox *pBox,int nType);
//设置LEDType组合框
static void SetLEDTypeComBox(TComboBox *pBox,int nType);
//设置图片处理方式组合框
static void SetPhotoComBox(TComboBox *pBox,int nType);
//---------------------------------------------------------------------------
__fastcall TEditRoadwayForm::TEditRoadwayForm(TComponent* Owner)
: TForm(Owner)
{
}
//添加修改模组
int ReworkRoadway(TComponent* Owner,void *pHead,int nIndex,int nMode)
{
TEditRoadwayForm *te;
int rc;
rc=-1;
te = new TEditRoadwayForm(Owner);
if(te!=NULL){
SetEditText(te,pHead,nIndex,nMode);
if(te->ShowModal()==IDOK)rc=te->m_Index;
delete te;
}
return(rc);
}
//设置编辑内容
void SetEditText(TEditRoadwayForm *te,void *pHead,int nIndex,int nMode)
{
ROADWAY a;
char szBuf[30];
int rc;
te->m_pHead=pHead; te->m_Index=nIndex;
rc=GetDotTextOnTList(pHead,nIndex,&a,sizeof(a));
if(rc==0)a.nAPB=1; //默认APB为第一层
te->m_NameEdit->SetTextBuf(a.szName);
SetGroupComBox(te->m_GroupCoBox,a.nGroup);
SetTypeComBox(te->m_TypeCoBox,a.nType);
SetAPBComBox(te->m_APBCoBox,a.nAPB);
SetReaderTypeComBox(te->m_ReaderTypeCoBox,a.nReaderType);
SetParkComBox(te->m_ParkCoBox,a.nParkNo);
SetLEDNetText(te,&a);//设置LED网络节点
SetVideoTypeComBox(te->m_VideoTypeCoBox,a.nVideoType);
SetLEDTypeComBox(te->m_LEDTypeCoBox,a.nLEDType);
SetPhotoComBox(te->m_PhotoCoBox,a.nPhotoDeal);
//设置整数值到子控制中
SetIntToControl(te->m_ReaderIDEdit,a.nReaderID+1);
SetIntToControl(te->m_VideoChanEdit,a.nVideoID+1);
if(LookCount(pHead)<=0)nMode=0;
if(nMode==0)//增加
te->m_EditBut->Enabled=FALSE;
else te->m_AddBut->Enabled=FALSE;//修改
}
//获取编辑内容
void GetEditUnit(TEditRoadwayForm *te,ROADWAY *pRoad)
{
char szBuf[30];
int n;
te->m_NameEdit->GetTextBuf(pRoad->szName,sizeof(pRoad->szName));
pRoad->nGroup = GetIntOnControl(te->m_GroupCoBox);
pRoad->nType = GetIntOnControl(te->m_TypeCoBox);
pRoad->nAPB = GetIntOnControl(te->m_APBCoBox);
pRoad->nReaderType = GetIntOnControl(te->m_ReaderTypeCoBox);
pRoad->nParkNo = GetIntOnControl(te->m_ParkCoBox);
pRoad->nPhotoDeal=GetIntOnControl(te->m_PhotoCoBox);
pRoad->nVideoType=GetIntOnControl(te->m_VideoTypeCoBox);
pRoad->nLEDType=GetIntOnControl(te->m_LEDTypeCoBox);
n=GetIntOnControl(te->m_ReaderIDEdit)-1;
if(n<0)n=0; pRoad->nReaderID=n;
n=GetIntOnControl(te->m_VideoChanEdit)-1;
if(n<0)n=0; pRoad->nVideoID=n;
//通讯网络
n= te->m_CommNetRBox->Checked;
if(n){//串行通讯
pRoad->nLEDNetID = GetIntOnControl(te->m_CommCoBox);
pRoad->nLEDIPPort=0;
}
else{//IP网络
te->m_IPEdit->GetTextBuf(szBuf,sizeof(szBuf));
pRoad->nLEDNetID= IPStrToDWORD(szBuf);
pRoad->nLEDIPPort=GetIntOnControl(te->m_PortEdit);
}
SetRoadLEDIPNetFlag(pRoad,!n);
if(pRoad->nVideoType==ROADVIDEO_NONE)//无图像卡
pRoad->nPhotoDeal = ROADPHOTO_NONE; //不捕捉图片
}
//设置LED网络节点
void SetLEDNetText(TEditRoadwayForm *te,ROADWAY *pRoad)
{
char szBuf[50];
int n,nComm,nIP,nPort;
n = GetRoadLEDIPNetFlag(pRoad);
nPort=0; nComm=0; nIP=0;
if(n==0){ //串行口
nComm=pRoad->nLEDNetID;
te->m_CommNetRBox->Checked=TRUE;
}
else{ //IP网
nIP=pRoad->nLEDNetID; nPort=pRoad->nLEDIPPort;
te->m_IPNetRBox->Checked=TRUE;
}
SetCommCoBox(te->m_CommCoBox,nComm);
GetIPStr(szBuf,nIP);
te->m_IPEdit->SetTextBuf(szBuf);
wsprintf(szBuf,"%d",nPort);
te->m_PortEdit->SetTextBuf(szBuf);
te->m_CommNetRBoxClick(te->m_CommNetRBox);//选择网络输入框
}
//设置串行通讯端口
void SetCommCoBox(TComboBox *pBox,DWORD nNetID)
{
int i,n;
char *p,szBuf[30];
pBox->Items->Clear();
for(i=0;i<256;i++){
p = GetCOMName(i);
if(p==NULL)break;
wsprintf(szBuf,"%d: %s",i,p);
pBox->Items->Add(p);
}
if(nNetID>=256)n=0;
else n = nNetID;
pBox->ItemIndex=n;
}
//设置组号组合框
void SetGroupComBox(TComboBox *pBox,int nGroup)
{
static char pszText[]="%d: 第 %d 组";
int i;
char szBuf[50];
pBox->Items->Clear();
for(i=0;i<256;i++){
wsprintf(szBuf,pszText,i,i);
pBox->Items->Add(szBuf);
}
pBox->ItemIndex=nGroup;
}
//设置停车场组合框
void SetParkComBox(TComboBox *pBox,int nParkNo)
{
static char pszText[]="%d: %s";
int i,nCur;
void *pHead,*pCur;
PARKDATA *t;
char szBuf[50];
nCur=0;
pBox->Items->Clear();
pHead = GetParkList();
for(i=0;;i++){
pCur = GetDotOnTList(pHead,i);
if(pCur==NULL)break;
t = LookPark(pCur);
wsprintf(szBuf,pszText,t->nParkNo,t->szName);
if(nParkNo==t->nParkNo)nCur=i;
pBox->Items->Add(szBuf);
}
pBox->ItemIndex=nCur;
}
//设置类型组合框
void SetTypeComBox(TComboBox *pBox,int nType)
{
static char pszText[]="%d: %s";
int i;
char *p,szBuf[50];
pBox->Items->Clear();
for(i=0;;i++){
p = GetRoadwayType(i);
if(p==NULL)break;
wsprintf(szBuf,pszText,i,p);
pBox->Items->Add(szBuf);
}
if(nType<0 || nType>=i)nType=0;
pBox->ItemIndex=nType;
}
//设置图片处理方式组合框
void SetPhotoComBox(TComboBox *pBox,int nType)
{
static char pszText[]="%d: %s";
int i;
char *p,szBuf[50];
pBox->Items->Clear();
for(i=0;;i++){
p = GetRoadPhotoProc(i);//获取车道图片处理方式
if(p==NULL)break;
wsprintf(szBuf,pszText,i,p);
pBox->Items->Add(szBuf);
}
if(nType<0 || nType>=i)nType=0;
pBox->ItemIndex=nType;
}
//设置APB组合框
void SetAPBComBox(TComboBox *pBox,int nAPB)
{
int i;
char *p,szBuf[50];
pBox->Items->Clear();
for(i=1;i<4;i++){
GetAPBTypeStr(szBuf,i);
pBox->Items->Add(szBuf);
}
GetAPBTypeStr(szBuf,0);
pBox->Items->Add(szBuf);
if(nAPB>0 && nAPB<4)nAPB--;
else nAPB=3;
pBox->ItemIndex=nAPB;
}
//设置ReaderType组合框
void SetReaderTypeComBox(TComboBox *pBox,int nType)
{
int i;
char *p,szBuf[50];
pBox->Items->Clear();
for(i=0;;i++){
p = GetReaderType(i);//获取ReaderType串
if(p==NULL)break;
wsprintf(szBuf,"%d: %s",i,p);
pBox->Items->Add(szBuf);
}
pBox->ItemIndex=nType;
}
//设置VideoType组合框
void SetVideoTypeComBox(TComboBox *pBox,int nType)
{
int i;
char *p,szBuf[50];
pBox->Items->Clear();
for(i=0;;i++){
GetVideoType(i); //图象卡类型
if(p==NULL)break;
wsprintf(szBuf,"%d: %s",i,p);
pBox->Items->Add(szBuf);
}
pBox->ItemIndex=nType;
}
//设置LEDType组合框
void SetLEDTypeComBox(TComboBox *pBox,int nType)
{
int i;
char *p,szBuf[50];
pBox->Items->Clear();
for(i=0;;i++){
GetLEDType(i); //图象卡类型
if(p==NULL)break;
wsprintf(szBuf,"%d: %s",i,p);
pBox->Items->Add(szBuf);
}
pBox->ItemIndex=nType;
}
//获取编辑内容
int GetEditText(TEditRoadwayForm *te,void *pHead,int nIndex)
{
static char pszText[]="添加/修改的车道\n"
"其名称:\"%s\"\n\n已经有重复!";
char szBuf[100];
ROADWAY a;
int nCur;
GetDotTextOnTList(pHead,nIndex,&a,sizeof(ROADWAY));
GetEditUnit(te,&a);
nCur= GetOtherRoadwayOnTList(pHead,&a,nIndex);
if(nIndex>=0 && nCur<=0){//修改
SetDotTextOnTList(pHead,nIndex,&a,sizeof(a));
nCur=nIndex;
}
else if(nCur<0){//不存在该记录,添加
a.nNo = GetMaxRoadNoOnList(pHead)+1;
if(AddContentToTList(pHead,&a,sizeof(a)))
nCur=LookCount(pHead)-1;
else nCur=-2;
}
else{ //重复,提示错误
wsprintf(szBuf,pszText,a.szName);
Application->MessageBox(szBuf,GetMainTitle(),
MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
te->m_NameEdit->SetFocus();
nCur=-1;
}
return(nCur);
}
//获取相同编号(-1=>无,0=>原来,1=>其它记录)
int GetOtherRoadwayOnTList(void *pHead,ROADWAY *Sour,int nOld)
{
void *pCur;
ROADWAY *a;
char *pszName;
int i,rc,nType;
rc=-1;// 认为无重复的记录
pszName= Sour->szName;
nType = Sour->nType;
for(i=0;;i++){
pCur = GetDotOnTList(pHead,i);
if(pCur==NULL)break;
a=LookRoadway(pCur);
if((int)a->nType==nType && lstrcmpi(a->szName,pszName)==0){
if(i!=nOld){rc=1;break;}//有不同的记录,则停止搜索
else rc=0; //相同的记录,则继续搜索
}
}
return(rc);
}
//添加
void __fastcall TEditRoadwayForm::m_AddButClick(TObject *Sender)
{
int rc;
rc = GetEditText(this,m_pHead,-1);//获取编辑内容
if(rc>=0){ ModalResult=IDOK; m_Index=rc; }
else { ModalResult=0; }
}
//修改
void __fastcall TEditRoadwayForm::m_EditButClick(TObject *Sender)
{
int rc;
rc = GetEditText(this,m_pHead,m_Index);//获取编辑内容
if(rc>=0){ ModalResult=IDOK; m_Index=rc; }
else { ModalResult=0; }
}
//获取车道链表中最大的编号
int GetMaxRoadNoOnList(void *pHead)
{
int i,n,nMax;
void *pCur;
nMax=0;
for(i=0;;i++){
pCur = GetDotOnTList(pHead,i);
if(pCur==NULL)break;
n=LookRoadway(pCur)->nNo;
if(n>nMax)nMax=n;
}
return(nMax);
}
void __fastcall TEditRoadwayForm::m_IPEditChange(TObject *Sender)
{
EditIPChange(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TEditRoadwayForm::m_CommNetRBoxClick(TObject *Sender)
{
int n;
n = m_CommNetRBox->Checked;
if(n){//串行网络
m_IPEdit->Enabled=FALSE;
m_PortEdit->Enabled=FALSE;
m_CommCoBox->Enabled=TRUE;
if(this->Visible)
m_CommCoBox->SetFocus();
}
else {//IP网络
m_IPEdit->Enabled=TRUE;
m_PortEdit->Enabled=TRUE;
m_CommCoBox->Enabled=FALSE;
if(this->Visible)
m_IPEdit->SetFocus();
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -