📄 okc21mainut.~pas
字号:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
// 单元名称: 抓拍软件主单元 //
// //
// 作者 : 河南天纵公司 //
// 修改者 : 郭要军 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 + -