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

📄 okc21mainut.~pas

📁 某省公路收费站违章车辆抓拍管理系统
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:
      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 + -