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

📄 editcr.cpp

📁 停车场用
💻 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 + -