📄 editcr.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "EditCR.h"
#include "option.h"
#include "gridtool.h"
#include "listdlg.h"
#include "dynamic.h"
#include "vtl.h"
#include "CBuilder.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//设置编辑内容
static void SetEditText(TEditCRForm *ta,void *pHead,int nIndex,int nMode);
//设置网络
static void SetNetText(TEditCRForm *ta,CONTROLER *a);
//设置串行通讯端口
static void SetCommCoBox(TComboBox *pBox,DWORD nNetID);
//设置控制器状态
static void SetStatusCoBox(TComboBox *pBox,CONTROLER *pCR);
//设置控制器类型
static void SetTypeCoBox(TComboBox *pBox,int nType);
//设置通讯地址
static void SetAddrCoBox(TComboBox *pBox,void *pHead,DWORD nNetID,
int nIPPort,int nAddr);
//判断地址是否已使用
static int IsAddrUsed(void *pHead,DWORD nNetID,int nIPPort,int nAddr);
//获取编辑框中内容
static int GetEditUnit(TEditCRForm *te,CONTROLER *t);
//获取编辑内容
static int GetEditText(TEditCRForm *te,void *pHead,int nIndex);
//获取相同编号(-1=>无,0=>原来,1=>其它记录)
static int GetOtherControlerOnTList(void *pHead,CONTROLER *Sour,int nOld);
//获取控制器链表中最大的编号
static int GetMaxCRNoOnList(void *pHead);
//获取未分配的车道
static int FindUnAllocRoadNo(void *pCRList,CONTROLER *pCR);
//释放已内存
static void FreeUnAllocRoadNo(void);
//获取未分配车道名称
static int GetUnAllocRoadway(int nItem,char *pszStr);
//选择一个车道
static int SelectOneRoadNo(TObject *Owner);
//设置RoadGrid标题
static void SetRoadGridTitle(TStringGrid *pGrid);
//设置RoadGrid内容
static void SetRoadGridText(TStringGrid *pGrid,CONTROLER *pCR);
//---------------------------------------------------------------------------
__fastcall TEditCRForm::TEditCRForm(TComponent* Owner)
: TForm(Owner)
{
}
//设置模块模组
int ReworkControler(TObject *Owner,void *pHead,int nIndex,int nMode)
{
TEditCRForm *se;
int rc;
rc=-1;
se = new TEditCRForm((TComponent*)Owner);
if(se!=NULL){
SetEditText(se,pHead,nIndex,nMode);
if(se->ShowModal()==IDOK)
rc=se->m_nIndex;
delete se;
}
return(rc);
}
//设置编辑内容
void SetEditText(TEditCRForm *ta,void *pHead,int nIndex,int nMode)
{
CONTROLER *pCR;
int n;
if(LookCount(pHead)<=0)nMode=0;
if(nMode==0)nIndex=-1; //添加
pCR = &ta->m_EditText;
GetDotTextOnTList(pHead,nIndex,pCR,sizeof(CONTROLER));
ta->m_NameEdit->SetTextBuf(pCR->szName);
ta->m_HostEdit->SetTextBuf(pCR->szHostName);
SetStatusCoBox(ta->m_StatusCoBox,pCR);
SetTypeCoBox(ta->m_TypeCoBox,pCR->nType);
SetAddrCoBox(ta->m_AddrCoBox,pHead,pCR->nNetID,pCR->nIPPort,pCR->nAddrID);
SetNetText(ta,pCR); //网络节点
SetRoadGridTitle(ta->m_RoadGrid);//设置RoadGrid标题
SetRoadGridText(ta->m_RoadGrid,pCR);//设置RoadGrid内容
if(pCR->nRoads<=0)ta->m_EraseBut->Enabled=FALSE;
ta->m_pHead=pHead; ta->m_nIndex=nIndex;
if(nMode==0)//增加
ta->m_EditBut->Enabled=FALSE;
else ta->m_AddBut->Enabled=FALSE;//修改
}
//设置网络节点
void SetNetText(TEditCRForm *ta,CONTROLER *a)
{
char szBuf[50];
int n,nComm,nIP,nPort;
n = GetCRIPNetFlag(a);
nPort=0; nComm=0; nIP=0;
if(n==0){ //串行口
nComm=a->nNetID;
ta->m_CommNetRBox->Checked=TRUE;
}
else{ //IP网
nIP=a->nNetID; nPort=a->nIPPort;
ta->m_IPNetRBox->Checked=TRUE;
}
SetCommCoBox(ta->m_CommCoBox,nComm);
GetIPStr(szBuf,nIP);
ta->m_IPEdit->SetTextBuf(szBuf);
wsprintf(szBuf,"%d",nPort);
ta->m_PortEdit->SetTextBuf(szBuf);
ta->m_CommNetRBoxClick(ta->m_CommNetRBox);//选择网络输入框
}
//设置串行通讯端口
void SetCommCoBox(TComboBox *pBox,DWORD nNetID)
{
int i,n;
char *p;
pBox->Items->Clear();
for(i=0;i<256;i++){
p = GetCOMName(i);
pBox->Items->Add(p);
}
if(nNetID>=256)n=0;
else n = nNetID;
pBox->ItemIndex=n;
}
//设置控制器状态
void SetStatusCoBox(TComboBox *pBox,CONTROLER *pCR)
{
int i;
int n;
n = GetCRUnLinkFlag(pCR);//联线
pBox->Clear();
for(i=0;i<2;i++)
pBox->Items->Add(GetCRLinkedStr(i));
if(n!=0)n=1;
pBox->ItemIndex=n;
}
//设置控制器类型
void SetTypeCoBox(TComboBox *pBox,int nType)
{
char *p;
int i;
pBox->Items->Clear();
for(i=0;;i++){
p = GetCRTypeStr(i);
if(p==NULL)break;
pBox->Items->Add(p);
}
if(nType<0 || nType>=i)nType=0;
pBox->ItemIndex=nType;
}
//设置通讯地址
void SetAddrCoBox(TComboBox *pBox,void *pHead,DWORD nNetID,
int nIPPort,int nAddrID)
{
int i,n,nCur;
char szBuf[20];
nCur=0; n=0;
pBox->Items->Clear();
for(i=0;i<100;i++){
if(i==nAddrID || !IsAddrUsed(pHead,nNetID,nIPPort,i)){
wsprintf(szBuf,"%02d",i);
pBox->Items->Add(szBuf);
if(i==nAddrID)nCur=n;
n++;
}
}
pBox->ItemIndex=nCur;
}
//判断地址是否已使用
int IsAddrUsed(void *pHead,DWORD nNetID,int nIPPort,int nAddr)
{
void *pCur;
CONTROLER *a;
int i,rc;
rc=FALSE;
for(i=0;;i++){
pCur = GetDotOnTList(pHead,i);
if(pCur==NULL)break;
a=LookControler(pCur);
if(a->nNetID==nNetID && (int)(a->nIPPort)==nIPPort && (int)(a->nAddrID)==nAddr)
{ rc=TRUE;break;}//有相同地址的记录,则停止搜索
}
return(rc);
}
//选择网络输入框
void __fastcall TEditCRForm::m_CommNetRBoxClick(TObject *Sender)
{
int n;
n = m_CommNetRBox->Checked;
if(n){//串行网络
m_IPEdit->Enabled=FALSE;
m_PortEdit->Enabled=FALSE;
m_PortUpDown->Enabled=FALSE;
m_CommCoBox->Enabled=TRUE;
if(this->Visible)
m_CommCoBox->SetFocus();
}
else {//IP网络
m_IPEdit->Enabled=TRUE;
m_PortEdit->Enabled=TRUE;
m_PortUpDown->Enabled=TRUE;
m_CommCoBox->Enabled=FALSE;
if(this->Visible)
m_IPEdit->SetFocus();
}
}
//获取编辑框中内容
int GetEditUnit(TEditCRForm *te,CONTROLER *t)
{
int n;
char szBuf[50];
//说明
te->m_NameEdit->GetTextBuf(t->szName,sizeof(t->szName));
//说明
te->m_HostEdit->GetTextBuf(t->szHostName,sizeof(t->szHostName));
//类型
t->nType= te->m_TypeCoBox->ItemIndex;
//设备状态
n= te->m_StatusCoBox->ItemIndex;
SetCRUnLinkFlag(t,n);
//通讯地址
te->m_AddrCoBox->GetTextBuf(szBuf,sizeof(szBuf));
t->nAddrID = atoi(szBuf);
//通讯网络
n= te->m_CommNetRBox->Checked;
if(n){//串行通讯
t->nNetID = te->m_CommCoBox->ItemIndex;
t->nIPPort=0;
}
else{
te->m_IPEdit->GetTextBuf(szBuf,sizeof(szBuf));
t->nNetID= IPStrToDWORD(szBuf);
te->m_PortEdit->GetTextBuf(szBuf,sizeof(szBuf));
t->nIPPort=atoi(szBuf);
}
SetCRIPNetFlag(t,!n);
return(TRUE);
}
//获取编辑内容
int GetEditText(TEditCRForm *te,void *pHead,int nIndex)
{
static char pszText[]="添加/修改的控制器\n"
"其名称:\"%s\"或其中的车道\n\n已经有重复!";
char szBuf[100];
int nCur;
CONTROLER *pCR;
pCR = &te->m_EditText;
GetEditUnit(te,pCR);
nCur= GetOtherControlerOnTList(pHead,pCR,nIndex);
if(nIndex>=0 && nCur<=0){//修改
SetDotTextOnTList(pHead,nIndex,pCR,sizeof(CONTROLER));
nCur=nIndex;
}
else if(nCur<0){//不存在该记录,添加
pCR->nCRNo = GetMaxCRNoOnList(pHead)+1;
if(AddContentToTList(pHead,pCR,sizeof(CONTROLER)))
nCur=LookCount(pHead)-1;
else nCur=-2;
}
else{ //重复,提示错误
wsprintf(szBuf,pszText,pCR->szName);
Application->MessageBox(szBuf,GetMainTitle(),
MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
te->m_AddrCoBox->SetFocus();
nCur=-1;
}
return(nCur);
}
//获取相同编号(-1=>无,0=>原来,1=>其它记录)
int GetOtherControlerOnTList(void *pHead,CONTROLER *Sour,int nOld)
{
void *pCur;
CONTROLER *a;
int i,j,rc;
WORD *pRoadNo,*pOldRoadNo;
int nRoads,nOldRoads;
char *pszName;
rc=-1;
pszName= Sour->szName;
nOldRoads=Sour->nRoads;
pOldRoadNo=Sour->wzRoadNo;
for(i=0;;i++){
pCur = GetDotOnTList(pHead,i);
if(pCur==NULL)break;
a=LookControler(pCur);
if(lstrcmpi(pszName,a->szName)==0)
{
if(i!=nOld){rc=1;break;}//有不同的记录,则停止搜索
else rc=0; //相同的记录,则继续搜索
}
if(i!=nOld){ //搜索节点的车道是否被用
pRoadNo=a->wzRoadNo;
nRoads =a->nRoads;
if(nRoads>nOldRoads)nRoads=nOldRoads;
for(j=0;j<nRoads;j++)
if(pOldRoadNo[j]==pRoadNo[j])break;
if(j<nRoads){rc=1;break;}//有不同的记录,则停止搜索
}
}
return(rc);
}
//添加
void __fastcall TEditCRForm::m_AddButClick(TObject *Sender)
{
int rc;
rc = GetEditText(this,m_pHead,-1);//获取编辑内容
if(rc>=0){ ModalResult=IDOK; m_nIndex=rc; }
else { ModalResult=0; }
}
//修改
void __fastcall TEditCRForm::m_EditButClick(TObject *Sender)
{
int rc;
rc = GetEditText(this,m_pHead,m_nIndex);//获取编辑内容
if(rc>=0){ ModalResult=IDOK; m_nIndex=rc; }
else { ModalResult=0; }
}
//设置RoadGrid标题
void SetRoadGridTitle(TStringGrid *pGrid)
{
static char *pszTitle[]={"No.","车道名称(类型)"};
int i,nWidth,x[10];
nWidth=pGrid->ClientRect.Width();
ZeroMemory(x,sizeof(x));
x[0]=25;
x[1]=nWidth -(x[0]+2);
for(i=0;i<2;i++){
pGrid->ColWidths[i]=x[i];
pGrid->Cells[i][0]=pszTitle[i];
}
}
//设置RoadGrid内容
void SetRoadGridText(TStringGrid *pGrid,CONTROLER *pCR)
{
TStringList *t;
int i,n;
char szBuf[50];
ClearGridAllText(pGrid,FALSE);
try{ t = new TStringList;}
catch(...){return;}
n = pCR->nRoads;
for(i=0;i<n;i++){
t->Clear();
wsprintf(szBuf,"%02d",i+1);
t->Add(szBuf);
GetRoadwayNameText(szBuf,pCR->wzRoadNo[i]);
t->Add(szBuf);
//显示Grid的nIndex行内容
DispGridText(pGrid,t,i);
}
delete t;
}
void __fastcall TEditCRForm::m_RoadGridDrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
if(State.Contains(gdFixed))//显示格栅标题
DispGridTitle(Sender,ACol,ARow,Rect,clRed);
}
void __fastcall TEditCRForm::m_RoadGridSelectCell(TObject *Sender,
int ACol, int ARow, bool &CanSelect)
{
int rc,n;
rc=TRUE;
n = m_EditText.nRoads;
if(ARow>n && ARow>1)rc=FALSE;
CanSelect=rc;
}
//删除车道
void __fastcall TEditCRForm::m_EraseButClick(TObject *Sender)
{
static char
pszText[]="是否真的删除\n\n名称为:\"%s\"的车道?";
void *p;
char szBuf[100],szName[30];
int i,rc,nIndex;
int nRoads;
WORD *pRoadNo;
rc=FALSE;
nRoads = m_EditText.nRoads;
pRoadNo = m_EditText.wzRoadNo;
nIndex= m_RoadGrid->Row-1;
if(nRoads>0 && nIndex<nRoads){
GetRoadwayNameText(szName,pRoadNo[nIndex]);
wsprintf(szBuf,pszText,szName);
rc= Application->MessageBox(szBuf,GetMainTitle(),
MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2|MB_APPLMODAL);
if(rc==IDYES)rc=TRUE;//将删除
else rc=FALSE;
}
if(rc){
nRoads--;
for(i=nIndex;i<nRoads;i++)
pRoadNo[i]=pRoadNo[i+1];
m_EditText.nRoads = nRoads;
SetRoadGridText(m_RoadGrid,&m_EditText);//重新显示
i=nRoads;
if(i<=0)i=1;
m_RoadGrid->Row=i;
m_InsertBut->Enabled=TRUE;
}
if(nRoads<=0)
m_EraseBut->Enabled=FALSE;
}
//添加车道
void __fastcall TEditCRForm::m_InsertButClick(TObject *Sender)
{
int rc,n,nTotal;
CONTROLER *pCR;
pCR = &m_EditText;
nTotal = sizeof(pCR->wzRoadNo)/sizeof(WORD);
if(pCR->nRoads>=nTotal)return; //超过数量
//获取未分配的车道
rc=FindUnAllocRoadNo(m_pHead,pCR);
if(rc){//选择一个车道
n=SelectOneRoadNo(this);
if(n>0){
pCR->wzRoadNo[pCR->nRoads++]=n;
SetRoadGridText(m_RoadGrid,pCR);//重新显示
}
}
FreeUnAllocRoadNo();//释放已内存
if(pCR->nRoads>=nTotal)
m_InsertBut->Enabled=FALSE;
if(pCR->nRoads>0)
m_EraseBut->Enabled=TRUE;
}
static WORD *pUnAllocRoadNo; //所有未分配的车道
static WORD nUnAllocRoads; //所有未分配的车道数
//获取未分配的车道
int FindUnAllocRoadNo(void *pCRList,CONTROLER *pCurCR)
{
int nRoadNo,nCRNo,nOldCRNo;
int nCurRoads;
WORD *pCurRoadNo;
int i,j,rc,nTotal,nCurCR;
void *pCur;
void *pRoadList;
pRoadList=GetRoadwayList();
nTotal = LookCount(pRoadList);
if(nTotal<=0)return(0);
pUnAllocRoadNo = (WORD *)GlobalAlloc(GPTR,nTotal*sizeof(WORD));
if(pUnAllocRoadNo==NULL){ //内存不够
ShowNotMemory(GetMainTitle());
return(FALSE);
}
nUnAllocRoads=0;
nOldCRNo = pCurCR->nCRNo;
nCurRoads = pCurCR->nRoads;
pCurRoadNo = pCurCR->wzRoadNo;
for(i=0;;i++){//寻找未分配车道
pCur = GetDotOnTList(pRoadList,i);
if(pCur==NULL)break;
nRoadNo = LookRoadway(pCur)->nNo;
pCur = GetCRWithRoadNo(pCRList,nRoadNo);
rc=TRUE; nCurCR=TRUE;
if(pCur!=NULL){//判断是否属于当前控制器
nCRNo = ((CONTROLER *)pCur)->nCRNo;
if(nCRNo != nOldCRNo)nCurCR=FALSE;
}
if(nRoadNo==0)rc=FALSE;
else if(nCurCR){//属于当前编辑控制器节点
for(j=0;j<nCurRoads;j++)
if(nRoadNo==(int)pCurRoadNo[j]){ rc=FALSE;break;}
}
else rc=FALSE;//属于其他控制器节点
if(rc){ //未分配
if(nUnAllocRoads<nTotal)
pUnAllocRoadNo[nUnAllocRoads++]=nRoadNo;
else break;
}
}
return(nUnAllocRoads);
}
//释放已内存
void FreeUnAllocRoadNo(void)
{
GlobalFree(pUnAllocRoadNo);
pUnAllocRoadNo=NULL;
}
//获取未分配车道名称
int GetUnAllocRoadway(int nItem,char *pszStr)
{
int rc;
if(nItem>=0 && nItem<nUnAllocRoads){
GetRoadwayNameText(pszStr,pUnAllocRoadNo[nItem]);
rc=TRUE;
}
else rc=FALSE;
return(rc);
}
//选择一个车道
int SelectOneRoadNo(TObject *Owner)
{
static char pszText[]="请选择一个车道(&R)";
LISTPARAM pe;
int n;
ZeroMemory(&pe,sizeof(pe));
pe.pszTitle=GetMainTitle();
pe.pszText=pszText;
pe.GetStr=GetUnAllocRoadway;
pe.nSelect=0;
n=SelectListNum(Owner,&pe);
if(n>=0) n=pUnAllocRoadNo[n];
return(n);
}
//获取控制器链表中最大的编号
int GetMaxCRNoOnList(void *pHead)
{
int i,n,nMax;
void *pCur;
nMax=0;
for(i=0;;i++){
pCur = GetDotOnTList(pHead,i);
if(pCur==NULL)break;
n=LookControler(pCur)->nCRNo;
if(n>nMax)nMax=n;
}
return(nMax);
}
void __fastcall TEditCRForm::m_IPEditChange(TObject *Sender)
{
EditIPChange(Sender);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -