📄 price.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 + -