📄 okc21mainut.~pas
字号:
StrPCopy(sPath, tempstr);
tempstr := CapDrive + ':\' + DateDir + '.dbf';
StrPCopy(dPath, tempstr);
copyfile(sPath, dPath, false);
QuestionTb.TableName := DateDir + '.dbf';
QuestionTb.DatabaseName := CapDrive + ':\';
QuestionTb.Open;
end;
if CapDrive <> MoveToDrive then begin
Animate1.Visible := true;
StatusBar1.Panels[7].Text := '移动数据..';
Animate1.Active := true;
MoveDirTo(CapDrive, MoveToDrive);
Animate1.Active := false;
Animate1.Visible := false;
StatusBar1.Panels[7].Text := '移动完成..';
end;
Application.ProcessMessages;
tempstr := FindDrives_defgh();
if (dayof(ADate) = 1) and (tempstr[5] <> ' ') then begin
HdFormat(tempstr[5]);
StatusBar1.Panels[7].Text := '拷贝D盘到H盘...';
Animate1.Visible := true;
Animate1.Active := true;
CopyDir(tempstr[1] + ':\', tempstr[5] + ':\');
Animate1.Active := false;
Animate1.Visible := false;
HdFormat(tempstr[1]);
StatusBar1.Panels[7].Text := '拷贝H盘到D盘...';
Animate1.Visible := true;
Animate1.Active := true;
CopyDir(tempstr[5] + ':\', tempstr[1] + ':\');
Animate1.Active := false;
Animate1.Visible := false;
StatusBar1.Panels[7].Text := datetimetostr(now);
Myini := TIniFile.Create(tempstr[5] + ':\mark.ini');
Myini.WriteString('Disk_set', 'disk', 'H');
Myini.Free;
end;
updatefromServer;
end;
cancap := true;
Timer2.Enabled := true;
okCaptureToScreen(Handle1);
end;
procedure Tokc21CapFm.CaptureIt(i: Integer);
begin
okSetVideoParam(Handle1, AD_Source, i - 1);
case i of
1: RadioBtn1.Checked := true;
2: RadioBtn2.Checked := true;
3: RadioBtn3.Checked := true;
4: RadioBtn4.Checked := true;
5: RadioBtn5.Checked := true;
6: RadioBtn6.Checked := true;
end;
{if i > (lanes div 2) then
BrightnessTB.Position := LeftB
else
BrightnessTB.Position := RightB;}
DelayIt(330);
//这里不再重复调用抓取帧的函数,因为okc21CapFm.[8,7,394,295]处在实时显示活动帧,
//只需等切换视频源后视频信号平稳时复制即可,由上面的延时等待信号平稳
images[i, flags[i]].Canvas.CopyRect(Rect(0, 0, 384, 288), okc21CapFm.Canvas,
Rect(8, 7, 393, 295));
//双缓冲区,保存图像的时候应该用images[i,not flags[i]]来操做
flags[i] := not flags[i];
end;
procedure Tokc21CapFm.Savedata(Buf: DataRec; CarType, lane: byte);
begin
if (trim(GetImageName(Buf)) = '') or (Buf.day = 0) then Exit;
try
QuestionTb.Open;
QuestionTb.Append;
QuestionTb['文件名'] := GetImageName(Buf);
QuestionTb['收费员编号'] := inttostr(Buf.Tollor_Id);
QuestionTb['收费员姓名'] := TollorTab.fieldbyname('Name').AsString;
NameEdit.Text := TollorTab.fieldbyname('Name').AsString;
QuestionTb['年'] := Format('%4.4d', [Buf.year]);
QuestionTb['月'] := Format('%2.2d', [Buf.month]);
QuestionTb['日'] := Format('%2.2d', [Buf.day]);
QuestionTb['时'] := Format('%2.2d', [Buf.hour]);
QuestionTb['分'] := Format('%2.2d', [Buf.minute]);
QuestionTb['秒'] := Format('%2.2d', [Buf.second]);
QuestionTb['车道'] := Format('%2.2d', [Buf.lane]);
QuestionTb['机判车型'] := Format('%2.2d', [CarType]);
QuestionTb['人判车型'] := Format('%2.2d', [Buf.car_type]);
QuestionTb['机判金额'] := FeeTab.fieldbyname('Fee').AsString;
QuestionTb['实收金额'] := inttostr(Buf.cash);
QuestionTb['工班'] := Format('%2.2d', [TollorTab.fieldbyname('DptID').asinteger]);
case Buf.command of
//问题在这里,如果Buf.command = 'B',
'B': QuestionTb['问题类别'] := '40';
//上次操作员确认其违章
'E': QuestionTb['问题类别'] := '50';
//上次操作员确认其是车队
'I': QuestionTb['问题类别'] := '60';
'D': case Buf.attrib of
//0,8表示上次操作员未操做,就放行了
0, 8: QuestionTb['问题类别'] := '00';
//上次通过的是车队
9: QuestionTb['问题类别'] := '60';
//上次通过的是免费车
10: QuestionTb['问题类别'] := '10';
//上次通过的是军车
12: QuestionTb['问题类别'] := '20';
//上次通过的是月票车
13: QuestionTb['问题类别'] := '30';
end;
end;
if (Buf.command = 'B') and (QuestionTb['人判车型'] = QuestionTb['机判车型'])
then begin
QuestionTb['机判车型'] := '00';
QuestionTb['机判金额'] := '0';
end;
if (Buf.command = 'D') and (Buf.attrib in [9, 10, 12, 13]) then begin
QuestionTb['人判车型'] := '00';
QuestionTb['实收金额'] := '0';
end;
QestionTypeEdit.Text := QuestionTb.fieldbyname('问题类别').AsString;
QuestionTb.POST;
QuestionTb.close;
Image.Picture := images[Buf.lane, not flags[Buf.lane]].Picture;
with jpg do begin
Assign(images[Buf.lane, not flags[Buf.lane]].Picture.Bitmap);
if not empty then begin
Image.Refresh;
CompressionQuality := 86;
compress;
DateDir := GetDateStr(now());
if not (DirectoryExists(DateDir)) then
CreateDir(DateDir);
SaveToFile(DateDir + '\' + GetImageName(Buf) + '.jpg');
end;
end;
DateTimeEdit.Text := inttostr(Buf.year) + '年' + inttostr(Buf.month) + '月'
+ inttostr(Buf.day);
DateTimeEdit.Text := DateTimeEdit.Text + '日' + inttostr(Buf.hour) + '时' +
inttostr(Buf.minute) + '分' + inttostr(Buf.second) + '秒';
ChanelEdit.Text := inttostr(Buf.lane);
WorkNoEdit.Text := inttostr(Buf.Tollor_Id);
ShiftEdit.Text := copy(WorkNoEdit.Text, 1, 1);
PsnCarTypeEdit.Text := inttostr(Buf.car_type);
AutoCarTypeEdit.Text := inttostr(CarType);
//==========================================================================
StatusBar1.Panels[7].Text := '抓拍数据保存完毕!';
//==========================================================================
except
QuestionTb.Cancel;
QuestionTb.close;
StatusBar1.Panels[7].Text := '数据报中有非法数据!';
end;
end;
//
//9 秒钟定时器,如果定时器内代码没有出错,那么就在while MainLoop do 循环中运行,
//如果出错,就关闭程序
//
procedure Tokc21CapFm.Timer1Timer(Sender: TObject);
var
i, j: byte;
st: string[16];
begin
okCaptureToScreen(Handle1);
Timer1.Enabled := false;
Timer2.Enabled := true;
MainLoop := true;
NameAdded := false;
cancap := true;
while MainLoop do begin
try
if (not NameAdded) and NcbResetok then begin
//在本地名字表中添加一个唯一名,它的名字编号在数据报所操做的ncb_num中返回
//======================================================================
//AddNameNcb.ncb_name := 'XL_Video_000010 ');
StrPCopy(AddNameNcb.ncb_name, 'XL_Video_000010 ');
//======================================================================
AddNameNcb.ncb_post := nil;
AddNameNcb.ncb_lana_num := lana_num;
AddNameNcb.ncb_command := NCBADDNAME or ASYNCH;
Netbios(Addr(AddNameNcb));
//等待加名操做成功,最长等待300*20ms
delay := 0;
repeat DelayIt(20);
Inc(delay);
until (AddNameNcb.ncb_cmd_cplt <>
NRC_PENDING) or (delay >= 300);
//NRC_DUPNAME = $0D; // duplicate name
//加入本地名字表有重名的,删除之
if AddNameNcb.ncb_cmd_cplt = $0D then begin
AddNameNcb.ncb_lana_num := lana_num;
//====================================================================
//AddNameNcb.ncb_name := 'XL_Video_000010 ';
StrPCopy(AddNameNcb.ncb_name, 'XL_Video_000010 ');
//====================================================================
AddNameNcb.ncb_post := nil;
AddNameNcb.ncb_command := NCBDELNAME or ASYNCH;
Netbios(Addr(AddNameNcb));
delay := 0;
repeat DelayIt(20);
Inc(delay);
until (AddNameNcb.ncb_cmd_cplt <>
NRC_PENDING) or (delay >= 300);
end
else if AddNameNcb.ncb_cmd_cplt = NRC_GOODRET then begin
StatusBar1.Panels[1].Text := '加名成功:' + ' ' +
inttostr(AddNameNcb.ncb_cmd_cplt);
NameAdded := true;
end
else begin
StatusBar1.Panels[1].Text := '加名失败:' + ' ' +
inttostr(AddNameNcb.ncb_cmd_cplt);
StatusBar1.Panels[7].Text := GetRetStr(AddNameNcb.ncb_cmd_cplt);
end;
end;
if (not NameAdded) then begin
if not NcbResetok then
NcbResetok := Ncb_Reset;
//Rep[0]用于统计NCB复位重试次数
Rep[0] := Rep[0] + 1;
if (Rep[0] < 7) then
continue
else begin
MainLoop := false;
continue;
end;
end;
//监听1-6车道的连接
for i := 1 to lanes do begin
if ListenFlag[i] = 0 then begin
//如果监听成功,调用各个车道的监听处理函数(处理函数中把对应的监听标志
//ListenFlag[i]赋值为2)
case i of
1: LNCB[i].ncb_post := Addr(ListenRout1);
2: LNCB[i].ncb_post := Addr(ListenRout2);
3: LNCB[i].ncb_post := Addr(ListenRout3);
4: LNCB[i].ncb_post := Addr(ListenRout4);
5: LNCB[i].ncb_post := Addr(ListenRout5);
6: LNCB[i].ncb_post := Addr(ListenRout6);
end;
//================================================================
//LNcb[i].ncb_name := 'XL_Video_000010 ';
StrPCopy(LNCB[i].ncb_name, 'XL_Video_000010 ');
//================================================================
st := 'XL_Lane_Ctl_00' + trim(inttostr(i)) + ' ';
for j := 0 to 15 do
LNCB[i].ncb_callname[j] := st[j + 1];
LNCB[i].ncb_lana_num := lana_num;
LNCB[i].ncb_rto := 28;
LNCB[i].ncb_sto := 28;
LNCB[i].ncb_event := 0;
for j := 0 to 9 do
LNCB[i].ncb_reserve[j] := 0;
//异步监听
LNCB[i].ncb_command := NCBLISTEN or ASYNCH;
Netbios(Addr(LNCB[i]));
ListenFlag[i] := 1;
end;
end;
Application.ProcessMessages;
//
//根据ListenFlag[i]的标志(在各车道的监听连接处理函数中赋值为2),决定是否接
//受数据
//
for i := 1 to lanes do begin
if ListenFlag[i] = 2 then
case ReceiveFlag[i] of
0: begin
//调用各个通道的接受数据处理函数
case i of
1: LNCB[i].ncb_post := Addr(RecvRout1);
2: LNCB[i].ncb_post := Addr(RecvRout2);
3: LNCB[i].ncb_post := Addr(RecvRout3);
4: LNCB[i].ncb_post := Addr(RecvRout4);
5: LNCB[i].ncb_post := Addr(RecvRout5);
6: LNCB[i].ncb_post := Addr(RecvRout6);
end;
//接受的数据放到各车道的RecBuf[i]中
LNCB[i].ncb_buffer := Addr(RecBuf[i]);
LNCB[i].ncb_lana_num := lana_num;
LNCB[i].ncb_event := 0;
//==============================================================
//LNcb[i].ncb_name := 'XL_Video_000010 ';
StrPCopy(LNCB[i].ncb_name, 'XL_Video_000010 ');
//==============================================================
st := 'XL_Lane_Ctl_00' + trim(inttostr(i)) + ' ';
//其实这个ncb_callname不要求必须提供
for j := 0 to 15 do
LNCB[i].ncb_callname[j] := st[j + 1];
for j := 0 to 9 do
LNCB[i].ncb_reserve[j] := 0;
//接收的数据报长度,实际的长度也在ncb_length中返回
LNCB[i].ncb_length := 94;
//异步调用
LNCB[i].ncb_command := NCBRECV or ASYNCH;
Netbios(Addr(LNCB[i]));
//异步接受标志,未完成设为1
ReceiveFlag[i] := 1;
end;
end;
end;
Application.ProcessMessages;
if not MainLoop then Timer3.Enabled := true;
except
MainLoop := false;
StatusBar1.Panels[7].Text := '数据报处理中发生错误:' + timetostr(now);
Timer3.Enabled := True;
end;
end;
end;
procedure Tokc21CapFm.Timer3Timer(Sender: TObject);
begin
Timer3.Enabled := false;
Timer2.Enabled := false;
Timer1.Enabled := false;
FmtTimer.Enabled := false;
EndMM;
close;
end;
procedure Tokc21CapFm.HDRefreshBtnClick(Sender: TObject);
begin
//不用停止视频的实时采集,因为实时采集不占用CPU时间
//okStopCapture(Handle1);
//============================================================================
//通过反汇编原来的程序得知,以前程序实现ScanScsi如下:通过WinExec函数执行
//"mmc.exe "c:\winnt\system32\diskmgmt.msc"",打开windows2000的磁盘管理程序,
//然后给它发送一系列组合按键(Alt+A,R,Alt+F4),以实现重新扫描所有磁盘的功能,
//从而使得刚插入但是没有显示在"我的电脑"中的SCSI硬盘得以显示。其实这种方法有
//限制,过于繁琐。替代的办法是:在控制面板中为每个可移动的硬盘分配一个固定的
//盘符,这样每次重新插入SCSI硬盘,即可显示在"我的电脑"中,从而省去了调用磁盘
//管理程序的开销。这样,下面的语句即可省去。
//if (ScanScsi = 'NoScsiDisk') then
ScanScsi;
//============================================================================
GetCap_MoveDrive;
//okCaptureToScreen(Handle1);
end;
procedure Tokc21CapFm.ListBox1Exit(Sender: TObject);
begin
if ListBox1.itemIndex <> -1 then begin
Myini := TIniFile.Create(CapDrive + ':\mark.ini');
Myini.WriteString('Disk_set', 'maxfile',
trim(ListBox1.Items[ListBox1.itemIndex]));
Myini.Free;
MaxSize := StrToint(ListBox1.Items[ListBox1.itemIndex]);
en
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -