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

📄 okc21mainut.~pas

📁 某省公路收费站违章车辆抓拍管理系统
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:


        {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 + -