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

📄 main.pas

📁 不错啊
💻 PAS
字号:
unit MAIN;

interface

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, Menus,
  StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, StdActns,
  ActnList, ToolWin, ImgList,changePwd,registerCompany,authorization,
  logIn, OleCtrls, MSCommLib_TLB, DB, DBTables,IdGlobal;

type
  TMainForm = class(TForm)
    MainMenu1: TMainMenu;
    Help1: TMenuItem;
    HelpAboutItem: TMenuItem;
    OpenDialog: TOpenDialog;
    StatusBar: TStatusBar;
    ActionList1: TActionList;
    EditCut1: TEditCut;
    EditCopy1: TEditCopy;
    EditPaste1: TEditPaste;
    FileNew1: TAction;
    FileSave1: TAction;
    FileExit1: TAction;
    FileOpen1: TAction;
    FileSaveAs1: TAction;
    WindowCascade1: TWindowCascade;
    WindowTileHorizontal1: TWindowTileHorizontal;
    WindowArrangeAll1: TWindowArrange;
    WindowMinimizeAll1: TWindowMinimizeAll;
    HelpAbout1: TAction;
    FileClose1: TWindowClose;
    WindowTileVertical1: TWindowTileVertical;
    ToolBar2: TToolBar;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N8: TMenuItem;
    N7: TMenuItem;
    N9: TMenuItem;
    N27: TMenuItem;
    N31: TMenuItem;
    N32: TMenuItem;
    N33: TMenuItem;
    N34: TMenuItem;
    N35: TMenuItem;
    N36: TMenuItem;
    N37: TMenuItem;
    N38: TMenuItem;
    N39: TMenuItem;
    N40: TMenuItem;
    N41: TMenuItem;
    N42: TMenuItem;
    MSComm1: TMSComm;
    Table1: TTable;
    Table2: TTable;
    Table3: TTable;
    Table4: TTable;
    procedure FileNew1Execute(Sender: TObject);
    procedure FileOpen1Execute(Sender: TObject);
    procedure HelpAbout1Execute(Sender: TObject);
    procedure FileExit1Execute(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure N32Click(Sender: TObject);
    procedure N33Click(Sender: TObject);
    procedure N35Click(Sender: TObject);
    procedure N38Click(Sender: TObject);
    procedure N39Click(Sender: TObject);
    procedure N40Click(Sender: TObject);
    procedure N42Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure MSComm1Comm(Sender: TObject);
  private
    { Private declarations }
    list:TStringList;//用来暂时存放程控机多条记录
    isBusy:boolean;//是否正在存盘
    recv:string; // 用来暂时存放程控机一条记录
    //当前登陆的用户名和密码
    userName,userPwd:string;
    //当前用户权限
    userPower:string;
    //根据当前用户权限设置菜单项和命令按钮
    procedure setPower;
    procedure CreateMDIChild(const Name: string);
    function calPay(l:double;tp:string):double;
    function isMoney(s:string):boolean;
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

uses CHILDWIN, about, openTel, closeTel, detail, telType, zoneNo, extension,
  query;

procedure TMainForm.CreateMDIChild(const Name: string);
var
  Child: TMDIChild;
begin
  { create a new MDI child window }
  Child := TMDIChild.Create(Application);
  Child.Caption := Name;
  if FileExists(Name) then Child.Memo1.Lines.LoadFromFile(Name);
end;

procedure TMainForm.FileNew1Execute(Sender: TObject);
begin
  CreateMDIChild('NONAME' + IntToStr(MDIChildCount + 1));
end;

procedure TMainForm.FileOpen1Execute(Sender: TObject);
begin
  if OpenDialog.Execute then
    CreateMDIChild(OpenDialog.FileName);
end;

procedure TMainForm.HelpAbout1Execute(Sender: TObject);
begin
   aboutBox:=TAboutBox.Create(self);
  AboutBox.ShowModal;
end;

procedure TMainForm.FileExit1Execute(Sender: TObject);
begin
  Close;
end;

procedure TMainForm.N9Click(Sender: TObject);
begin
   close;
   application.Terminate;
end;

procedure TMainForm.N5Click(Sender: TObject);
var
   rt:integer;
begin
   frmChangePwd:=TFrmChangePwd.Create(self);
   rt:=frmChangePwd.ShowModal;
   if rt=mrOk then//修改密码
   begin
      frmChangePwd.changePwd(userName);
   end;
   frmChangePwd.Destroy;
end;

procedure TMainForm.N6Click(Sender: TObject);
var
   rt:integer;
   f:file;
   s1,s2,s3,s4:string[160];
begin
   frmRegisterCompany:=TFrmRegisterCompany.Create(self);
   if fileExists('info.ini') then//如果单位配置文件存在
   begin
      assignFile(f,'info.ini');
      reSet(f,1);//打开文件
      blockRead(f,s1,60);
      blockRead(f,s2,100);
      blockRead(f,s3,12);
      blockRead(f,s4,28);
      frmRegisterCompany.edit1.Text:=s1;
      frmRegisterCompany.edit2.Text:=s2;
      frmRegisterCompany.edit3.Text:=s3;
      frmRegisterCompany.edit4.Text:=s4;
      closeFile(f);
   end;
   rt:=frmRegisterCompany.ShowModal;
   if rt=mrOk then//录入使用单位信息
   begin
      frmRegisterCompany.registerCompany;
   end;
   frmRegisterCompany.Destroy;
end;

procedure TMainForm.N8Click(Sender: TObject);
begin
   frmAuthorization:=TFrmAuthorization.Create(self);
   frmAuthorization.ShowModal;
   frmAuthorization.Destroy;
end;

procedure TMainForm.FormShow(Sender: TObject);

var
   rt:integer;
   n:integer;//失败次数
begin
   n:=0;
   frmLogIn:=TFrmLogIn.Create(application);
   while n<3 do
   begin
   rt:=frmLogIn.ShowModal;
   if rt=mrCancel then//用户按取消
   begin
      close;
      exit;
   end
   else if (rt=mrOk) and frmLogIn.canPass then //登陆成功
   begin
      userName:=frmLogIn.name.Text;
      userPwd:=frmLogIn.pwd.Text;
      userPower:=frmLogIn.power;
      setPower;
      exit;
   end
   else
   begin//失败
      n:=n+1;//失败次数增加
      if n>=3 then
      begin
         messageDlg('您已经失败3次,程序将终止',mtWarning,[mbOk],0);
         close;
         application.Terminate;
         exit;
      end
      else//重新尝试
         messageDlg('密码错误,请重试',mtWarning,[mbOk],0);
   end;
   end;
end;


procedure TMainForm.setPower;
begin
   if userPower='1' then//管理权限
   begin

   end
   else if userPower='2' then//操作权限
   begin
      n2.Enabled:=false;
      n3.Enabled:=false;
      n8.Enabled:=false;
      n6.Enabled:=false;
   end
   else if userPower='3' then//访问权限
   begin
      n2.Enabled:=false;
      n3.Enabled:=false;
      n8.Enabled:=false;
      n6.Enabled:=false;
      n32.Enabled:=false;
      n33.Enabled:=false;
      n38.Enabled:=false;
      n39.Enabled:=false;
      n40.Enabled:=false;
      //将每个查询窗体关于修改,添加,删除按钮制成disabled

   end;
end;

procedure TMainForm.N32Click(Sender: TObject);
var
   telNo:string;
   s:string;
   canSend:boolean;
begin
   canSend:=false;
   frmOpenTel:=TFrmOpenTel.create(self);
   frmOpenTel.ShowModal;
   telNo:=frmOpenTel.no.Text;
   //检查分机号的合理性
   with table4 do
   begin
      open;
      while not eof do
      begin
         if fieldByName('分机号').AsString=telNo then
         begin
            canSend:=true;
            break;
         end;
         next;
      end;
   end;
   if canSend=false then
   begin
      showMessage('输入的分机号错误,请重新输入!');
      table4.Close;
      exit;
   end;
   //检查押金的合理性
   if isMoney(frmOpenTel.money.Text)=false then
   begin
      showMessage('输入的押金错误,请重新输入!');
      table4.Close;
      exit;
   end;
   s:='GI|RN'+telNo+'|FL1'+chr(13);
   msComm1.Output:=s;
   with table4 do
   begin
      if fieldByName('开通标志').AsString='n' then
      begin
         edit;
         fieldValues['开通标志']:='y';
         fieldValues['话费限额']:=frmOpenTel.money.Text;
         post;
      end
      else
      begin
         edit;
         fieldValues['话费限额']:=fieldByName('话费限额').AsFloat
                                 +strToFloat(frmOpenTel.money.Text);
         post;
      end;
      Close;
   end;
end;

procedure TMainForm.N33Click(Sender: TObject);
var
   telNo:string;
   s:string;
begin
   frmCloseTel:=TFrmCloseTel.create(self);
   frmCloseTel.ShowModal;
   telNo:=frmOpenTel.no.Text;
   s:='GO|RN'+telNo+'|FL1'+chr(13);
   msComm1.Output:=s;
end;

procedure TMainForm.N35Click(Sender: TObject);
begin
   frmDetail:=TFrmDetail.create(self);
   frmDetail.ShowModal;
end;

procedure TMainForm.N38Click(Sender: TObject);
begin
   frmTelType:=TFrmTelType.create(self);
   frmTeltype.showModal;
end;

procedure TMainForm.N39Click(Sender: TObject);
begin
   frmZoneNo:=TFrmZoneNo.create(self);
   frmZoneNo.showModal;
end;

procedure TMainForm.N40Click(Sender: TObject);
begin
   frmExtension:=TFrmExtension.create(self);
   frmExtension.showModal;
end;

procedure TMainForm.N42Click(Sender: TObject);
begin
   frmQuery:=TFrmQuery.create(self);
   frmQuery.showModal;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
   list:=TStringList.Create;
   isBusy:=false;
   recv:='';
   msComm1.CommPort:=1;//使用com1口
   msComm1.Settings:='9600,n,8,1';//设置通信参数
   msComm1.RThreshold:=1;//每收到一个字符就调用一次处理函数
   msComm1.InputLen:=1;//每次从输入缓冲区中接收一个字符
   msComm1.Handshaking:=2;//由信号线RTS/CTS自动进行流量控制
   try
      msComm1.PortOpen:=true;//打开串口
   except
      showMessage('COM1错误!');
      Application.Terminate;
   end;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   if msComm1.PortOpen=true then
      msComm1.PortOpen:=false;
end;

procedure TMainForm.MSComm1Comm(Sender: TObject);
var
   c:string;
   s:string;
   beginTime:string;
   lastTime:string;
   intLast:integer;
   callNo:string;
   extensionNo:string;
   phoneType:string;
   tmp:string;
   maxLen:integer;
   pay:double;
begin
   case msComm1.CommEvent of
   comEvReceive:
   begin
   maxLen:=0;
   c:=msComm1.Input;
   recv:=recv+c;
   if (pos(#10,c)<>0)or(pos(#13,c)<>0) then
   begin
      list.Add(recv);
      if isBusy=false then
      begin
         isBusy:=true;
         while list.Count>0 do
         begin
            s:=list.Strings[0];
            while copy(s,1,1)=#0 do
               delete(s,1,1);
            beginTime:=copy(s,1,14);
            extensionNo:=copy(s,21,4);
            callNo:=copy(s,34,20);
            lastTime:=copy(s,59,6);
            with table1 do
            begin
               open;
               while not eof do
               begin
                  tmp:=fieldByName('区号').AsString;
                  if (pos(tmp,callNo)=1)and(maxLen<length(tmp)) then//最佳模式匹配
                     phoneType:=fieldByName('类型').AsString;
                  next;
               end;
               close;
            end; {end of with}
            {计算费用}
            intLast:=strToInt(copy(s,59,2))*3600+strToInt(copy(s,62,2))*60+strToInt(copy(s,65,2));
            pay:=calPay(intLast,phoneType);
            with table2 do
            begin
               open;
               insert;
               fieldValues['分机号']:=extensionNo;
               fieldValues['被叫号码']:=callNo;
               fieldValues['电话类型']:=phoneType;
               fieldValues['开始时间']:=beginTime;
               fieldValues['通话时长']:=lastTime;
               fieldValues['话费']:=pay;
               post;
               close;
            end;{end of with}
         end;{end of while}
      end;
   end;
   end;{end of case receive}
   end;{end of case}
end;

function TMainForm.calPay(l: double;tp:string): double;
var
   firTime:double;
   firCount:double;
   unitTime:double;
   unitCount:double;
   pay:double;
begin
   with table3 do
   begin
      open;
      while not eof do
      begin
         if fieldByName('名称').AsString=tp then
         begin
            firTime:=fieldByName('首次计时').AsFloat;
            firCount:= fieldByName('首次计价').AsFloat;
            unitTime:=fieldByName('单位时间').AsFloat;
            unitCount:=fieldByName('单位计价').AsFloat;
            break;
         end;{end of if}
         next;
      end;
      close;
   end;{end of with}
   if (l-firTime)>=0 then
   begin
      l:=l-firTime;
      pay:=firCount;
      pay:=pay+(l/unitTime)*unitCount;
   end
   else
   begin
      pay:=(l*firCount)/firTime;
   end;
   result:=pay;
end;

function TMainForm.isMoney(s: string): boolean;
var
   i:integer;
begin
   i:=1;
   if length(s)=0 then
   begin
      result:=false;
      exit;
   end;
   while i<=length(s) do
   begin
      if (isNumeric(s[i])=false) and (s[i]<>'.')then
      begin
         result:=false;
         exit;
      end;
      i:=i+1;
   end;
   result:=true;
end;

end.


⌨️ 快捷键说明

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