?? fmain.~pas
字號(hào):
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 ; // 聲明一個(gè)線程
EWXFLAG:WORD;
procedure StartCount ; // 創(chuàng)建一個(gè)計(jì)費(fèi)的線程, 開(kāi)始計(jì)費(fèi)
{ 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 ; // 服務(wù)端的名稱
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;//開(kāi)始金額
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 //判斷是否存在當(dāng)天消費(fèi)記錄
// 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=''上機(jī)'''
+ ' 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=''離開(kāi)'''
+' where TermName='''+m_CpName+'''' ;
if myexecSql(S) = false then exit ;
end;
procedure TF_MAIN.StartCount ; // 開(kāi)始計(jì)費(fèi)
begin
WriteTigue1 ; //登陸成功后, 寫(xiě)相應(yīng)的監(jiān)控表
Mythread := TReadCard.Create(m_chktime,m_montime);
Mythread.onTerminate := ThreadDone ;
end;
// mythread.isStop := true ; // 這個(gè)語(yǔ)句,可中止計(jì)費(fèi)線程
Procedure TF_MAIN.threadDone(Sender: TObject); // 激活登錄
var
wnd: Thandle ;
begin
Mythread := nil ; // 線程一停止, 返回登錄界面
m_ICmoney := 0 ; // 剩余金額=0
m_StMoney := 0 ; // 初始金額=0
WriteTigue2 ; // 拔卡后, 寫(xiě)相應(yīng)的監(jiān)控表
if m_ICtype = '5' then
DisaControl ; // 修改注冊(cè)表
frm_ShowUser.close;
Wnd := FindWindow('Progman',nil);
//wqh ShowWindow(wnd,SW_HIDE); // 隱藏桌面上的圖標(biāo)
if m_VerId = 1 then // 對(duì)于 WIN98
RegisterServiceProcess(GetCurrentProcessID,1) ; // 1=在任務(wù)監(jiān)視器中隱藏這個(gè)任務(wù)
Frm_sys_login := TFrm_sys_login.Create(application);
if Frm_sys_login.showmodal<>mrok then begin // 關(guān)閉主窗口,重新啟動(dòng)
close;
WinExit(EWX_FORCE OR EWX_SHUTDOWN );
exit;
end;
if (m_VerId = 1) and (m_ICtype = '5') then // 若是管理卡,則顯示這個(gè)任務(wù)
//wqh if (m_VerId = 1) and (m_ICtype = '5') then // 若是管理卡,則顯示這個(gè)任務(wù)
RegisterServiceProcess(GetCurrentProcessID,0);
if m_ICtype = '5' then
EnabControl
else
DisaControl ;
startcount;
if m_ICtype <> '5' then begin
frm_ShowUser.Show ; // 最后, 顯示計(jì)費(fèi)對(duì)話框
SetForegroundWindow(frm_showuser.Handle);
N5.Visible := false ;
end else
N5.visible := true ;
Wnd := FindWindow('Progman',nil);
ShowWindow(wnd,SW_SHOW); // 顯示桌面上的圖標(biāo)
frm_display1.show ; // 顯示計(jì)費(fèi)金額
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=在任務(wù)監(jiān)視器中隱藏這個(gè)任務(wù)
RegTmp := TRegistry.Create ;
with RegTmp do
begin
RootKey := HKEY_LOCAL_MACHINE ;
OpenKey('\SoftWare\Microsoft\ADEL',true);
WriteString('Start', '0'); // 用來(lái)關(guān)閉啟動(dòng)程序ACPIBIOS.EXE
CloseKey ;
OpenKey('\Software\Adel\NetBar\Settings',true);
readcon := readString('ADOServer'); // 得到服務(wù)器的名稱
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.意味著不能連接數(shù)據(jù)庫(kù)
m_syspara := ReadSyspara ; //從注冊(cè)表中獲取網(wǎng)吧的系統(tǒng)標(biāo)識(shí)
end;
end;
getMem(CPTnamee,16);
len := 16 ;
getcomputername(CPTnamee,len);
m_CpName := CPTnamee ; // 得到本部電腦的名稱
m_CpName := trim(m_CpName);
FreeMem(CPTnamee);
SVname := m_CpName ; // 考慮到網(wǎng)絡(luò)不通,先假定服務(wù)端為本地
DisaControl ; // 定義啟動(dòng)程序
If m_Stop='9' Then exit ; // 若網(wǎng)絡(luò)不通,退出
with Qry_Tmp1 do
begin
close;
sql.text := 'select Montime, Sdtime, SVname from Pdata' ;
open;
m_Montime := fields[0].AsInteger ; // 寫(xiě)卡的間隔(分鐘數(shù))
//BjCat m_Montime := m_Montime * 60000 ; // 寫(xiě)卡的間隔(微秒數(shù))
m_Montime := m_Montime * 120000 ; // 寫(xiě)卡的間隔(微秒數(shù))
m_sdTime := fields[1].AsInteger ; // 自動(dòng)關(guān)機(jī)的時(shí)間(分鐘數(shù))
SVname := fields[2].AsString ; // 服務(wù)端的名稱
close;
sql.text := 'select TermName, Gid, ComName From users Where TermName = ''' + m_CpName+'''' ;
open ;
m_RTtype := fields[1].AsString ; // 得到本部電腦的費(fèi)率類(lèi)型
if m_RTtype='' then m_RTtype := '01' ; // 若電腦被惡意改名, 先按普通費(fèi)率處理
ComName := fields[2].AsString ; // 得到本部電腦的串口號(hào)
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); // 得到系統(tǒng)標(biāo)識(shí)碼
close;
end;
m_DateTime := ServerDateTime ; // 得到服務(wù)器當(dāng)前的時(shí)間
SetPCSystemTime(m_DateTime); // 按服務(wù)器的時(shí)間設(shè)定本地的時(shí)間
m_Date := FormatDatetime('yyyy"-"mm"-"dd" "hh":"nn":"ss', m_DateTime); // 得到服務(wù)器當(dāng)前的日期
m_time := FormatDateTime('hh:nn', m_DateTime); // 得到服務(wù)器當(dāng)前的時(shí)間
ver.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
GetVersionEx(ver);
m_VerId := ver.dwPlatformId ; // 得到版本號(hào),window98 =1 window nt=2
end;
procedure TF_MAIN.FormShow(Sender: TObject);
var
XWndLong: integer ;
Wnd: Thandle ;
begin
ps(pchar(m_syspara)); // 初始化系統(tǒng), 傳輸系統(tǒng)標(biāo)識(shí)碼
if not OpenCom(m_com) then begin
application.MessageBox('串口錯(cuò)','警告', mb_ok);
m_Stop := '8' ; // ???
end;
// 在任務(wù)欄上隱藏這個(gè)任務(wù)
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 ;
// 生成一個(gè)托盤(pán) MyTray(NIM_DELETE)
MyTray(NIM_ADD);
if m_VerId = 1 then // 對(duì)于 WIN98
RegisterServiceProcess(GetCurrentProcessID,1) ; // 1=在任務(wù)監(jiān)視器中隱藏這個(gè)任務(wù)
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 // 若是管理卡,則顯示這個(gè)任務(wù)
RegisterServiceProcess(GetCurrentProcessID,0);
if m_ICtype = '5' then
EnabControl
else
DisaControl ;
if m_ICtype <> '5' then begin
frm_ShowUser.Show ; // 最后, 顯示計(jì)費(fèi)對(duì)話框
SetForegroundWindow(FRM_SHOWUSER.Handle);
N5.Visible := false ;
end else
N5.visible := true ;
StartCount; // 開(kāi)始計(jì)費(fèi)
Wnd := FindWindow('Progman',nil);
ShowWindow(wnd,SW_SHOW); // 顯示桌面上的圖標(biāo)
SvSocket.Active := true ; // 打開(kāi)SvSocket
frm_display1.show ; // 顯示計(jì)費(fèi)金額
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); // 定義拖盤(pán)及事件
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 := '大學(xué)生公寓城計(jì)費(fèi)系統(tǒng)'+#13+'客戶端' ;
end;
SHELL_NOTIFYICON(NOTIFYMSG,@TND) ;
end;
procedure TF_MAIN.IconCallBackMessage(var Mess : TMessage); //回調(diào)函數(shù)
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 ; // 單擊左鍵, 顯示計(jì)費(fèi)對(duì)話框
SetForegroundWindow(FRM_SHOWUSER.Handle); // 當(dāng)前的窗口聚焦
except
beep ;
end;
end;
procedure TF_MAIN.N1Click(Sender: TObject);
begin
try
frm_ShowUser.Show ; // 顯示計(jì)費(fèi)對(duì)話框
SetForegroundWindow(FRM_SHOWUSER.Handle); // 當(dāng)前的窗口聚焦
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 ; // 打開(kāi)客戶端
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,'服務(wù)端沒(méi)有啟動(dòng)!','提示',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);
//重新啟動(dòng)計(jì)算機(jī)
if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]+CtrlCode[4]+CtrlCode[5]+CtrlCode[6]='restart' then
ExitWindowsEx(EWX_REBOOT,2);
//關(guān)閉計(jì)算機(jī)
if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]+CtrlCode[4]='close' then
ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN,2) ;
//顯示接收到信息
if CtrlCode[0]='
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -