📄 parkspace.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <math.h>
#pragma hdrstop
#include "ParkSpace.h"
#include "Gridtool.h"
#include "dido.h"
#include "option.h"
#include "CBuilder.h"
#include "param.h"
#include "dynamic.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//设置显示内容
static void SetEditText(TParkForm *te);
//设置Grid内容
static void SetParkGridText(TStringGrid *pGrid,void *pPark);
//---------------------------------------------------------------------------
//设置假日格栅宽度
static void SetParkGridWidth(TStringGrid *pGrid);
//设置显示收费并保存已显示收费
static int ShowParkText(TParkForm *te,int nPark);
//设置一个显示收费
static void SetOneParkText(TParkForm *te,void *pParkList,int nPark);
//获取一个显示收费
static int GetOneParkText(TParkForm *te,void *pParkList,int nPark);
//获取相同编号(-1=>无,0=>原来,1=>其它记录)
static int GetOtherOnTList(void *pHead,PARKDATA *Sour,int nOld);
//设置收费方式组合框
static void SetParkTypeCoBox(TComboBox *pBox);
//设置收费金额子控件
static int SetParkControl(TParkForm *te);
//设置状态栏
static void SetStatusBar(TStatusBar *pBar,int nMode);
//---------------------------------------------------------------------------
__fastcall TParkForm::TParkForm(TComponent* Owner)
: TForm(Owner)
{
m_pHead = new TList;
}
//---------------------------------------------------------------------------
void __fastcall TParkForm::FormDestroy(TObject *Sender)
{
DelTList(m_pHead);
delete m_pHead;
}
//---------------------------------------------------------------------------
//设置停车场
int SetParkData(TObject *Owner)
{
TParkForm *se;
int rc;
rc=FALSE;
se = new TParkForm((TComponent*)Owner);
if(se!=NULL){
SetEditText(se);
se->ShowModal();
rc=se->m_nDone;
delete se;
}
return(rc);
}
//设置显示内容
void SetEditText(TParkForm *te)
{
void *pList;
int n;
pList = te->m_pHead;
te->m_nEdit = -1;
te->m_nDone=0;
//拷贝TList链,nSize:节点内容尺寸
CopyTList(pList,GetParkList(),sizeof(PARKDATA));
SetParkGridWidth(te->m_TextGrid); //设置格栅宽度
SetParkGridText(te->m_TextGrid,pList);
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);
}
//设置Grid内容
void SetParkGridText(TStringGrid *pGrid,void *pHead)
{
void *pCur;
PARKDATA *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 = LookPark(pCur);
wsprintf(szBuf,"%02d",a->nParkNo);
t->Add(szBuf);
t->Add(a->szName);//描述
wsprintf(szBuf,"%d",a->nSpace);
t->Add(szBuf);
//显示Grid的nIndex行内容
DispGridText(pGrid,t,i);
}
delete t;
}
//设置假日格栅宽度
void SetParkGridWidth(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; x[2]=55;
for(i=0;i<n;i++)nWidth-=x[i]+1;
x[1]=nWidth;
for(i=0;i<n;i++){
pGrid->ColWidths[i]=x[i];
pGrid->Cells[i][0]=pszTitle[i];
}
}
void __fastcall TParkForm::m_TextGridDrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
PARKDATA a;
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; m_nEdit=n;//显示一个停车场
GetDotTextOnTList(m_pHead,n,&a,sizeof(a));
m_NameEdit->SetTextBuf(a.szName);
m_SpaceUpDown->Position=a.nSpace;
}
}
//---------------------------------------------------------------------------
void __fastcall TParkForm::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;
}
//获取一个显示收费
int GetOneParkText(TParkForm *te,void *pParkList,int nPark)
{
static char pszText[]="修改的停车场名称:\"%s\"\n\n"
"已经有重复!";
PARKDATA a;
char szBuf[100];
int rc;
rc=FALSE;
if(nPark>=0){
GetDotTextOnTList(pParkList,nPark,&a,sizeof(a));
//获取编辑内容
te->m_NameEdit->GetTextBuf(a.szName,sizeof(a.szName));
a.nSpace=te->m_SpaceUpDown->Position;
rc=GetOtherOnTList(pParkList,&a,nPark);
if(rc>0){ //重复,提示错误
wsprintf(szBuf,pszText,a.szName);
Application->MessageBox(szBuf,GetMainTitle(),
MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
rc=FALSE;
}
else rc=SetDotTextOnTList(pParkList,nPark,&a,sizeof(a));
}
return(rc);
}
//---------------------------------------------------------------------------//获取相同编号(-1=>无,0=>原来,1=>其它记录)
int GetOtherOnTList(void *pHead,PARKDATA *Sour,int nOld)
{
void *pCur;
int i,rc;
char *pszOld,*pszNew;
rc=-1;
pszOld= Sour->szName;
for(i=0;;i++){
pCur = GetDotOnTList(pHead,i);
if(pCur==NULL)break;
pszNew=LookPark(pCur)->szName;
if(lstrcmpi(pszNew,pszOld)==0){
if(i!=nOld){rc=1;break;}//有不同的记录,则停止搜索
else rc=0; //相同的记录,则继续搜索
}
}
return(rc);
}
//---------------------------------------------------------------------------
void __fastcall TParkForm::m_CurGBoxExit(TObject *Sender)
{
int rc,nOld;
nOld = m_nEdit;
//获取其它收费的编辑内容
rc=GetOneParkText(this,m_pHead,nOld);
if(rc || nOld<0){
m_CurGBox->Enabled=FALSE;
SetStatusBar(m_StatusBar,FALSE);
}
else m_CurGBox->SetFocus();
if(rc)
SetParkGridText(m_TextGrid,m_pHead);//重新显示
}
//---------------------------------------------------------------------------
void __fastcall TParkForm::m_AddButClick(TObject *Sender)
{
static char pszType[]="停车场%d";
void *pCur;
PARKDATA a;
int n;
n=0;
pCur = GetLastDotOnTList(m_pHead);//获取LOOKLIST链上的最后一个节点
if(pCur!=NULL)n=LookPark(pCur)->nParkNo+1;
else n=0;
ZeroMemory(&a,sizeof(a));
a.nParkNo = n;
wsprintf(a.szName,pszType,n);
pCur=AddContentToTList(m_pHead,&a,sizeof(a));//增加内容到TList链末尾
if(pCur!=NULL){//增加成功
SetParkGridText(m_TextGrid,m_pHead);//重新显示
m_TextGrid->Row=LookCount(m_pHead);
m_DelBut->Enabled=TRUE;
m_EditBut->Enabled=TRUE;
m_EditButClick(m_EditBut);
}
}
//---------------------------------------------------------------------------
void __fastcall TParkForm::m_EditButClick(TObject *Sender)
{
SetStatusBar(m_StatusBar,TRUE);
m_CurGBox->Enabled=TRUE;
m_NameEdit->SetFocus();
}
//设置状态栏
void SetStatusBar(TStatusBar *pBar,int nMode)
{
static char *pszText[]={"正在浏览数据","正在编辑数据"};
if(nMode!=0)nMode=1;
pBar->Panels->Items[1]->Text=pszText[nMode];
}
void __fastcall TParkForm::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 TParkForm::m_SaveButClick(TObject *Sender)
{
SaveAllPark(m_pHead);
CopyTList(GetParkList(),m_pHead,sizeof(PARKDATA));
m_SaveBut->Enabled=FALSE;
m_nDone=TRUE;
}
//---------------------------------------------------------------------------
void __fastcall TParkForm::EditTextChange(TObject *Sender)
{
if(m_CurGBox->Enabled) m_SaveBut->Enabled=TRUE;
}
//---------------------------------------------------------------------------
void __fastcall TParkForm::m_DelButClick(TObject *Sender)
{
static char
pszText[]="是否真的删除\n\n名称为\"%s\"\n\n"
"的停车场?",
pszDefault[]="不能删除编号为 \"0\"\n的停车场!";
void *p,*pHead;
PARKDATA *t;
char szBuf[100];
int rc,nIndex,nCount;
rc=FALSE;
nIndex= m_TextGrid->Row-1;
pHead = m_pHead;
p = GetDotOnTList(pHead,nIndex);
if(p!=NULL){
t = LookPark(p);
if(t->nParkNo==0){
Application->MessageBox(pszDefault,GetMainTitle(),
MB_OK|MB_ICONSTOP|MB_APPLMODAL);
}
else{
wsprintf(szBuf,pszText,t->szName);
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;
SetParkGridText(m_TextGrid,pHead);//重新显示
if(nCount<=0){
m_DelBut->Enabled=FALSE;
m_EditBut->Enabled=FALSE;
}
m_SaveBut->Enabled=TRUE;
}
}
//---------------------------------------------------------------------------
void __fastcall TParkForm::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 + -