📄 main.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 + -