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

📄 price.cpp

📁 停车场用
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <math.h>
#pragma hdrstop

#include "Gridtool.h"
#include "dido.h"
#include "option.h"
#include "CBuilder.h"
#include "dynamic.h"
#include "Price.h"
#include "param.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

//设置显示内容
static void SetEditText(TPriceForm *te);
//获取编辑内容
static void GetEditUnit(TPriceForm *te,PRICEDATA *pPrice);

//设置Grid内容
static void SetPriceGridText(TStringGrid *pGrid,void *pPrice);

//---------------------------------------------------------------------------
static char *GetPriceHeader(int nItem);
//设置假日格栅宽度
static void SetPriceGridWidth(TStringGrid *pGrid);
//设置显示收费并保存已显示收费
static int ShowPriceText(TPriceForm *te,int nPrice);
//设置一个显示收费
static void SetOnePriceText(TPriceForm *te,void *pPriceList,int nPrice);
//获取一个显示收费
static int GetOnePriceText(TPriceForm *te,void *pPriceList,int nPrice);
//获取相同编号(-1=>无,0=>原来,1=>其它记录)
static int GetOtherOnTList(void *pHead,PRICEDATA *Sour,int nOld);
//设置收费方式组合框
static void SetPriceTypeCoBox(TComboBox *pBox);
//设置收费金额子控件
static int SetPriceControl(TPriceForm *te);
//设置状态栏
static void SetStatusBar(TStatusBar *pBar,int nMode);

//---------------------------------------------------------------------------
__fastcall TPriceForm::TPriceForm(TComponent* Owner)
    : TForm(Owner)
{
 m_pHead = new TList;
}
//---------------------------------------------------------------------------
void __fastcall TPriceForm::FormDestroy(TObject *Sender)
{
 DelTList(m_pHead);
 delete m_pHead;
}
//---------------------------------------------------------------------------
//设置停车收费
int SetPrice(TObject *Owner)
 {
  TPriceForm *se;
  int rc;

  rc=FALSE;
  se = new TPriceForm((TComponent*)Owner);
  if(se!=NULL){
    SetEditText(se);
    se->ShowModal();
    rc=se->m_nDone;
    delete se;
   }
  return(rc);
 }
//设置显示内容
void SetEditText(TPriceForm *te)
 {
  void *pList;
  int n;

  pList = te->m_pHead;
      //拷贝TList链,nSize:节点内容尺寸
  CopyTList(pList,GetPriceList(),sizeof(PRICEDATA));

  te->m_nEdit = -1;
  te->m_nDone=0;

  SetPriceGridWidth(te->m_TextGrid);  //设置格栅宽度
  SetPriceGridText(te->m_TextGrid,pList);
  SetPriceTypeCoBox(te->m_ChargeCoBox);//设置收费方式组合框

  if(LookCount(pList)<=0)n=FALSE;
  else n=TRUE;
  te->m_DelBut->Enabled=n;
  te->m_EditBut->Enabled=n;
  te->m_SaveBut->Enabled=FALSE;
  te->m_CurGBox->Enabled=FALSE;
  SetStatusBar(te->m_StatusBar,FALSE);
 }
//设置收费方式组合框
void SetPriceTypeCoBox(TComboBox *pBox)
 {
  int i;
  char *p;

  pBox->Items->Clear();
  for(i=0;;i++){
    p = GetChargeType(i);
    if(p==NULL)break;
    pBox->Items->Add(p);
   }
  pBox->ItemIndex=0;
 }

//设置Grid内容
void SetPriceGridText(TStringGrid *pGrid,void *pHead)
 {
  void *pCur;
  PRICEDATA *a;
  TStringList *t;
  int i,n;
  char szBuf[50],*p;

  ClearGridAllText(pGrid,FALSE);
  try{ t = new TStringList;}
  catch(...){return;}

  for(i=0;;i++){
    pCur = GetDotOnTList(pHead,i);
    if(pCur==NULL)break;

    t->Clear();
    a = LookPrice(pCur);
    wsprintf(szBuf,"%02d",a->nID);
    t->Add(szBuf);
    t->Add(a->szUserType);//描述
    p=GetChargeType(a->nChargeType);//收费类型:进入、外出、混合
    t->Add(p);

     //显示Grid的nIndex行内容
    DispGridText(pGrid,t,i);
   }
  delete t;
 }
