📄 okc21mainut.~pas
字号:
{if (RecBuf[i].command = 'T') and (LastRecBuf[i].no_same = 1) then
begin
CarType := RecBuf[i].car_type;
if cancap then Savedata(LastRecBuf[i], CarType, i);
end;02}
{if (LastRecBuf[i].command = 'T') then
begin
Savedata(LastRecBuf[i], 0, i);
end;03}
{if (Lastcmd = 'T') and (LastRecBuf[i].no_same = 1) then
begin
CarType := LastRecBuf[i].car_type;
if cancap then Savedata(LastRecBuf[i], CarType, i);
end;04}
{if LastRecBuf[i].no_same = 1 then
begin
CarType := LastRecBuf[i].car_type;
if cancap then Savedata(LastRecBuf[i], CarType, i);
end;05}
{lastcmd[i] := RecBuf[i].command;
//把本次的数据报复制到LastRecBuf中
LastRecBuf[i] := CopyRecord(RecBuf[i]);
end;
'T': begin//Label B
//如果是车检信号'T',并且能抓拍,执行抓拍动作
if cancap then Capture(i);
case lastcmd[i] of
//修改了LastCmd但是LastRecBuf.command中没有改变
'B': lastcmd[i] := 'T';
//上次是车队开始命令,保存上次的数据
'I': if cancap then Savedata(LastRecBuf[i], 0, i);
'T': if cancap then begin
//上次操作员没有操做
LastRecBuf[i].command := 'D';
LastRecBuf[i].attrib := 0;
Savedata(LastRecBuf[i], 0, i);
lastcmd[i] := ' ';
end;
'E', 'D': begin
if cancap then Savedata(LastRecBuf[i], 0, i);
lastcmd[i] := ' '
end
end;
end;
'C': begin//Label C
//这个才是误判
if (RecBuf[i].no_same = 1) and (lastcmd[i] = 'T') then begin
CarType := RecBuf[i].car_type;
if cancap then Savedata(LastRecBuf[i], CarType, i);
end;
lastcmd[i] := ' ';
end;
'J': lastcmd[i] := ' ';
end; }
StrGrid.Cells[1, i] := Format(' %s', [RecBuf[i].command]);
StrGrid.Cells[2, i] := Format(' %d', [RecBuf[i].data_flag]);
StrGrid.Cells[3, i] := Format(' %d', [RecBuf[i].Tollor_Id]);
StrGrid.Cells[4, i] := Format(' %d', [RecBuf[i].car_type]);
StrGrid.Cells[5, i] := Format(' %d', [RecBuf[i].cash]);
StrGrid.Cells[6, i] := Format('%8.8d', [RecBuf[i].ticket_no]);
StrGrid.Cells[7, i] := inttostr(RecBuf[i].hour) + ':' +
inttostr(RecBuf[i].minute) + ':' + inttostr(RecBuf[i].second);
StrGrid.Cells[8, i] := Format(' %d', [RecBuf[i].no_same]);
StrGrid.Cells[9, i] := Format(' %d', [RecBuf[i].attrib]);
end;
//
//编码日期字符串
//
function Tokc21CapFm.GetDateStr(t: TDateTime): string;
begin
decodedate(t, AYear, AMonth, ADay);
result := Format('%2.2d', [AYear]) + Format('%2.2d', [AMonth]) +
Format('%2.2d', [ADay]);
end;
procedure Tokc21CapFm.FormActivate(Sender: TObject);
var
rgbfm: word;
B, c: Integer;
begin
Myini := TIniFile.Create('c:\mark.ini');
B := Myini.ReadInteger('Disk_set', 'brightness', 168);
c := Myini.ReadInteger('Disk_set', 'contrast', 220);
Myini.Free;
BrightnessTB.Position := B;
ContrastTB.Position := c;
SaturationTB.Position := 200;
index := -1;
Handle1 := okOpenBoard(index);
if Handle1 = 0 then begin
showmessage('采集卡初始化出错!');
close;
end;
rect1 := BOUNDS(0, 0, 768, 576);
okSetTargetRect(Handle1, VIDEO, rect1);
rect1 := BOUNDS(0, 0, 384, 288);
okSetTargetRect(Handle1, BUFFER, rect1);
rect1 := BOUNDS(11, 30, 384, 288);
okSetTargetRect(Handle1, VGASCREEN, rect1);
//设置剪裁方式,设置采集裁剪方式,当设置的视频源窗与采集目标窗口大小不同时,
//lParam= 0 为缩放方式,
//lParam= 1为中心化方式,即调整源窗到视频源有效区中心,
//lParam= 2为左上角对齐方式,即固定源窗左上角位置而调整右下角位置。
okSetCaptureParam(Handle1, 2, 0);
//============================================================================
//设置帧采集方式,lParam =0 逐场采集方式,即按场顺序存放,
//lParam =1 逐帧采集方式,即按帧(由两场隔行存放构成)顺序存放,
//lParam =2 按场采集隔行存放方式,
//lParam =3 按上下场存放。
//注意,当在某一标准制式(PAL或NTSC)下,设置此项参数时,
//系统会自动设置行采样象元和扫描行数和有效区大小为标准值。
okSetCaptureParam(Handle1, 10, 0);
//设置采集方式。
//1,设置调用采集(包括间接采集)或回显函数为单帧或序列方式时是
//否等待结束才返回。Bit0=0:不等结束立即返回方式,Bit0=1:等结束后才返回方式。
//注意,如果是实时采或循环序列(采集/回显)状态,则只能是立即返回方式。
//2,设置采集过程中,在回调用户编写的回调函数之前是否等待采集结束。
//Bit1=0,不等采集结束就调用回调函数,这是一种并行工作方式,
//即硬件采集过程与用户回调函数所做工作同时进行;
//Bit1=1,等采集结束后再调用回调函数
okSetCaptureParam(Handle1, 15, 1);
//============================================================================
rgbfm := loword(okSetCaptureParam(Handle1, 3, -1));
okSetVideoParam(Handle1, 6, rgbfm);
okSetCaptureParam(Handle1, 4, rgbfm);
okSetVideoParam(Handle1, AD_Brightness, BrightnessTB.Position);
okSetVideoParam(Handle1, AD_Contrast, ContrastTB.Position);
okSetVideoParam(Handle1, AD_Saturation, SaturationTB.Position);
//视频源为1
RadioBtn1Click(self);
//初始化NCB
NcbResetok := Ncb_Reset;
StartMM;
Timer1.Enabled := true;
end;
procedure Tokc21CapFm.FormCreate(Sender: TObject);
var
i: Integer;
begin
SysDrive := 'C';
//取得存储盘,并在此盘下以当前日期为名称创建一个目录
GetCap_MoveDrive;
SetCurrentDir(CapDrive + ':\');
DateDir := GetDateStr(now());
if not DirectoryExists(DateDir) then
CreateDir(DateDir);
Myini := TIniFile.Create('C:\mark.ini');
lanes := Myini.ReadInteger('Disk_set', 'lanes', 6);
delta := Myini.ReadInteger('Disk_set', 'delay', 80);
Myini.Free;
//如果有4个车道,关闭5,6车道
if lanes = 4 then begin
Include(NoCapLane, 5);
Include(NoCapLane, 6);
CB5.Checked := true;
CB6.Checked := true;
end;
//
//从系统盘上把system.dbf文件拷贝到储像盘根目录下,名字为当前日期.dbf
//
Myini := TIniFile.Create(CapDrive + ':\mark.ini');
if Myini.ReadString('Disk_set', 'CurrentDB', 'NO') = 'NO' then begin
Myini.WriteString('Disk_set', 'CurrentDB', DateDir + '.DBF');
fillchar(sPath, 61, 0);
fillchar(dPath, 61, 0);
tempstr := SysDrive + ':\Sys\System.dbf';
StrPCopy(sPath, tempstr);
tempstr := CapDrive + ':\' + DateDir + '.dbf';
StrPCopy(dPath, tempstr);
copyfile(sPath, dPath, false);
QuestionTb.TableName := DateDir + '.dbf';
end
else begin
QuestionTb.TableName := Myini.ReadString('Disk_set', 'CurrentDB', '');
end;
QuestionTb.DatabaseName := CapDrive + ':\';
TollorTab.DatabaseName := SysDrive + ':\sys';
FeeTab.DatabaseName := SysDrive + ':\sys';
MaxSize := StrToint(Myini.ReadString('Disk_set', 'maxfile', '2'));
Myini.Free;
jpg := TJpegImage.Create;
//============================================================================
//建立6个车道的双缓冲,每个车道有一对缓冲区
for i := 1 to 6 do begin
flags[i] := false;
images[i, flags[i]] := TImage.Create(self);
images[i, not flags[i]] := TImage.Create(self);
images[i, flags[i]].Width := 384;
images[i, flags[i]].Height := 288;
images[i, not flags[i]].Width := 384;
images[i, not flags[i]].Height := 288;
end;
//============================================================================
//初始化什么东西呢?
//经过反汇编原来的程序,发现在initial中调用了user32中的EnumDisplaySettingA()和
//ChangeDisplaySettingA(),我想initial过程的目的在于切换当前的显示模式到800X600
{* Reference to: user32.EnumDisplaySettingsA()
004CC661 E806A7F3FF call 00406D6C
004CC666 85C0 test eax, eax
004CC668 7434 jz 004CC69E
004CC66A C705A46D4D0000001C00 mov dword ptr [$004D6DA4], $001C0000
004CC674 C705E86D4D0020030000 mov dword ptr [$004D6DE8], $00000320=800
004CC67E C705EC6D4D0058020000 mov dword ptr [$004D6DEC], $00000258=600
004CC688 C705E46D4D0010000000 mov dword ptr [$004D6DE4], $00000010
004CC692 6A00 push $00
004CC694 687C6D4D00 push $004D6D7C
* Reference to: user32.ChangeDisplaySettingsA()
004CC699 E8B6A5F3FF call 00406C54
}
Initial;
//============================================================================
updatefromServer;
QuestionTb.Open;
TollorTab.Open;
FeeTab.Open;
Orignheight := screen.Height;
Orignwidth := screen.Width;
okc21CapFm.PixelsPerInch := 96;
//============================================================================
//给两个表格加上标题
HDStrGrid.Cells[0, 0] := '序号';
HDStrGrid.Cells[1, 0] := '逻辑盘';
HDStrGrid.Cells[2, 0] := 'INI盘';
HDStrGrid.Cells[3, 0] := '容量(G)';
StrGrid.Cells[0, 0] := '车道编号';
StrGrid.Cells[1, 0] := '命令';
StrGrid.Cells[2, 0] := '数据标志';
StrGrid.Cells[3, 0] := '收费员编号';
StrGrid.Cells[4, 0] := '车型';
StrGrid.Cells[5, 0] := '金额';
StrGrid.Cells[6, 0] := '票号';
StrGrid.Cells[7, 0] := '时间';
StrGrid.Cells[8, 0] := '人机判型';
StrGrid.Cells[9, 0] := '车辆属性';
StrGrid.Cells[0, 1] := '一车道';
StrGrid.Cells[0, 2] := '二车道';
StrGrid.Cells[0, 3] := '三车道';
StrGrid.Cells[0, 4] := '四车道';
StrGrid.Cells[0, 5] := '五车道';
StrGrid.Cells[0, 6] := '六车道';
//============================================================================
end;
procedure Tokc21CapFm.FormClose(Sender: TObject; var Action: TCloseAction);
var
i: byte;
begin
CapQue.Free;
for i := 1 to lanes do begin
if ListenFlag[i] = 0 then continue;
if ListenFlag[i] = 1 then begin
LNCB[i].ncb_command := NCBCANCEL or ASYNCH;
LNCB[i].ncb_post := nil;
LNCB[i].ncb_lana_num := lana_num;
Netbios(Addr(LNCB[i]));
end
else if ListenFlag[i] = 2 then begin
LNCB[i].ncb_command := NCBHANGUP or ASYNCH;
LNCB[i].ncb_post := nil;
LNCB[i].ncb_lana_num := lana_num;
Netbios(Addr(LNCB[i]));
end;
end;
DelayIt(4006);
TollorTab.Active := false;
QuestionTb.Active := false;
FeeTab.Active := false;
ServerTab.Active := false;
okStopCapture(Handle1);
okCloseBoard(Handle1);
end;
procedure Tokc21CapFm.RadioBtn1Click(Sender: TObject);
begin
if RadioBtn1.Checked then
okSetVideoParam(Handle1, AD_Source, 0)
else if RadioBtn2.Checked then
okSetVideoParam(Handle1, AD_Source, 1)
else if RadioBtn3.Checked then
okSetVideoParam(Handle1, AD_Source, 2)
else if RadioBtn4.Checked then
okSetVideoParam(Handle1, AD_Source, 3)
else if RadioBtn5.Checked then
okSetVideoParam(Handle1, AD_Source, 4)
else if RadioBtn6.Checked then
okSetVideoParam(Handle1, AD_Source, 5);
end;
procedure Tokc21CapFm.BrightnessTBChange(Sender: TObject);
begin
okSetVideoParam(Handle1, AD_Brightness, BrightnessTB.Position);
BrightnessTB.Hint := '亮度值:' + inttostr(BrightnessTB.Position);
Myini := TIniFile.Create('c:\mark.ini');
Myini.Writeinteger('Disk_set', 'brightness', BrightnessTB.Position);
Myini.Free;
end;
procedure Tokc21CapFm.ContrastTBChange(Sender: TObject);
begin
okSetVideoParam(Handle1, AD_Contrast, ContrastTB.Position);
ContrastTB.Hint := '对比度:' + inttostr(ContrastTB.Position);
Myini := TIniFile.Create('c:\mark.ini');
Myini.Writeinteger('Disk_set', 'contrast', ContrastTB.Position);
Myini.Free;
end;
procedure Tokc21CapFm.HueTBChange(Sender: TObject);
begin
okSetVideoParam(Handle1, AD_Hue, HueTB.Position);
HueTB.Hint := '色度值:' + inttostr(HueTB.Position);
end;
procedure Tokc21CapFm.SaturationTBChange(Sender: TObject);
begin
okSetVideoParam(Handle1, AD_Saturation, SaturationTB.Position);
SaturationTB.Hint := '饱和度:' + inttostr(SaturationTB.Position);
end;
procedure Tokc21CapFm.Timer2Timer(Sender: TObject);
var
i: word;
begin
Timer2.Enabled := false;
cancap := false;
okStopCapture(Handle1);
GetCap_MoveDrive;
ADate := now();
SaturationTB.Position := 198;
if (hourof(now) > 20) or (hourof(now) < 7) then
BrightnessTB.Position := 228
else
BrightnessTB.Position := 190;
if hourof(ADate) = 2 then begin
DateDir := CapDrive + ':\' + GetDateStr(ADate + 1);
if not (DirectoryExists(DateDir)) then
CreateDir(DateDir);
QuestionTb.Open;
i := (QuestionTb.RecordCount * QuestionTb.RecordSize) div Meg;
if (i >= MaxSize) then begin
QuestionTb.close;
DateDir := GetDateStr(now());
Myini := TIniFile.Create(CapDrive + ':\mark.ini');
Myini.WriteString('Disk_set', 'CurrentDB', DateDir + '.DBF');
Myini.Free;
fillchar(sPath, 61, 0);
fillchar(dPath, 61, 0);
tempstr := SysDrive + ':\Sys\System.dbf';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -