unit book_meals1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, Grids, DBGrids, ADODB, Mask, StdCtrls, Buttons, SPComm,
  ExtCtrls, ComCtrls, StrUtils, Menus, OleCtrls, MSCommLib_TLB; type
  MyData=record
      MyData: array[1..50] of byte;
  end; //这样你要多少维都可以,这里是二维
  Tbook_meals_form = class(TForm)
    DBGrid1: TDBGrid;
    Comm1: TComm;
    Timer1: TTimer;
    Timer2: TTimer;
    btopenport: TButton;
    ComboBox1: TComboBox;
    Label2: TLabel;
    adoConn: TADOConnection;
    dsOrder: TDataSource;
    lblshowbooknum: TLabel;
    adqOrder: TADOQuery;
    tblOrder: TADOTable;
    ListBox1: TListBox;
    adqOrderS: TADOQuery;
    txtStatusTips: TLabel;
    Label1: TLabel;
    Timer3: TTimer;
    MSComm1: TMSComm;
    Timer4: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btopenportClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
    procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    procedure Timer4Timer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);  private
    { Private declarations }
    istimecount:Integer;
    iscommopen1:Boolean;
    istimecon1:Boolean;
    
  public
    { Public declarations }
    MyReceiveData: array[1..1000] of MyData;
    MyReceivePoint:Integer;//串口接到帧指针
    MyProcPoint:Integer;//已处理帧指针
  end;var
  book_meals_form: Tbook_meals_form;
implementation{$R *.dfm}
var
    DATA_BUFFE:array[1..5]of Byte;
    SET_FLAG: Byte;
    timeA1, timeA2, timeA3, timeA4, timeA5, timeA6 : string;
    timeP1, timeP2, timeP3, timeP4, timeP5, timeP6 : string;
    time11, time12, time13, time14, time15, time16 : string;
    time21, time22, time23, time24, time25, time26 : string;
    H, M, S, Ms : Word;
    intTimeP: Integer;
    t1Now:TDateTime; Po:Integer;const 
cvDay = 1.0;
cvHour = 1.0/24;
cvMinute = cvHour/60;
cvSecond = cvMinute/60;procedure tx_read_frame(leixing: Byte; data1: Byte; data2: Byte; data3: Byte; data4: Byte);
var
  Byteout:array of Byte; i: Byte; sum: Integer;
begin
   setlength(Byteout,8);
   Byteout[0] := $55;
   Byteout[1] := 1 Mod 256; // 模块地址 Mod 256
   Byteout[2] := leixing;
   Byteout[3] := data1;
   Byteout[4] := data2;
   Byteout[5] := data3;
   Byteout[6] := data4;
   sum := 0;
   For i := 0 To 6 do
   Begin
      sum := sum + Byteout[i];
   End;   Byteout[7] := sum Mod 256;
   book_meals_form.MSComm1.InBufferCount := 0;
   book_meals_form.MSComm1.Output := Byteout;
   setlength(Byteout,0);
end;
    
procedure SET_BUFF(leixing: Byte; data1: Byte; data2: Byte; data3: Byte; data4: Byte);
begin
    DATA_BUFFE[1] := leixing;
    DATA_BUFFE[2] := data1;
    DATA_BUFFE[3] := data2;
    DATA_BUFFE[4] := data3;
    DATA_BUFFE[5] := data4;
    SET_FLAG := 1;
end;procedure SEND_BUFF();
begin
    If (SET_FLAG = 0) Then
    begin
        tx_read_frame(0, 0, 0, 0, 0);
    end
    else
    begin
        SET_FLAG := 0;
        tx_read_frame(DATA_BUFFE[1], DATA_BUFFE[2], DATA_BUFFE[3], DATA_BUFFE[4], DATA_BUFFE[5]);
    end;
end;procedure PROCESS_STATUS();
var
BNum1, ENum1, SNum1 : Integer;
BNum2, ENum2, SNum2 : Integer;
vSQLString, strDate : string;
begin
   strDate := VarToStr(Date());
timeA1 := strDate + ' ' + time11;
timeA2 := strDate + ' ' + time12;
timeA3 := time13;
timeA4 := strDate + ' ' + time14;
timeA5 := strDate + ' ' + time15;
timeA6 := strDate + ' ' + time16;

timeP1 := strDate + ' ' + time21;
timeP2 := strDate + ' ' + time22;
timeP3 := time23;
timeP4 := strDate + ' ' + time24;
timeP5 := strDate + ' ' + time25;
    timeP6 := strDate + ' ' + time26;

// 计算中餐订餐人数 开始
    book_meals_form.adqOrder.SQL.Text := 'SELECT COUNT(*) AS CN FROM [订餐表] WHERE [订餐时间] BETWEEN #' + timeA1 + '# AND #' + timeA2 + '#';
    book_meals_form.adqOrder.Open();
    if (not book_meals_form.adqOrder.Active) then Exit;
    BNum1 := book_meals_form.adqOrder.FieldByName('CN').value;
// 计算订餐人数 结束// 计算取餐人数 开始
    book_meals_form.adqOrder.Close();
    book_meals_form.adqOrder.SQL.Clear();
    book_meals_form.adqOrder.SQL.Text := 'SELECT COUNT(*) AS CN FROM [订餐表] WHERE Status=1 AND [订餐时间] BETWEEN #' + timeA1 + '# AND #' + timeA2 + '#';
    book_meals_form.adqOrder.Open();
    if (not book_meals_form.adqOrder.Active) then Exit;
    ENum1 := book_meals_form.adqOrder.FieldByName('CN').value;
// 计算取餐人数 结束// 计算剩余取餐人数 开始
    SNum1 := 0;
    if (BNum1-ENum1) > 0 then
    begin
      SNum1 := BNum1-ENum1;
    end;
// 计算剩余取餐人数 结束// 计算晚餐订餐人数 开始
book_meals_form.adqOrder.Close();
    book_meals_form.adqOrder.SQL.Clear();
    book_meals_form.adqOrder.SQL.Text := 'SELECT COUNT(*) AS CN FROM [订餐表] WHERE [订餐时间] BETWEEN #' + timeP1 + '# AND #' + timeP2 + '#';
    book_meals_form.adqOrder.Open();
    if (not book_meals_form.adqOrder.Active) then Exit;
    BNum2 := book_meals_form.adqOrder.FieldByName('CN').value;
// 计算订餐人数 结束// 计算取餐人数 开始
book_meals_form.adqOrder.Close();
    book_meals_form.adqOrder.SQL.Clear();    
    book_meals_form.adqOrder.SQL.Text := 'SELECT COUNT(*) AS CN FROM [订餐表] WHERE Status=1 AND [订餐时间] BETWEEN #' + timeP1 + '# AND #' + timeP2 + '#';
    book_meals_form.adqOrder.Open();
    if (not book_meals_form.adqOrder.Active) then Exit;
    ENum2 := book_meals_form.adqOrder.FieldByName('CN').value;
// 计算取餐人数 结束// 计算剩余取餐人数 开始
    SNum2 := 0;
    if (BNum2-ENum2) > 0 then
    begin
      SNum2 := BNum2-ENum2;
    end;
// 计算剩余取餐人数 结束
book_meals_form.adqOrder.Close();
    
   book_meals_form.adqOrderS.SQL.Clear;
  
DecodeTime(Now(), H, M, S, Ms);
if(H<15)then
begin
   vSQLString := 'SELECT id, 名字, 卡号, 订餐时间 FROM [订餐查询] WHERE [订餐时间] BETWEEN #' + timeA1 + '# AND #' + timeA2 + '# ORDER BY [ID]';
   end else begin
   vSQLString := 'SELECT id, 名字, 卡号, 订餐时间 FROM [订餐查询] WHERE [订餐时间] BETWEEN #' + timeP1 + '# AND #' + timeP2 + '# ORDER BY [ID]';
   end;
   book_meals_form.adqOrderS.SQL.Text := vSQLString;
   book_meals_form.adqOrderS.Open();
   book_meals_form.adqOrderS.close();
  
   book_meals_form.lblshowbooknum.Caption :='今日' + timeA3 + '订餐人数 ' + IntToStr(BNum1) + '人,' + #13#10 + '已取餐人数' + IntToStr(ENum1) + '人, ' + #13#10 + '未取餐人数' + IntToStr(SNum1) + '人' + #13#10  + #13#10 + '今日' + timeP3 + '订餐人数 ' + IntToStr(BNum2) + '人,' + #13#10 + '已取餐人数' + IntToStr(ENum2) + '人, ' + #13#10 + '未取餐人数' + IntToStr(SNum2) + '人';
    
  if(book_meals_form.btopenport.Caption = '开始工作') then
   begin
book_meals_form.txtStatusTips.Caption := '停止打卡';
end else begin
book_meals_form.txtStatusTips.Caption := '接受打卡';
end;
end;

解决方案 »

  1.   

    续上procedure Tbook_meals_form.FormShow(Sender: TObject);
    begin
      adqOrder.SQL.Text := 'SELECT * FROM [参数]';
      adqOrder.Open();
      if (not adqOrder.Active) then Exit;
      
    time11 := adqOrder.FieldByName('上午开始订餐时间').value;   // 上午开始订餐时间
      time12 := adqOrder.FieldByName('上午结束订餐时间').value;   // 上午结束订餐时间
      time13 := '中餐';
      time14 := adqOrder.FieldByName('上午开始取餐时间').value;   // 上午开始取餐时间
      time15 := adqOrder.FieldByName('上午结束取餐时间').value;   // 上午结束取餐时间
      time16 := adqOrder.FieldByName('上午取消订餐时间').value;   // 上午取消订餐时间  time21 := adqOrder.FieldByName('下午开始订餐时间').value;   // 下午开始订餐时间
      time22 := adqOrder.FieldByName('下午结束订餐时间').value;   // 下午结束订餐时间
      time23 := '晚餐';
      time24 := adqOrder.FieldByName('下午开始取餐时间').value;   // 下午开始取餐时间
      time25 := adqOrder.FieldByName('下午结束取餐时间').value;   // 下午结束取餐时间
      time26 := adqOrder.FieldByName('下午取消订餐时间').value;   // 下午取消订餐时间 intTimeP := adqOrder.FieldByName('有效打卡间隔时间').value;
      adqOrder.Close(); PROCESS_STATUS();

      Timer1.Enabled := true;
      Timer2.Enabled := true;
      Timer3.Enabled := true;
      Timer4.Enabled := false;
    end;procedure Tbook_meals_form.FormCreate(Sender: TObject);
    begin
      adoConn.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\dbs\data.mdb;Persist Security Info=False';
      adoConn.Connected := True;
      if (adoConn.Connected) then adqOrderS.Open();  Label2.Visible:=False;
      iscommopen1:=False;
      MyReceivePoint:=1;//串口接到帧指针
      MyProcPoint:=1;//已处理帧指针  btopenport.Click;
    end;procedure Tbook_meals_form.btopenportClick(Sender: TObject);
    begin
      if(btopenport.Caption = '开始工作') then
      begin
        try
      mscomm1.InBufferCount:=0;
      mscomm1.InputLen:=0;
      mscomm1.RThreshold:=1;
        
            Comm1.CommName:='COM9'; //订餐器
            //以下代码一定要复制过去
            //{{{{{{{{{{{{{{{{{{{{{{{{{{{
            Comm1.BaudRate:=19200;
            Comm1.ByteSize:=_8;
            Comm1.ParityCheck:=False;
            Comm1.Parity:=None;
            Comm1.StopBits:=_1;
            Comm1.XoffChar:='#';
            //}}}}}}}}}}}}}}}}}
            Comm1.StartComm; //打开串口
            btopenport.Caption := '停止工作';
            txtStatusTips.Caption := '接受打卡';
            txtStatusTips.Font.Color := clBlack;
            ComboBox1.Enabled:=False;   If MSComm1.PortOpen = False Then
      begin
        MSComm1.CommPort := 8; //LED灯控制器
        MSComm1.PortOpen := True;
        MSComm1.RThreshold := 8; //一次接受的字节数
        Timer3.Enabled := True;
      End;        Timer1.Enabled := true;
            istimecon1 := true;
            iscommopen1:=True;
        except
            ShowMessage('打开端口失败!');
        end;
      end
      else
      begin
        try
         Timer3.Enabled := False;
         Timer1.Enabled := False;
        
         MSComm1.PortOpen := False;
        
            Comm1.StopComm; //关闭串口
            btopenport.Caption := '开始工作';
            txtStatusTips.Caption := '停止打卡';
            txtStatusTips.Font.Color := clRed;
            ComboBox1.Enabled:=True;
            istimecon1 := False;
        
        except
        end;
      end;
    end;procedure Tbook_meals_form.Timer1Timer(Sender: TObject);
    begin

        Timer1.Enabled:=False;
        Label2.Visible:=True;
        case istimecount of
          1: Label2.Caption:='\';
          2: Label2.Caption:='|';
          3: Label2.Caption:='/';
        else ;
          Label2.Caption:='-';
        end;
        istimecount:=istimecount+1;
        if(istimecount>3) then
        begin
          istimecount:=0;
        end;
        if(istimecon1) then
        begin
          Timer1.Enabled:=True;
        end
        else
        begin
          Label2.Visible:=False;
        end;
    end;
      

  2.   

    procedure Tbook_meals_form.Timer2Timer(Sender: TObject);
    var
    i:integer;
    strls:string;
    n:Integer;
    int64_i:Int64;
    jihaostr, jihaostr1 :string;//机号, 机号字符串
    cardhaostr:string;//卡号字符串
    edc:Byte;//校检码
    rxdbuf:array[1..50]of Byte;//发送字节缓冲
    txdbuf:array[1..100]of Byte;//发送字节缓冲
    CardID, CardName : string;    // 卡号begin
      if (MyReceivePoint = MyProcPoint) then
      begin
        Exit;
      end;
      for i := 1 to 50 do
      begin
        rxdbuf[i] := MyReceiveData[MyProcPoint].MyData[i];
      end;
      Inc(MyProcPoint);
      if MyProcPoint>1000 then
      begin
        MyProcPoint := 1;
      end;
      n:=rxdbuf[1];
      //校验校验是否正确
      edc := 0;
      for i := 2 to (n+1) do
      begin
        edc := edc xor rxdbuf[i];
      end;
      if(edc <> rxdbuf[n+2]) then
      begin//校验不成功,退出
         Exit;
      end;  jihaostr := rightstr('00000' + IntToStr(rxdbuf[2] + rxdbuf[3]*256),5);
      if (jihaostr = '00001') or (jihaostr = '00002') or (jihaostr = '00003') or (jihaostr = '00004') or (jihaostr = '00005') then begin
        jihaostr1 := '订餐器';
      end;
      if (jihaostr = '00011') or (jihaostr = '00012') or (jihaostr = '00013') or (jihaostr = '00014') or (jihaostr = '00015') then begin
        jihaostr1 := '取餐器';
      end;  // 1-B 有刷卡动作
      if(Int(rxdbuf[4])) > 0 then
      begin
        //计算卡号
        int64_i := rxdbuf[6];
        int64_i := int64_i * 256;
        int64_i := int64_i + rxdbuf[7];
        int64_i := int64_i * 256;
        int64_i := int64_i + rxdbuf[8];
        int64_i := int64_i * 256;
        int64_i := int64_i + rxdbuf[9];
        cardhaostr := RightStr('0000000000'+IntToStr(int64_i),10);//获得十位卡号字串
        CardID := cardhaostr;    adqOrder.SQL.Clear;
        adqOrder.SQL.Text := 'SELECT * FROM [员工表] WHERE ([卡号] = ''' + CardID + ''')';
        adqOrder.Open();
        if (not adqOrder.Active) then Exit;  // 1a-B
        if (adqOrder.RecordCount = 0) then begin
        // debug-B...
          adqOrder.SQL.Clear;
          adqOrder.SQL.Text:='INSERT INTO [员工表]([卡号],[名字]) VALUES(''' + CardID + ''',''Test'')';
          adqOrder.ExecSQL;    // debug-E...
          CardName := '无效用户';
          exit;
        end else begin
          CardName := adqOrder.FieldByName('名字').value;
        end; // 1a-E  //  ListBox1.Items.Add(VarToStr(Now()) + '接收到从机【'+jihaostr1+'】的卡号[ '+CardName+' ]');
      //  ListBox1.Selected[ListBox1.Count-1] := True;    txdbuf[1] := $24;
        txdbuf[2] := $A2;
        txdbuf[3] := rxdbuf[2];
        txdbuf[4] := rxdbuf[3]; Po:=0; // 设置标志位
        t1Now:=Now();
    // 1b-B   订餐
    if jihaostr1 = '订餐器' then
    begin
    // 1c-B 下面为中午正常订餐代码 //////////////////////////////////////////////////////
    if (Bool(t1Now>StrToDateTime(timeA1)) and Bool(t1Now<StrToDateTime(timeA2))) then
    begin
    Po:=1;
    adqOrder.SQL.Text := 'SELECT * FROM [订餐表] WHERE ([卡号] = ''' + CardID + ''') AND ([订餐时间] BETWEEN #' + timeA1 + '# AND #' + timeA2 + '#) ORDER BY [ID]';
      adqOrder.Open();
      if (not adqOrder.Active) then Exit;
    // 1d-B
      if (adqOrder.RecordCount = 0) then begin
        adoConn.Execute('INSERT INTO [订餐表] ([卡号], [订餐时间]) VALUES (''' + CardID + ''', #' + DateTimeToStr(Now()) + '#)');
        strls := CardName + ',' + timeA3 + '订餐成功.            ';    ListBox1.Items.Add(VarToStr(Now()) + '[ '+CardName+' ]订餐成功.');
        ListBox1.Selected[ListBox1.Count-1] := True;
      end else begin
    // 1e-B
        if (Bool(t1Now>(StrToDateTime(adqOrder.FieldByName('订餐时间').value) + intTimeP * cvMinute)) and Bool(t1Now<StrToDateTime(timeA6))) then
        begin
         adoConn.Execute('DELETE FROM [订餐表] WHERE [卡号]=''' + CardID + ''' AND [订餐时间] BETWEEN #' + timeA1 + '# AND #' + timeA2 + '#');
         strls := CardName + ',' + timeA3 + '取消订餐成功.            ';
        ListBox1.Items.Add(VarToStr(Now()) + '[ '+CardName+' ]取消订餐成功.');
        ListBox1.Selected[ListBox1.Count-1] := True;
        end
        else begin
         strls := CardName + ',' + timeA3 + '已订过餐.            ';
        end; // 1e-E
    end; // 1d-E
    end; // 1c-E// 1f-B 下面为下午正常订餐代码 //////////////////////////////////////////////////////
    if (Bool(t1Now>StrToDateTime(timeP1)) and Bool(t1Now<StrToDateTime(timeP2))) then
    begin
    Po:=1;
    adqOrder.SQL.Text := 'SELECT * FROM [订餐表] WHERE ([卡号] = ''' + CardID + ''') AND ([订餐时间] BETWEEN #' + timeP1 + '# AND #' + timeP2 + '#) ORDER BY [ID]';
      adqOrder.Open();
      if (not adqOrder.Active) then Exit;// 1g-B
      if (adqOrder.RecordCount = 0) then begin
        adoConn.Execute('INSERT INTO [订餐表] ([卡号], [订餐时间]) VALUES (''' + CardID + ''', #' + DateTimeToStr(Now()) + '#)');
        strls := CardName + ',' + timeP3 + '订餐成功.            ';    ListBox1.Items.Add(VarToStr(Now()) + '[ '+CardName+' ]订餐成功.');
        ListBox1.Selected[ListBox1.Count-1] := True;   end else begin
    // 1h-B
        if (Bool(t1Now>(StrToDateTime(adqOrder.FieldByName('订餐时间').value) + intTimeP * cvMinute)) and Bool(t1Now<StrToDateTime(timeP6))) then
        begin
         adoConn.Execute('DELETE FROM [订餐表] WHERE [卡号]=''' + CardID + ''' AND [订餐时间] BETWEEN #' + timeP1 + '# AND #' + timeP2 + '#');
         strls := CardName + ',' + timeP3 + '取消订餐成功.            ';    ListBox1.Items.Add(VarToStr(Now()) + '[ '+CardName+' ]取消订餐成功.');
        ListBox1.Selected[ListBox1.Count-1] := True;     end
        else begin
         strls := CardName + ',' + timeP3 + '已订过餐.            ';
        end; // 1h-E
    end; // 1g-E
    end; // 1f-E
    ///上面为下午正常订餐代码 //////////////////////////////////////////////////////// 下面为非订餐时段代码////////////////////////////////////
      if(Po=0) then begin  // 如果非订餐时间
        strls := CardName + ',现在非订餐时间.            ';
      end;
    ///上面为非订餐时段代码////////////////////////////////////////////////////
        for i := 1 to 30 do
        begin
          txdbuf[i+4] := Ord(strls[i]);
        end;
        txdbuf[4+31] := $12;txdbuf[4+32] := $09;txdbuf[4+33] := $01;//嘀一声
        edc := 0;
        for i := 2 to 37 do
        begin
          edc := edc xor txdbuf[i];
        end;
        txdbuf[5+33] := edc;//
        Comm1.WriteCommData(@txdbuf[1], $26);end else begin// 2e-B
      if jihaostr1 = '取餐器' then
      begin
        txdbuf[4+31] := $12;
        txdbuf[4+32] := $09;
        txdbuf[4+33] := $01;//嘀一声
      
    // 2a-B 中午取餐 过程
    if (Bool(t1Now>StrToDateTime(timeA4)) and Bool(t1Now<StrToDateTime(timeA5))) then
    begin
    Po:=1;
    adqOrder.SQL.Text := 'SELECT * FROM [订餐表] WHERE ([卡号] = ''' + CardID + ''') AND ([订餐时间] BETWEEN #' + timeA1+ '# AND #' + timeA2 + '#) ORDER BY [ID]';
      adqOrder.Open();
      if (not adqOrder.Active) then Exit;
    // 2b-B
      if (adqOrder.RecordCount = 0) then begin
        //如果没有订餐来取餐, 红灯亮//////////////////////////////////////////////////////////
    txdbuf[4+31] := $09;txdbuf[4+32] := $09;txdbuf[4+33] := $03;//嘀三声
          if (jihaostr = '00011') then begin
           SET_BUFF(1, 0, 0, 2, 0);// 左边红灯亮
             end else begin
           SET_BUFF(1, 2, 0, 0, 0);// 右边红灯亮
          end;
            Timer4.Enabled := True;
            strls := CardName + ',' + timeA3 + '没有订餐.            ';    ListBox1.Items.Add(VarToStr(Now()) + '[ '+CardName+' ]没有订餐.');
        ListBox1.Selected[ListBox1.Count-1] := True;   end else begin
        // 2c-B
        if (adqOrder.FieldByName('Status').value=0) then
        begin
         adoConn.Execute('UPDATE [订餐表] SET Status=1, 取餐时间=#' + DateTimeToStr(Now()) + '# WHERE [卡号]=''' + CardID + ''' AND [订餐时间] BETWEEN #' + timeA1 + '# AND #' + timeA2 + '#');
          // 订餐取餐成功, 绿灯亮;//////////////////////////////////////////////////////////
          if (jihaostr = '00011') then begin
           SET_BUFF(1, 0, 0, 0, 2);// 左边绿灯亮
          end else begin
           SET_BUFF(1, 0, 2, 0, 0);// 右边绿灯亮
          end;
          Timer4.Enabled := True;
         strls := CardName + ',' + timeA3 + '取餐成功.            ';    ListBox1.Items.Add(VarToStr(Now()) + '[ '+CardName+' ]取餐成功.');
        ListBox1.Selected[ListBox1.Count-1] := True;     end else begin
    txdbuf[4+31] := $09;txdbuf[4+32] := $09;txdbuf[4+33] := $03;//嘀三声
            // 2d-B
          if (jihaostr = '00011') then begin
           SET_BUFF(1, 0, 0, 2, 0);// 左边红灯亮
             end else begin
           SET_BUFF(1, 2, 0, 0, 0);// 右边红灯亮
          end; // 2d-E
          Timer4.Enabled := True;
         strls := CardName + ',' + timeA3 + '已取过餐.            ';    ListBox1.Items.Add(VarToStr(Now()) + '[ '+CardName+' ]已取过餐.');
        ListBox1.Selected[ListBox1.Count-1] := True;     end; // 2c-E
    end; // 2b-E
    end; // 2a-E
      

  3.   

    续上
    ////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////
    // 31-B 晚上取餐 过程
    if (Bool(t1Now>StrToDateTime(timeP4)) and Bool(t1Now<StrToDateTime(timeP5))) then
    begin
    Po:=1;
    adqOrder.SQL.Text := 'SELECT * FROM [订餐表] WHERE ([卡号] = ''' + CardID + ''') AND ([订餐时间] BETWEEN #' + timeP1+ '# AND #' + timeP2 + '#) ORDER BY [ID]';
      adqOrder.Open();
      if (not adqOrder.Active) then Exit;
    // 32-B
      if (adqOrder.RecordCount = 0) then begin
    txdbuf[4+31] := $09;txdbuf[4+32] := $09;txdbuf[4+33] := $03;//嘀三声
        //如果没有订餐来取餐, 红灯亮//////////////////////////////////////////////////////////
          if (jihaostr = '00011') then begin
           SET_BUFF(1, 0, 0, 2, 0);// 左边红灯亮
             end else begin
           SET_BUFF(1, 2, 0, 0, 0);// 右边红灯亮
          end;
            Timer4.Enabled := True;
         strls := CardName + ',' + timeP3 + '没有订餐.            ';
        
        ListBox1.Items.Add(VarToStr(Now()) + '[ '+CardName+' ]没有订餐.');
        ListBox1.Selected[ListBox1.Count-1] := True;
        
      end else begin
    // 33-B
        if (adqOrder.FieldByName('Status').value=0) then
        begin
         adoConn.Execute('UPDATE [订餐表] SET Status=1, 取餐时间=#' + DateTimeToStr(Now()) + '# WHERE [卡号]=''' + CardID + ''' AND [订餐时间] BETWEEN #' + timeP1 + '# AND #' + timeP2 + '#');
    // 34-B  订餐取餐成功, 绿灯亮;//////////////////////////////////////////////////////////
          if (jihaostr = '00011') then begin
           SET_BUFF(1, 0, 0, 0, 2);// 左边绿灯亮
          end else begin
           SET_BUFF(1, 0, 2, 0, 0);// 右边绿灯亮
          end; // 34-E
    // 订餐取餐成功, 绿灯亮;//////////////////////////////////////////////////////////
          Timer4.Enabled := True;
         strls := CardName + ',' + timeP3 + '取餐成功.            ';    ListBox1.Items.Add(VarToStr(Now()) + '[ '+CardName+' ]取餐成功.');
        ListBox1.Selected[ListBox1.Count-1] := True;     end else begin
    // 35-B
    txdbuf[4+31] := $09;txdbuf[4+32] := $09;txdbuf[4+33] := $03;//嘀三声
          if (jihaostr = '00011') then begin
           SET_BUFF(1, 0, 0, 2, 0);// 左边红灯亮
             end else begin
           SET_BUFF(1, 2, 0, 0, 0);// 右边红灯亮
          end; // 35-E
    Timer4.Enabled := True;
    strls := CardName + ',' + timeP3 + '已取过餐.            ';    ListBox1.Items.Add(VarToStr(Now()) + '[ '+CardName+' ]已取过餐.');
        ListBox1.Selected[ListBox1.Count-1] := True;     end; // 33-E
    end; // 32-E
    end; // 31-E  if(Po=0) then begin  // 如果非取餐时间
        strls := CardName + ',现在非取餐时间.            ';
      end;
        txdbuf[3] := rxdbuf[2];
        for i := 1 to 30 do
        begin
          txdbuf[i+4] := Ord(strls[i]);
        end;    edc := 0;
        for i := 2 to 37 do
        begin
          edc := edc xor txdbuf[i];
        end;
        txdbuf[5+33] := edc;//
        Comm1.WriteCommData(@txdbuf[1], $26);   end; //2e-E
      end; //1b-E PROCESS_STATUS();
     end; //1-E
    end;
      

  4.   

    抱歉, 因代码过多而 系统又设置了不能回复三次以上, 所以换了一个帐号把剩余代码发出来.续上 procedure Tbook_meals_form.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;  BufferLength: Word);
    var
    revsize:Word;
    begin
      if(MyReceivePoint>1000) then
      begin
        MyReceivePoint := 1;
      end;
      revsize := BufferLength;
      if (revsize>50) then
      begin
        revsize := 50;
      end;
      move(Buffer^,pchar(@(MyReceiveData[MyReceivePoint].MyData[1]))^,revsize);
      Inc(MyReceivePoint);
    end;procedure Tbook_meals_form.Timer3Timer(Sender: TObject);
    begin
    SEND_BUFF;
    end;procedure Tbook_meals_form.Timer4Timer(Sender: TObject);
    begin
    SET_BUFF(1, 1, 1, 1, 1);
    Timer4.Enabled := false;
    end;procedure Tbook_meals_form.FormDestroy(Sender: TObject);
    begin
        try
          if(btopenport.Caption = '停止工作') then
          begin
            Comm1.StopComm;
          end;
        except
        end;
        try
          if(btopenport.Caption = '停止工作') then
          begin
            MSComm1.PortOpen := False;
          end;
        except
        end;
    end;end.经过 timer2 的多次执行后, 一般8小时以上, 机器会变得很慢很慢, 求优化.