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

📄 fmain.pas

📁 1. 发卡服务端:Server 项目文件:autojet.prj 2. 计费客户端:Client 项目文件:internet.prj Explorer.prj 先启动Exp
💻 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);

  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   // 若是管理卡,则显示这个任务

     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 + -