//设置假日格栅宽度
void SetPriceGridWidth(TStringGrid *pGrid)
 {
  static char *pszTitle[]={"No.","类型名称","收费方式"};
  int x[10];
  int i,m,n,nWidth;

  nWidth = pGrid->ClientRect.Width();
  n = pGrid->ColCount;
  ZeroMemory(x,sizeof(x));
  x[0]=30;
  for(i=0;i<n;i++)nWidth-=x[i]+1;
  if(n>1) nWidth = nWidth/(n-1);
  for(i=1;i<n;i++)x[i]=nWidth;
  for(i=0;i<n;i++){
    pGrid->ColWidths[i]=x[i];
    pGrid->Cells[i][0]=pszTitle[i];
   }
 }

void __fastcall TPriceForm::m_TextGridDrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
  int n;

  if(State.Contains(gdFixed))//显示格栅标题
    DispGridTitle(Sender,ACol,ARow,Rect,clRed);
  else if(ACol>1)//设置格栅文字颜色,文字居中
    SetGridTextColor(Sender,ACol,ARow,Rect,-1,DT_CENTER);
  else if(State.Contains(gdSelected) && ACol==1){//设置显示收费并保存已显示收费
    n = ARow-1;
    SetOnePriceText(this,m_pHead,n);
    m_nEdit=n;
   }
}
//---------------------------------------------------------------------------
void __fastcall TPriceForm::m_TextGridSelectCell(TObject *Sender,
      int ACol, int ARow, bool &CanSelect)
{
 int rc,n;

 rc=TRUE;
 n = LookCount(m_pHead);
 if(ARow>n){
   rc=FALSE;
   m_TextGrid->Row=n>0?n:1;
  }
 CanSelect=rc;
}
//设置一个显示收费
void SetOnePriceText(TPriceForm *te,void *pPriceList,int nIndex)
 {
  char szBuf[50];
  PRICEDATA a;

  GetDotTextOnTList(pPriceList,nIndex,&a,sizeof(a));

  te->m_NameEdit->SetTextBuf(a.szUserType);
  te->m_ChargeCoBox->ItemIndex = a.nChargeType;

  sprintf(szBuf,"%-6.2f",a.fPriceValue);
  te->m_PriceEdit->SetTextBuf(szBuf);

  sprintf(szBuf,"%-6.2f",a.fFirstPrice);
  te->m_FirstPriceEdit->SetTextBuf(szBuf);

  sprintf(szBuf,"%-6.2f",a.fSecondPrice);
  te->m_SecondPriceEdit->SetTextBuf(szBuf);

  sprintf(szBuf,"%-6.2f",a.fNightPrice);
  te->m_NightEdit->SetTextBuf(szBuf);

  te->m_FirstUpDown->Position=a.nFirstTime;
  te->m_SecondUpDown->Position=a.nSecondTime;
  te->m_NeverUpDown->Position=a.nNeverTime;

  SetPriceControl(te);
 }
//获取一个显示收费
int GetOnePriceText(TPriceForm *te,void *pPriceList,int nPrice)
 {
  static char pszText[]="修改的用户收费类型:\"%s\"\n\n"
      "已经有重复!";
  PRICEDATA a;
  char szBuf[100];
  int rc;

  rc=FALSE;
  if(nPrice>=0){
    GetDotTextOnTList(pPriceList,nPrice,&a,sizeof(a));
    GetEditUnit(te,&a);
    rc=GetOtherOnTList(pPriceList,&a,nPrice);
    if(rc>0){ //重复,提示错误
      wsprintf(szBuf,pszText,a.szUserType);
      Application->MessageBox(szBuf,GetMainTitle(),
          MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
      rc=FALSE;
     }
    else
      rc=SetDotTextOnTList(pPriceList,nPrice,&a,sizeof(a));
   }
  return(rc);
 }
//获取编辑内容
void GetEditUnit(TPriceForm *te,PRICEDATA *pPrice)
 {
  int n;
  char szBuf[40];

  if(pPrice==NULL)return;

  te->m_NameEdit->GetTextBuf(pPrice->szUserType,
          sizeof(pPrice->szUserType));
  pPrice->nChargeType=(BYTE)te->m_ChargeCoBox->ItemIndex;

  te->m_PriceEdit->GetTextBuf(szBuf,sizeof(szBuf));
  pPrice->fPriceValue=atof(szBuf);

  te->m_FirstPriceEdit->GetTextBuf(szBuf,sizeof(szBuf));
  pPrice->fFirstPrice=atof(szBuf);

  te->m_SecondPriceEdit->GetTextBuf(szBuf,sizeof(szBuf));
  pPrice->fSecondPrice=atof(szBuf);

  te->m_NightEdit->GetTextBuf(szBuf,sizeof(szBuf));
  pPrice->fNightPrice=atof(szBuf);

  pPrice->nFirstTime=te->m_FirstUpDown->Position;
  pPrice->nSecondTime=te->m_SecondUpDown->Position;
  pPrice->nNeverTime=te->m_NeverUpDown->Position;
 }
//---------------------------------------------------------------------------
void __fastcall TPriceForm::m_ChargeCoBoxChange(TObject *Sender)
{
 SetPriceControl(this);
}
//设置收费金额子控件
int SetPriceControl(TPriceForm *te)
 {
//不收费,按次收费,按时收费,按日收费,按月收费,按季收费,按年收费,一次性收费
  static char *pszText[]={NULL,"每次收费","最高限额","每日收费","每月收费",
    "每季收费","每年收费","一次性收费"};
  int nMode;
  char *p;

  nMode = te->m_ChargeCoBox->ItemIndex;
  if(nMode==2)//"按时收费"
   SetChildState(te,100,130,SW_SHOW);
  else{
    SetChildState(te,100,130,SW_SHOWNA);//先关闭所有收费项目
    if(nMode==1) //"按次收费"
     SetChildState(te,111,130,SW_SHOW);
    else if(nMode!=0)SetChildState(te,111,113,SW_SHOW);
   }

  if(nMode>=0 && nMode<sizeof(pszText)/sizeof(char *))
    p=pszText[nMode];
  else p=NULL;
  if(p!=NULL)//设置主要收费项名称
    te->m_PriceTextLabel->SetTextBuf(p);

  return(nMode);
 }
//获取相同编号(-1=>无,0=>原来,1=>其它记录)
int GetOtherOnTList(void *pHead,PRICEDATA *Sour,int nOld)
 {
  void *pCur;
  int i,rc;
  char *pszOld,*pszNew;

  rc=-1;
  pszOld= Sour->szUserType;
  for(i=0;;i++){
    pCur = GetDotOnTList(pHead,i);
    if(pCur==NULL)break;

    pszNew=LookPrice(pCur)->szUserType;
    if(lstrcmpi(pszNew,pszOld)==0){
       if(i!=nOld){rc=1;break;}//有不同的记录,则停止搜索
       else rc=0;  //相同的记录,则继续搜索
      }
   }
  return(rc);
 }
//---------------------------------------------------------------------------
void __fastcall TPriceForm::m_CurGBoxExit(TObject *Sender)
{
 int rc,nOld;

  nOld = m_nEdit;

  //获取其它收费的编辑内容
  rc=GetOnePriceText(this,m_pHead,nOld);
  if(rc || nOld<0){
    m_CurGBox->Enabled=FALSE;
    SetStatusBar(m_StatusBar,FALSE);
   }
  else m_CurGBox->SetFocus();
  if(rc)
    SetPriceGridText(m_TextGrid,m_pHead);//重新显示
 }
//---------------------------------------------------------------------------
void __fastcall TPriceForm::m_AddButClick(TObject *Sender)
 {
  static char pszDefault[]="临时用户",
      pszType[]="用户类型%d";
  void *pCur;
  PRICEDATA a;
  int n;

  n=0;
  pCur = GetLastDotOnTList(m_pHead);//获取LOOKLIST链上的最后一个节点
  if(pCur!=NULL)n=LookPrice(pCur)->nID+1;
  else n=0;

  ZeroMemory(&a,sizeof(a));
  a.nID = n;
  if(n==0)//第一项为默认的类型
    lstrcpy(a.szUserType,pszDefault);
  else wsprintf(a.szUserType,pszType,n);

  pCur=AddContentToTList(m_pHead,&a,sizeof(a));//增加内容到TList链末尾
  if(pCur!=NULL){//增加成功
    SetPriceGridText(m_TextGrid,m_pHead);//重新显示
    m_TextGrid->Row=LookCount(m_pHead);
    m_DelBut->Enabled=TRUE;
    m_EditBut->Enabled=TRUE;
    m_EditButClick(m_EditBut);
   }
 }
//---------------------------------------------------------------------------
void __fastcall TPriceForm::m_EditButClick(TObject *Sender)
{
  SetStatusBar(m_StatusBar,TRUE);
  m_CurGBox->Enabled=TRUE;
  if(m_NameEdit->Enabled)m_NameEdit->SetFocus();
  else m_ChargeCoBox->SetFocus();
}
//设置状态栏
void SetStatusBar(TStatusBar *pBar,int nMode)
 {
  static char *pszText[]={"正在浏览数据","正在编辑数据"};

  if(nMode!=0)nMode=1;
  pBar->Panels->Items[1]->Text=pszText[nMode];
 }

void __fastcall TPriceForm::m_StatusBarDrawPanel(TStatusBar *StatusBar,
      TStatusPanel *Panel, const TRect &Rect)
{
  TCanvas *tc;
  int nColor;

  nColor=clBlue;
  tc = StatusBar->Canvas;
  RectText(tc,Rect,Panel->Text,nColor,DT_LEFT);
}

//---------------------------------------------------------------------------
void __fastcall TPriceForm::m_SaveButClick(TObject *Sender)
{
 SaveAllPrice(m_pHead);
 CopyTList(GetPriceList(),m_pHead,sizeof(PRICEDATA));
 m_SaveBut->Enabled=FALSE;
 m_nDone=TRUE;

}
//---------------------------------------------------------------------------

void __fastcall TPriceForm::EditTextChange(TObject *Sender)
{
 if(m_CurGBox->Enabled) m_SaveBut->Enabled=TRUE;
}
//---------------------------------------------------------------------------

void __fastcall TPriceForm::m_DelButClick(TObject *Sender)
{
  static char
    pszText[]="是否真的删除\n\n名称为\"%s\"\n类型为\"%s\"\n\n"
             "的用户收费类型?",
    pszDefault[]="不能删除\n 编号为 \"0\" 用户收费类型!";
  void *p,*pHead;
  PRICEDATA *t;
  char szBuf[200];
  int rc,nIndex,nCount;

  rc=FALSE;
  nIndex= m_TextGrid->Row-1;
  pHead = m_pHead;
  p = GetDotOnTList(pHead,nIndex);
  if(p!=NULL){
    t = LookPrice(p);
    if(t->nID==0){
       Application->MessageBox(pszDefault,GetMainTitle(),
              MB_OK|MB_ICONSTOP|MB_APPLMODAL);
      }
    else{
      wsprintf(szBuf,pszText,t->szUserType,GetChargeType(t->nChargeType));
      rc= Application->MessageBox(szBuf,GetMainTitle(),
         MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2|MB_APPLMODAL);
      if(rc==IDYES)rc=TRUE;
      else rc=FALSE;
     }
   }
  if(rc){
    DelDotOnTList(pHead,nIndex);
    nCount = LookCount(pHead);
    if(nIndex>=nCount)nIndex=nCount-1;
    if(nIndex<0)nIndex=0;
    m_TextGrid->Row=nIndex+1;
    SetPriceGridText(m_TextGrid,pHead);//重新显示

    if(nCount<=0){
       m_DelBut->Enabled=FALSE;
       m_EditBut->Enabled=FALSE;
     }
    m_SaveBut->Enabled=TRUE;
   }
}
//---------------------------------------------------------------------------
void __fastcall TPriceForm::m_CloseButClick(TObject *Sender)
{
  int rc;

  rc= m_SaveBut->Enabled;
  if(rc)rc=AskSaveData();
  if(rc) m_SaveButClick(Sender);
  ModalResult=IDOK;
}

⌨️ 快捷键说明

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