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

📄 unit7.cpp

📁 餐厅结账管理程序提供中小型餐厅所需要的点菜结账功能
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit7.h"
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormOrder *FormOrder;
//---------------------------------------------------------------------------
__fastcall TFormOrder::TFormOrder(TComponent* Owner)
        : TForm(Owner)
{
  //---
  TableOrdered->Open();
  RefreshTreeView();
  TreeViewOrder->OnClick=FormClassDishMan->TreeView1->OnClick;
}
//---------------------------------------------------------------------------

void __fastcall TFormOrder::FormShow(TObject *Sender)
{
  TableChoose=-1;
  RefreshComboBox();
}
//---------------------------------------------------------------------------

void __fastcall TFormOrder::RefreshComboBox(void)
{
  TTable * tmpTable=FormTableMan->TableTable;
  AnsiString info_str;
  //从FormTableMan中读取所有的餐桌信息,写入下拉菜单中
  ComboBoxTable->Items->Clear();
  tmpTable->First();
  for(int i=0;i<tmpTable->RecordCount;i++)
  {
    info_str=tmpTable->FieldByName("TableNum")->AsString;
    info_str+="-";
    info_str+=tmpTable->FieldByName("TableType")->AsString;
    info_str+="-";
    info_str+=tmpTable->FieldByName("TableStatus")->AsString;
    ComboBoxTable->Items->Add(info_str);
    tmpTable->Next();
  }
}
//---------------------------------------------------------------------------
void __fastcall TFormOrder::RefreshTreeView(void)
{
  TMemoryStream * tmpTreeStream = new TMemoryStream();
  FormClassDishMan->TreeView1->SaveToStream(tmpTreeStream);
  tmpTreeStream->Position=0;
  TreeViewOrder->LoadFromStream(tmpTreeStream);
  TreeViewOrder->Items->GetFirstNode()->Expand(false);
  delete tmpTreeStream;
}
//---------------------------------------------------------------------------

void __fastcall TFormOrder::ComboBoxTableChange(TObject *Sender)
{
  int pos;
  if(ComboBoxTable->Text == "")
  {
    return;
  }
  else
  {
    pos=ComboBoxTable->Text.Pos("-");
    TableChoose=ComboBoxTable->Text.SubString(1,pos-1).ToInt();
    //查看选择的餐桌的状态
    FormTableMan->TableTable->IndexFieldNames="TableNum";
    FormTableMan->TableTable->SetKey();
    if(FormTableMan->TableTable->FindKey(ARRAYOFCONST((TableChoose))))
    {
      if(FormTableMan->TableTable->FieldByName("TableStatus")->AsString
           == "空闲" )
      {//询问是否启用该餐桌
        if(MessageDlg("该餐桌尚未启用,现在起用吗?",
           mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0)
           ==mrYes)
        {
          FormTableMan->TableTable->Edit();
          FormTableMan->TableTable->FieldByName("TableStatus")->AsString="使用";
          FormTableMan->TableTable->Post();
          RefreshComboBox(); //刷新下拉菜单
          //找到TableChoose所在的选项
          for(int i=0;i<ComboBoxTable->Items->Count;i++)
          {
            if(ComboBoxTable->Items->Strings[i].SubString(1,1).ToInt() == TableChoose)
            {
              ComboBoxTable->ItemIndex=i;
              //这里会触发ComboBoxTable的OnChange事件,所以不用再调用ComboBoxTableChange(this);
              break;
            }
          }
        }
        else
        {
          ComboBoxTable->ItemIndex=-1;
          TableChoose=-1;
          return;
        }
      }
    }
    else
    {
      MessageDlg("找不到该纪录!",mtError, TMsgDlgButtons() << mbOK, 0);
    }
    //根据餐桌号对TableOrdered进行过滤
    TableOrdered->Filter=AnsiString("TableNum = ")+AnsiString(TableChoose)
       +" AND Status = '未结帐'";
    TableOrdered->Filtered = true;
    //将已经有的菜单填入ListView中
    ListView1->Items->Clear();
    TListItem *NewItem;
    int dishnum;
    TableOrdered->First();
    for(int i=0;i<TableOrdered->RecordCount;i++)
    {
      dishnum=TableOrdered->FieldByName("DishNum")->AsInteger;
      //根据菜谱编号dishnum在FormClassDishMan->TableDish中查找对应纪录
      FormClassDishMan->TableDish->IndexFieldNames = "DishNum";
      FormClassDishMan->TableDish->SetKey();
      if(FormClassDishMan->TableDish->FindKey(ARRAYOFCONST((dishnum))))
      {
        TTable *tmpTable=FormClassDishMan->TableDish;
        NewItem=ListView1->Items->Add();
        //菜名
        NewItem->Caption=tmpTable->FieldByName("DishName")->AsString;
        NewItem->SubItems->Add(TableOrdered->FieldByName("Amount")->AsString);
        NewItem->SubItems->Add(tmpTable->FieldByName("DishPrice")->AsString);
        NewItem->SubItems->Add(AnsiString(dishnum)); //这一列隐藏的,在视图中看不到
        NewItem->SubItems->Add(tmpTable->FieldByName("DisCount")->AsString);
      }
      else
      {
        MessageDlg("找不到该纪录!",mtError, TMsgDlgButtons() << mbOK, 0);
      }
      TableOrdered->Next();
    }
  }
}
//---------------------------------------------------------------------------

void __fastcall TFormOrder::BitBtnAddClick(TObject *Sender)
{
  if(TableChoose == -1)
  {
    MessageDlg("请先选择餐桌号!",
              mtInformation, TMsgDlgButtons() << mbOK, 0);
    return;
  }
  if(TreeViewOrder->Selected->Level != 2)
  {
    MessageDlg("请选定一个菜谱名!",
              mtInformation, TMsgDlgButtons() << mbOK, 0);
    return;
  }
  //根据选择的菜谱名,查找以经点的菜中有没有该菜,如果有,将其数量增一,
  //如果没有,新增纪录
  bool havedish=false;
  int seldish=FormClassDishMan->TableDish->FieldByName("DishNum")->AsInteger;
  TableOrdered->First();
  for(int i=0;i<TableOrdered->RecordCount;i++)
  {
    if(TableOrdered->FieldByName("DishNum")->AsInteger == seldish)
    {
      //数量增一
      TableOrdered->Edit();  //设置为可编辑模式
      TableOrdered->FieldByName("Amount")->AsInteger +=1;  
      TableOrdered->Post();
      ComboBoxTableChange(this); //刷新列表视图的显示
      havedish=true;
      break;
    }
    TableOrdered->Next();
  }
  if(!havedish) //需要增加的菜谱名不再已选菜单中
  {
    TableOrdered->Append();
    TableOrdered->FieldByName("DishNum")->AsInteger=seldish;
    TableOrdered->FieldByName("TableNum")->AsInteger=TableChoose;
    TableOrdered->FieldByName("Amount")->AsFloat=1.0;
    TableOrdered->FieldByName("Status")->AsString="未结帐";
     //记录日期、时间
    DateSeparator = '-';
    ShortDateFormat = "yyyy/m/d";
    TableOrdered->FieldByName("Date")->AsString=DateToStr(Date());
    TableOrdered->FieldByName("Time")->AsString=TimeToStr(Time());
    TableOrdered->FieldByName("UserID")->AsInteger= FormMain->UserID;
    TableOrdered->Post();
    ComboBoxTableChange(this); //刷新列表视图的显示
  }
}
//---------------------------------------------------------------------------

void __fastcall TFormOrder::BitBtnDelClick(TObject *Sender)
{
  //ListView1->MultiSelect = false;
  if(ListView1->SelCount != 1 ) //选中一个需要退点的菜名
  {
     MessageDlg("请先从右边选择要退点的菜谱名称!",
               mtInformation, TMsgDlgButtons() << mbOK, 0);
     return;
  }
  //菜谱编号
  int seldish=ListView1->Selected->SubItems->Strings[2].ToInt();
  //在TableOrdered中查找要退的菜谱编号,
  //因为TableOrdered没有索引,没有key,所以只能通过循环判断
  TableOrdered->First();
  for(int i=0;i<TableOrdered->RecordCount;i++)
  {
    if(TableOrdered->FieldByName("DishNum")->AsInteger == seldish)
    {
      //如果数量大于1,则减一,如果数量等于1,则删除数据库中该条记录
      if(TableOrdered->FieldByName("Amount")->AsInteger > 1)
      {
        TableOrdered->Edit();
        TableOrdered->FieldByName("Amount")->AsInteger -= 1;
        TableOrdered->Post();
        //ComboBoxTableChange(this);
        ListView1->Selected->SubItems->Strings[0]=
           ListView1->Selected->SubItems->Strings[0].ToInt() - 1;
      }
      else  //Amount == 1
      {
        TableOrdered->Delete();
        ComboBoxTableChange(this);
      }
      break; //跳出循环
    }
    TableOrdered->Next();
  }
}
//---------------------------------------------------------------------------



⌨️ 快捷键说明

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