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

📄 okc21mainut.~pas

📁 某省公路收费站违章车辆抓拍管理系统
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
// 单元名称:               抓拍软件主单元                                    //
//                                                                            //
// 作者    :               河南天纵公司                                      //
// 修改者  :               郭要军 13598022688                                //
//                                                                            //
//============================================================================//
unit okc21MainUt;

interface
{(*}
uses
  Windows, Messages, SysUtils, StrUtils, Classes, Graphics, Controls, Forms,
  Dialogs,ExtCtrls, StdCtrls, Buttons, ComCtrls, jpeg, Db, DBTables, dateutils,
  inifiles,Grids, FMTBcd, DBXpress, Nb30, SqlExpr, Math, wnaspi32, opFileUt,
  mmsystem,Contnrs;

//============================================================================
const
  //处理接收的NetBIOS数据报消息
  DATA_MESSAGE                                    = WM_USER + 100;
//============================================================================

type
{$A-}
  //============================================================================
  //车道机传送数据包,以NetBios会话通信的方式将数据上传到服务器和储像机
  //禁用数据对齐
  DataRec = packed record
    //数据标志      1 Byte        0 = 正常  1 = 重发
    data_flag                                       : Byte;
    //命令码        1 Byte        ASCII A - Z
    command                                         : char;
    //车道号        1 Byte
    lane                                            : Byte;
    //车型          1 Byte
    car_type                                        : Byte;
    //收费金额      2 Byte
    cash                                            : WORD;
    //票号          4 Byte
    ticket_no                                       : Integer;
    //年            2 Byte
    year                                            : WORD;
    //月            1 Byte
    month                                           : Byte;
    //日            1 Byte
    day                                             : Byte;
    //时            1 Byte
    hour                                            : Byte;
    //分            1 Byte
    minute                                          : Byte;
    //秒            1 Byte
    second                                          : Byte;
    //收费员工号    2 Byte
    Tollor_Id                                       : WORD;
    //人机判别标志  1 Byte
    no_same                                         : Byte;
    //外设状态码    2 Byte
    pher_sid                                        : WORD;
    //无用的填充字节 25-70字节,46Byte
    unuse1                                          : array[1..46] of Byte;
    //外设故障码    2 Byte
    pher_eid                                        : WORD;
    //车辆属性      1 Byte        根据命令D来判别
    attrib                                          : Byte;
    //无用的填充字节 72-93字节,22Byte
    unuse2                                          : array[1..22] of Byte;
    //校验和        1 Byte        以上字节相加,去掉进位
    sum                                             : Byte;
  end;

{$X+}{$A+}//禁用数据对齐,如果NetBIOS数据报中有浮点数的话比较有用
  //声明一个NCB记录指针
  PNCB = ^TNCB;
  //声明一个后处理例程的过程类型
  POST = procedure(var ncbR: PNCB);
  //
  TNCB = record
    ncb_command                                     : Byte;
    ncb_retcode                                     : Byte;
    ncb_lsn                                         : Byte;
    ncb_num                                         : Byte;
    ncb_buffer                                      : PCHAR;
    ncb_length                                      : WORD;
    ncb_callname                                    : array[0..15] of char;
    ncb_name                                        : array[0..15] of char;
    ncb_rto                                         : Byte;
    ncb_sto                                         : Byte;
    ncb_post                                        : POST;
    ncb_lana_num                                    : Byte;
    ncb_cmd_cplt                                    : Byte;
    ncb_reserve                                     : array[0..9] of Byte;
    ncb_event                                       : THANDLE;
  end;
  {*)}
//============================================================================

Tokc21CapFm = class(TForm)
  Timer2: TTimer;
  QuestionTb: TTable;
  StatusBar1: TStatusBar;
  Timer1: TTimer;
  PgCtrl: TPageControl;
  TabSht1: TTabSheet;
  TabSht2: TTabSheet;
  TabSht3: TTabSheet;
  TabSht4: TTabSheet;
  TabSht5: TTabSheet;
  StrGrid: TStringGrid;
  Timer3: TTimer;
  ListBox1: TListBox;
  Label1: TLabel;
  HDRefreshBtn: TBitBtn;
  Label2: TLabel;
  Bevel2: TBevel;
  TabSht6: TTabSheet;
  GroupBox2: TGroupBox;
  Cb1: TCheckBox;
  CB3: TCheckBox;
  CB2: TCheckBox;
  CB4: TCheckBox;
  CB5: TCheckBox;
  CB6: TCheckBox;
  Panel1: TPanel;
  Label5: TLabel;
  Label6: TLabel;
  Label7: TLabel;
  Label8: TLabel;
  DateTimeEdit: TEdit;
  ChanelEdit: TEdit;
  WorkNoEdit: TEdit;
  NameEdit: TEdit;
  Bevel5: TBevel;
  Label3: TLabel;
  Label4: TLabel;
  Label9: TLabel;
  Label11: TLabel;
  BrightnessTB: TTrackBar;
  ContrastTB: TTrackBar;
  HueTB: TTrackBar;
  SaturationTB: TTrackBar;
  RadioBtn1: TRadioButton;
  RadioBtn2: TRadioButton;
  RadioBtn3: TRadioButton;
  RadioBtn4: TRadioButton;
  RadioBtn5: TRadioButton;
  RadioBtn6: TRadioButton;
  GroupBox1: TGroupBox;
  Label10: TLabel;
  PsnCarTypeEdit: TEdit;
  Label12: TLabel;
  ShiftEdit: TEdit;
  Label13: TLabel;
  AutoCarTypeEdit: TEdit;
  QestionTypeEdit: TEdit;
  Label14: TLabel;
  BatchMove: TBatchMove;
  FeeTab: TTable;
  TollorTab: TTable;
  ServerTab: TTable;
  QuestionDS: TDataSource;
  ForbidenCapBtn: TBitBtn;
  TabSht7: TTabSheet;
  Label15: TLabel;
  TabSheet1: TTabSheet;
  ExitBtn: TBitBtn;
  HDStrGrid: TStringGrid;
  Panel2: TPanel;
  Panel3: TPanel;
  Image: TImage;
  Image1: TImage;
  DatabaseServer: TDatabase;
  Commqry: TQuery;
  Animate1: TAnimate;
  FmtTimer: TTimer;
  QuestionTbBDEDesigner: TStringField;
  QuestionTbBDEDesigner2: TStringField;
  QuestionTbBDEDesigner3: TStringField;
  QuestionTbBDEDesigner4: TStringField;
  QuestionTbBDEDesigner5: TStringField;
  QuestionTbBDEDesigner6: TStringField;
  QuestionTbBDEDesigner7: TStringField;
  QuestionTbBDEDesigner8: TStringField;
  QuestionTbBDEDesigner9: TStringField;
  QuestionTbBDEDesigner10: TStringField;
  QuestionTbBDEDesigner11: TStringField;
  QuestionTbBDEDesigner12: TStringField;
  QuestionTbBDEDesigner13: TStringField;
  QuestionTbBDEDesigner14: TStringField;
  QuestionTbBDEDesigner15: TStringField;
  QuestionTbBDEDesigner16: TStringField;
  procedure FormActivate(Sender: TObject);
  procedure FormCreate(Sender: TObject);
  procedure FormClose(Sender: TObject; var Action: TCloseAction);
  procedure RadioBtn1Click(Sender: TObject);
  procedure BrightnessTBChange(Sender: TObject);
  procedure ContrastTBChange(Sender: TObject);
  procedure HueTBChange(Sender: TObject);
  procedure SaturationTBChange(Sender: TObject);
  procedure Timer2Timer(Sender: TObject);
  procedure Timer1Timer(Sender: TObject);
  procedure Timer3Timer(Sender: TObject);
  procedure HDRefreshBtnClick(Sender: TObject);
  procedure ListBox1Exit(Sender: TObject);
  procedure ForbidenCapBtnClick(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
  procedure ExitBtnClick(Sender: TObject);
  procedure FmtTimerTimer(Sender: TObject);
private
  function CopyRecord(s: DataRec): DataRec;
  procedure Capture(i: Integer);
  procedure Savedata(Buf: DataRec; CarType, lane: byte);
  function FindDrives_defgh(): string;
  procedure MoveDirTo(sourceDrv, targetDrv: char);
  function GetDateStr(t: TDateTime): string;
  //==========================================================================
  procedure ScanScsi;
  function GetRetStr(str: UCHAR): string;
  procedure Initial;
  procedure DelayIt(c: Integer);
  procedure CaptureIt(i: Integer);
  //==========================================================================
  function GetImageName(Buf: DataRec): string;
  function HdFormat(drive: char): boolean;
  function updatefromServer: boolean;
  procedure GetCap_MoveDrive;
  function Ncb_Reset: boolean;

public
  cb: array[1..6] of TCheckBox;
  //消息处理函数,处理各车道的接收后处理中发来的消息
  procedure DATAMessage(var msg: TMessage); message DATA_MESSAGE;
  procedure IniFileReset;
end;

const
  AD_Source = 1;
  AD_Brightness = 2;
  AD_Contrast = 3;
  AD_Hue = 4;
  AD_Saturation = 5;
  VIDEO = 0;
  VGASCREEN = -1;
  BUFFER = 1;
  Meg = $100000;
  Gb = Meg * $400;
  ImgW = 384;
  ImgH = 288;
  SHFMT_ID_DEFAULT = $FFFF;
  SHFMT_OPT_QUICKFORMAT = $0000;

var
  okc21CapFm: Tokc21CapFm;
  sPath, dPath: array[0..60] of char;
  cancap, firstRun, NcbResetok: boolean;
  rect1: Trect;
  index: Integer;
  Myini: TIniFile;
  jpg: TJpegImage;
  Handle1: cardinal;
  Lstart, Lend: array[1..6] of Dword;
  DateDir, CommStr: string;
  SysDrive, CapDrive, MoveToDrive: char;
  MaxSize, lanes, lana_num, LeftB, RightB: byte;
  AYear, AMonth, ADay, delay, delta: word;
  ADate: TDateTime;
  Orignwidth, Orignheight, OrignBitsPerPel: Integer;
  devmode: TDevicemode;
  MainLoop, NameAdded, StatTollor, StatFee: boolean;
  lastcmd: array[1..6] of char;
  NoCapLane: set of 1..6;
  images: array[1..6, boolean] of
  TImage;
  flags: array[1..6] of boolean;
  tempstr: string;
  tempBool: boolean;
  {(*}
  //============================================================================
  //原来这些内容都在Nb30中定义,改变显示模式的Initial也在Nb30中定义

  //初始化控制块
  CtlNcb: TNCB;

  //各车道异步接收动作完成标志,0=已经接收完数据报,1=正在接收数据报
  ReceiveFlag: array[1..6] of byte;

  //各车道异步建立连接动作进行状态标志,0=无连接,1=正建立连接,2=已经连接
  ListenFlag: array[1..6] of byte;

  //六车道的监听控制块
  LNCB: array[1..6] of TNCB;

  //Rep[0]用于统计NCB复位重试次数,Rep[1]-Rep[6]用于统计各车道侦听超时重试次数
  Rep: array[0..6] of byte;

  //本次接收的数据报
  RecBuf: array[1..6] of DataRec;

  //各车道最后发送来的数据报
  LastRecBuf: array[1..6] of DataRec;

  //加名控制块
  AddNameNcb: TNCB;

  TimerID:UINT;//多媒体定时器编号
  TimerRes:DWORD;//定时器精度

  CapQue:TQueue;
  pCapNum:^Integer;

  //数据报接收后处理例程,用于发送数据接收处理消息。注意使用远指针。
  procedure RecvRout1(var ncbR: PNCB); stdcall; far;
  procedure RecvRout2(var ncbR: PNCB); stdcall; far;
  procedure RecvRout3(var ncbR: PNCB); stdcall; far;
  procedure RecvRout4(var ncbR: PNCB); stdcall; far;
  procedure RecvRout5(var ncbR: PNCB); stdcall; far;
  procedure RecvRout6(var ncbR: PNCB); stdcall; far;
  //侦听各车道建立连接后处理例程,用于更改ListenFlag标志=2,表示已经建立连接
  procedure ListenRout1(var ncbR: PNCB); stdcall; far;
  procedure ListenRout2(var ncbR: PNCB); stdcall; far;
  procedure ListenRout3(var ncbR: PNCB); stdcall; far;
  procedure ListenRout4(var ncbR: PNCB); stdcall; far;
  procedure ListenRout5(var ncbR: PNCB); stdcall; far;
  procedure ListenRout6(var ncbR: PNCB); stdcall; far;
  //============================================================================
  {*)}

procedure TimerCallProc(TimerID: UINT; msg: UINT;
  dwUser: Dword; dwa: Dword; dwb: Dword); stdcall;
//启动多媒体定时器
procedure StartMM;
//终止多媒体定时器
procedure EndMM;
//==============================================================================
//采集卡操做例程声明
function okOpenBoard(var index: Longint): HWND; stdcall; far;
function okCloseBoard(hBoard: HWND): boolean; stdcall; far;
function okGetLastError: Longint; stdcall; far;
function okSetTargetRect(hBoard: HWND; tgt: Integer; var lpTgtRect: Trect):
  Longint; stdcall; far;
function okSetToWndRect(hBoard: HWND; HWND: HWND): boolean; stdcall; far;
function okCaptureToScreen(hBoard: HWND): boolean; stdcall; far;
function okGetCaptureStatus(hBoard: HWND; bWait: boolean): Longint; stdcall; far;
function okStopCapture(hBoard: HWND): boolean; stdcall; far;
function okSetVideoParam(hBoard: HWND; wParam: word; lParam: Longint): Longint;
stdcall; far;
function okSetCaptureParam(hBoard: HWND; wParam: word; lParam: Longint):
  Longint; stdcall; far;
function okGetBoardIndex(var szBoardName: char; iNo: Smallint): Smallint;
stdcall; far;
function okSetConvertParam(hBoard: HWND; wParam: word; lParam: Longint):
  Longint; stdcall; far;
function okWaitSignalEvent(hBoard: HWND; dlwParam: wParam; lMilliSecond:
  lParam): Longint; stdcall; far;
function okCaptureSingle(hBoard: HWND; Dest: Integer; Lstart: Longint): boolean;
stdcall; far;
function okTransferRect(hBoard: HWND; Dest: Integer; iFirst: Longint; src:
  Integer; iStart: Longint; lNum: Longint): Longint; stdcall; far;
function okConvertRect(hBoard: HWND; Dest: Integer; iFirst: Longint; src:
  Integer; iStart: Longint; lNum: Longint): Longint; stdcall; far;
function SHFormatDrive(HANDLE: HWND; drive, ID, Options: word): Longint;
stdcall; far;
//==============================================================================

implementation
{$R *.DFM}
//==============================================================================
//采集卡操做例程定义
function okOpenBoard(var index: Longint): HWND; external 'okapi32.dll';
function okCloseBoard(hBoard: HWND): boolean; external 'okapi32.dll';
function okGetLastError: Longint; external 'okapi32.dll';
function okSetTargetRect(hBoard: HWND; tgt: Integer; var lpTgtRect: Trect):
  Longint; external 'okapi32.dll';
function okSetToWndRect(hBoard: HWND; HWND: HWND): boolean; external
'okapi32.dll';
function okCaptureToScreen(hBoard: HWND): boolean; external 'okapi32.dll';
function okGetCaptureStatus(hBoard: HWND; bWait: boolean): Longint; external 'okapi32.dll';
function okStopCapture(hBoard: HWND): boolean; external 'okapi32.dll';
function okSetVideoParam(hBoard: HWND; wParam: word; lParam: Longint): Longint;
  external 'okapi32.dll';
function okSetCaptureParam(hBoard: HWND; wParam: word; lParam: Longint):
  Longint; external 'okapi32.dll';
function okGetBoardIndex(var szBoardName: char; iNo: Smallint): Smallint;
  external 'okapi32.dll';

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -