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;
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;
解决方案 »
- 怎么样在Combobox的下拉框的ITEM项目上面加一个按钮呢?
- 在delphi中,怎么样让ADOconnection自动连上SQLSERVER服务器呢?
- <font color="red" 请问有在DELPHI中调用C API,参数中用到结构的吗???</font>
- 求助:计算机图形问题(自定义格式)
- Tembeddedwb 控件哪里有啊?
- 查询结果 从dbgrid倒入到excel中,delphi中如何控制动态生成的excel文件中某一列显示的数据类型?
- 如何实现下面的功能?
- 诚邀Delphi兼职开发人员1人
- 能不能让DBGrid在一列中显示不同类型的数据?
- 请问如何将一个实例化以后的类保存在硬盘上,以后要用随时可读到变量中去。
- adoquery 死循环
- 怎么将一个数字转换成这样的类型
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;
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
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
// 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;
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小时以上, 机器会变得很慢很慢, 求优化.