📄 fmain.~pas
字号:
unit fmain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, uthread, DB, ADODB, ExtCtrls, Menus, shellapi, NMUDP, Registry,
ScktComp ;
Const
WM_MYNOTIFY = WM_USER + 110;
MYID = 1100;
type
TF_MAIN = class(TForm)
ADOCNT1: TADOConnection;
Qry_tmp1: TADOQuery;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
Image1: TImage;
CSocket: TClientSocket;
SvSocket: TServerSocket;
ADOQuery1: TADOQuery;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure N1Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure CSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure CSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure SvSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
Procedure threadDone(Sender: TObject); //激活登录
Procedure MyTray(NOTIFYMSG:DWORD);
procedure IconCallBackMessage(var Mess : TMessage ); message WM_MYNOTIFY ;
Procedure WriteTigue1;
Procedure WriteTigue2;
{ Private declarations }
public
Mythread: TReadCard ; // 声明一个线程
EWXFLAG:WORD;
procedure StartCount ; // 创建一个计费的线程, 开始计费
{ Public declarations }
end;
var
F_MAIN: TF_MAIN;
wqhdate:string;
implementation
uses DllDef, UComm, sys_global, sys_login, ShowUser, MySet, Dlg, Display1, ShowMess ;
{$R *.dfm}
var
SVname: string ; // 服务端的名称
function RegisterServiceProcess(dwProcessID, dwTYPE: integer): integer; stdcall; external 'KERNEL32.DLL';
Procedure TF_MAIN.WriteTigue1;
var
s,s1,s2: string ;
i1,i2,i3:word; //日期坼分
r1:real;//开始金额
begin
decodedate(date(),i1,i2,i3);
if length(inttostr(i3))=1 then
s2:=inttostr(i1)+inttostr(i2)+'0'+inttostr(i3)
else
s2:=inttostr(i1)+inttostr(i2)+inttostr(i3);
wqhdate:=m_icno+s2+timetostr(time());
with adoquery1
do
begin
s1:='select syje from card where icno= ''' + m_icno+'''';
sql.Text:=s1;
open;
r1:=adoquery1.Fields[0].asfloat;
close;
// s1:='select * from addxfmx where xfmxicno= ''' + m_icno+'''';
// s1:=s1+'and xfmxrq01= ''' + wqhdate+'''';
// sql.Text:=s1;
// open;
// if recordcount= 1 //判断是否存在当天消费记录
// then
// close
// else
// begin
// close;
if m_ICtype = '5' then //什么都不做
else
begin
sql.Clear; //每次插入普通卡都生成一条记录
sql.add('insert into addxfmx');
sql.add('(xfmxicno, xfmxrq00,xfmxrq01,xfmxksje)');
sql.add('values (:icNo, :Edate,:rq01,:ksje)');
Parameters.parambyname('icNo').Value :=m_icno;
Parameters.parambyname('edate').Value :=date();
Parameters.parambyname('rq01').Value :=wqhdate;
Parameters.parambyname('ksje').Value :=r1;
execsql;
end
end;//adoquery1
s := 'Update Tigue set ICno=' + intTostr(strToint(m_Icno))
+ ', login='''+ FormatDateTime('mm"-"dd" "hh":"nn',now)
+ ''', logout='''''
+ ', gstate=''上机'''
+ ' where TermName='''+m_CpName+'''' ;
if myexecSql(S) = false then exit ;
end;
Procedure TF_MAIN.WriteTigue2;
var
s: string ;
begin
s := 'Update Tigue set ICno= '''''
+', logout='''+ FormatDateTime('mm"-"dd" "hh":"nn',now)
+''', gstate=''离开'''
+' where TermName='''+m_CpName+'''' ;
if myexecSql(S) = false then exit ;
end;
procedure TF_MAIN.StartCount ; // 开始计费
begin
WriteTigue1 ; //登陆成功后, 写相应的监控表
Mythread := TReadCard.Create(m_chktime,m_montime);
Mythread.onTerminate := ThreadDone ;
end;
// mythread.isStop := true ; // 这个语句,可中止计费线程
Procedure TF_MAIN.threadDone(Sender: TObject); // 激活登录
var
wnd: Thandle ;
begin
Mythread := nil ; // 线程一停止, 返回登录界面
m_ICmoney := 0 ; // 剩余金额=0
m_StMoney := 0 ; // 初始金额=0
WriteTigue2 ; // 拔卡后, 写相应的监控表
if m_ICtype = '5' then
DisaControl ; // 修改注册表
frm_ShowUser.close;
Wnd := FindWindow('Progman',nil);
//wqh ShowWindow(wnd,SW_HIDE); // 隐藏桌面上的图标
if m_VerId = 1 then // 对于 WIN98
RegisterServiceProcess(GetCurrentProcessID,1) ; // 1=在任务监视器中隐藏这个任务
Frm_sys_login := TFrm_sys_login.Create(application);
if Frm_sys_login.showmodal<>mrok then begin // 关闭主窗口,重新启动
close;
WinExit(EWX_FORCE OR EWX_SHUTDOWN );
exit;
end;
if (m_VerId = 1) and (m_ICtype = '5') then // 若是管理卡,则显示这个任务
//wqh if (m_VerId = 1) and (m_ICtype = '5') then // 若是管理卡,则显示这个任务
RegisterServiceProcess(GetCurrentProcessID,0);
if m_ICtype = '5' then
EnabControl
else
DisaControl ;
startcount;
if m_ICtype <> '5' then begin
frm_ShowUser.Show ; // 最后, 显示计费对话框
SetForegroundWindow(frm_showuser.Handle);
N5.Visible := false ;
end else
N5.visible := true ;
Wnd := FindWindow('Progman',nil);
ShowWindow(wnd,SW_SHOW); // 显示桌面上的图标
frm_display1.show ; // 显示计费金额
end;
procedure TF_MAIN.FormCreate(Sender: TObject);
var
CPTnamee: pchar ;
len: Dword;
ver: OSVERSIONINFO ;
ComName: string ;
readcon: string ;
RegTmp: TRegistry ;
i : integer ;
begin
dateseparator := '-' ;
shortdateformat := 'yyyy-mm-dd' ;
if m_VerId = 1 then // 缺省是WIN98
RegisterServiceProcess(GetCurrentProcessID,1) ; // 1=在任务监视器中隐藏这个任务
RegTmp := TRegistry.Create ;
with RegTmp do
begin
RootKey := HKEY_LOCAL_MACHINE ;
OpenKey('\SoftWare\Microsoft\ADEL',true);
WriteString('Start', '0'); // 用来关闭启动程序ACPIBIOS.EXE
CloseKey ;
OpenKey('\Software\Adel\NetBar\Settings',true);
readcon := readString('ADOServer'); // 得到服务器的名称
CloseKey ;
end;
RegTmp.Free ;
ADOCNT1.close;
ADOCNT1.ConnectionString := 'Provider=SQLOLEDB.1;Password=ADELOK;'+
'Persist Security Info=True;User ID=ADEL;Initial Catalog=netBar;Data Source='+readcon+
';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;'+
'Use Encryption for Data=False;Tag with column collation when possible=False' ;
try
ADOCNT1.Connected := true;
except
try
ADOCNT1.Connected := true;
except
m_Stop := '9' ; // 9.意味着不能连接数据库
m_syspara := ReadSyspara ; //从注册表中获取网吧的系统标识
end;
end;
getMem(CPTnamee,16);
len := 16 ;
getcomputername(CPTnamee,len);
m_CpName := CPTnamee ; // 得到本部电脑的名称
m_CpName := trim(m_CpName);
FreeMem(CPTnamee);
SVname := m_CpName ; // 考虑到网络不通,先假定服务端为本地
DisaControl ; // 定义启动程序
If m_Stop='9' Then exit ; // 若网络不通,退出
with Qry_Tmp1 do
begin
close;
sql.text := 'select Montime, Sdtime, SVname from Pdata' ;
open;
m_Montime := fields[0].AsInteger ; // 写卡的间隔(分钟数)
//BjCat m_Montime := m_Montime * 60000 ; // 写卡的间隔(微秒数)
m_Montime := m_Montime * 120000 ; // 写卡的间隔(微秒数)
m_sdTime := fields[1].AsInteger ; // 自动关机的时间(分钟数)
SVname := fields[2].AsString ; // 服务端的名称
close;
sql.text := 'select TermName, Gid, ComName From users Where TermName = ''' + m_CpName+'''' ;
open ;
m_RTtype := fields[1].AsString ; // 得到本部电脑的费率类型
if m_RTtype='' then m_RTtype := '01' ; // 若电脑被恶意改名, 先按普通费率处理
ComName := fields[2].AsString ; // 得到本部电脑的串口号
if ComName='' then ComName := 'COM1' ; // 若电脑被恶意改名, 先按Com1处理
if ComName='COM1' then m_com := 1 ;
if ComName='COM2' then m_com := 2 ;
if ComName='COM3' then m_com := 3 ;
if ComName='COM4' then m_com := 4 ;
close;
sql.text := 'select id from XTCS' ;
open ;
i := fields[0].asinteger ;
m_syspara := padl(intTostr(i mod 10000),4); // 得到系统标识码
close;
end;
m_DateTime := ServerDateTime ; // 得到服务器当前的时间
SetPCSystemTime(m_DateTime); // 按服务器的时间设定本地的时间
m_Date := FormatDatetime('yyyy"-"mm"-"dd" "hh":"nn":"ss', m_DateTime); // 得到服务器当前的日期
m_time := FormatDateTime('hh:nn', m_DateTime); // 得到服务器当前的时间
ver.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
GetVersionEx(ver);
m_VerId := ver.dwPlatformId ; // 得到版本号,window98 =1 window nt=2
end;
procedure TF_MAIN.FormShow(Sender: TObject);
var
XWndLong: integer ;
Wnd: Thandle ;
begin
ps(pchar(m_syspara)); // 初始化系统, 传输系统标识码
if not OpenCom(m_com) then begin
application.MessageBox('串口错','警告', mb_ok);
m_Stop := '8' ; // ???
end;
// 在任务栏上隐藏这个任务
XWndLong := GetWindowLong(application.Handle, GWL_EXSTYLE);
ShowWindow(Application.Handle, SW_HIDE);
setWindowlong(application.Handle, GWL_EXSTYLE, XWndLong or WS_EX_TOOLWINDOW and not WS_EX_APPWindow or WS_EX_TOPMOST);
ShowWindow(Application.Handle, SW_show);
F_main.Width := 0;
F_main.Height := 0 ;
// 生成一个托盘 MyTray(NIM_DELETE)
MyTray(NIM_ADD);
if m_VerId = 1 then // 对于 WIN98
RegisterServiceProcess(GetCurrentProcessID,1) ; // 1=在任务监视器中隐藏这个任务
Frm_sys_login := TFrm_sys_login.Create(application);
if Frm_sys_login.showmodal<>mrok then begin
close;
WinExit(EWX_FORCE OR EWX_SHUTDOWN );
exit;
end;
if (m_VerId = 1) and (m_ICtype = '5') then // 若是管理卡,则显示这个任务
RegisterServiceProcess(GetCurrentProcessID,0);
if m_ICtype = '5' then
EnabControl
else
DisaControl ;
if m_ICtype <> '5' then begin
frm_ShowUser.Show ; // 最后, 显示计费对话框
SetForegroundWindow(FRM_SHOWUSER.Handle);
N5.Visible := false ;
end else
N5.visible := true ;
StartCount; // 开始计费
Wnd := FindWindow('Progman',nil);
ShowWindow(wnd,SW_SHOW); // 显示桌面上的图标
SvSocket.Active := true ; // 打开SvSocket
frm_display1.show ; // 显示计费金额
end;
procedure TF_MAIN.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
CSocket.Close ;
SvSocket.Close ;
Qry_Tmp1.Close ;
ADOCNT1.Connected := false ;
except
showmessage('f_main');
end;
end;
Procedure TF_MAIN.MyTray(NotifyMsg:DWORD); // 定义拖盘及事件
var
TND : NOTIFYICONDATA;
begin
with TND do
begin
cbSize := SIZEOF(NOTIFYICONDATA) ;
Wnd := HANDLE ; // this is form's handle
uID := MYID ;
uFlags := NIF_MESSAGE+NIF_ICON+NIF_TIP ;
uCallbackMessage := WM_MYNOTIFY; // message
hIcon := Image1.Picture.Icon.Handle ;
if NOTIFYMSG=NIM_DELETE then hIcon := 0 ;
szTip := '大学生公寓城计费系统'+#13+'客户端' ;
end;
SHELL_NOTIFYICON(NOTIFYMSG,@TND) ;
end;
procedure TF_MAIN.IconCallBackMessage(var Mess : TMessage); //回调函数
var
mousepos:Tpoint;
begin
if Mess.LParam = WM_RBUTTONDOWN then
if GetCursorPos(MousePos) then begin
PopupMenu1.PopupComponent := F_Main; // main form
SetForegroundWindow(Handle);
PopupMenu1.Popup(MousePos.x, MousePos.y);
end ;
if mess.LParam = WM_LBUTTONDOWN then
try
frm_ShowUser.Show ; // 单击左键, 显示计费对话框
SetForegroundWindow(FRM_SHOWUSER.Handle); // 当前的窗口聚焦
except
beep ;
end;
end;
procedure TF_MAIN.N1Click(Sender: TObject);
begin
try
frm_ShowUser.Show ; // 显示计费对话框
SetForegroundWindow(FRM_SHOWUSER.Handle); // 当前的窗口聚焦
except
beep;
end;
end;
procedure TF_MAIN.N5Click(Sender: TObject);
begin
Frm_MySet := TFrm_MySet.create(application);
Frm_MySet.showmodal ;
Frm_MySet.free ;
end;
procedure TF_MAIN.N3Click(Sender: TObject);
var
ReqCodeStr: string;
trun : string;
begin
CSocket.close ;
CSocket.Host := SVname ;
CSocket.Active := true ; // 打开客户端
Frm_Dlg := TFrm_Dlg.create(application);
if Frm_Dlg.showmodal <> mrok then begin
Frm_Dlg.free ;
CSocket.close ;
exit ;
end;
trun := trim(Frm_Dlg.memo1.text);
if trun = '' then begin
Frm_Dlg.free ;
CSocket.close ;
exit ;
end;
ReqCodeStr:= '电脑' + m_CpName + ': '+ trun ;
CSocket.Socket.SendText(ReqCodeStr) ;
Frm_Dlg.free ;
end;
procedure TF_MAIN.CSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
CSocket.close ;
messagebox(handle,'服务端没有启动!','提示',mb_ok);
ErrorCode := 0 ;
end;
procedure TF_MAIN.CSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
str: string;
begin
str := socket.ReceiveText ;
messagebox(handle,pchar(str),'提示',mb_ok);
CSocket.close ;
end;
procedure TF_MAIN.SvSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
trun: string ;
CtrlCode: array[0..30] of char;
begin
trun := socket.ReceiveText ;
strpcopy(CtrlCode, trun);
//重新启动计算机
if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]+CtrlCode[4]+CtrlCode[5]+CtrlCode[6]='restart' then
ExitWindowsEx(EWX_REBOOT,2);
//关闭计算机
if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]+CtrlCode[4]='close' then
ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN,2) ;
//显示接收到信息
if CtrlCode[0]='
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -