📄 sys_main.pas
字号:
unit sys_main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls, Buttons, ScktComp ,IniFiles ,StdCtrls ,Exch,
CoolTrayIcon ,WinSock ,mmsystem;
type
TFSys_main = class(TForm)
StatusBar1: TStatusBar;
Panel1: TPanel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
SpeedButton5: TSpeedButton;
SpeedButton6: TSpeedButton;
SpeedButton7: TSpeedButton;
SpeedButton8: TSpeedButton;
SpeedButton9: TSpeedButton;
SpeedButton10: TSpeedButton;
SpeedButton11: TSpeedButton;
SpeedButton12: TSpeedButton;
SpeedButton13: TSpeedButton;
OpeSocket: TClientSocket;
OpeTimer: TTimer;
CoolTrayIcon1: TCoolTrayIcon;
procedure FormCreate(Sender: TObject);
procedure SpeedButton13Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure OpeSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure OpeSocketConnecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure OpeSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure OpeSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure OpeSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure OpeTimerTimer(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
procedure SpeedButton9Click(Sender: TObject);
procedure SpeedButton11Click(Sender: TObject);
procedure SpeedButton10Click(Sender: TObject);
procedure CoolTrayIcon1DblClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton5Click(Sender: TObject);
procedure SpeedButton6Click(Sender: TObject);
procedure StatusBar1DblClick(Sender: TObject);
private
{ Private declarations }
LineNo:String;
DeskNo:String;
SysState:String;
LoginState:Integer;
PhoneState:Integer; //话务状态 0 未登录 91 登录空闲 92 登录忙碌 93 摘机 94通话中
TimeCount:Integer;
CHClose:Boolean;
DestNo:String;
ToMobile:String;
procedure UpdateStatusBar(i:Integer;Str:String);
function Send_OCCP_BIND:Integer;
function Send_OCCP_UNBIND:Integer;
function Send_OCCP_LINK:Integer;
function Send_OCCP_CALLOUT(phonenumber:String):Integer;
function Send_OCCP_CALLIN(DestNo:String):Integer;
function Send_OCCP_EXCHOUT(phonenumber:String):Integer;
function Send_OCCP_EXCHIN(DestNo:String):Integer;
function Send_OCCP_BUSY:Integer;
function Send_OCCP_IDLE:Integer;
function Send_OCCP_CLINE:Integer;
function Send_OCCP_SLINE_RESP:Integer;
function Send_OCCP_SPHONE_RESP:Integer;
function Send_OCCP_ANS:Integer;
function Send_OCCP_HUNGUP:Integer;
public
{ Public declarations }
ExchType:Integer;
ExchLine:String;
ExchPhone:String;
procedure InitTimer;
procedure InitButton;
function FormatSpace(var StrTemp: String; Len: Integer): String; //格式化字符串长度,左齐右补空格
procedure FormatChar(var a:array of char;b:string);
procedure FortmatString(Var StrTemp:String);
function MyInputBox(const ACaption, APrompt, ADefault: string;Len:Integer = 255): string;
function MyInputQuery(const ACaption, APrompt: string; var Value: string;Len:Integer = 255): Boolean;
procedure EditKeyPress(Sender: TObject; var Key: Char);
end;
var
FSys_main: TFSys_main;
FormA: TForm;
implementation
uses Occp;
{$R *.dfm}
{$R ope.res}
procedure TFSys_main.FormCreate(Sender: TObject);
var
FileName:String;
MyIniFile:Tinifile;
AcdIP:String;
AcdSocket:Integer;
begin
PhoneState:=0;
InitButton;
FileName:=ExtractFilePath(Paramstr(0))+'OpeClient.ini';
MyIniFile:=Tinifile.Create(FileName);
DeskNo:=MyIniFile.ReadString('System','DeskNo','0');
LineNo:=MyIniFile.ReadString('System','LineNo','0');
AcdIP:=MyIniFile.ReadString('System','AcdIP','192.168.11.17');
AcdSocket:=MyIniFile.ReadInteger('System','AcdSocket',9901);
SysState:='未登录';
UpdateStatusBar(0,SysState);
UpdateStatusBar(8,DeskNo);
//StatusBar1.Panels[0].Text:=SysState;
//StatusBar1.Panels[8].Text:=DeskNo;
OpeSocket.Host:=AcdIP;
OpeSocket.Port:=AcdSocket;
try
OpeSocket.Open;
//OpeSocket.Active:=true;
except
on E:ESocketError do
begin
Showmessage(E.Message);
end;
end;
OpeTimer.Enabled:=False;
CHClose:=False;
end;
procedure TFSys_main.SpeedButton13Click(Sender: TObject);
begin
FSys_main.Hide;
if MessageBox(0,'你真的要退出吗?','警告',MB_OKCANCEL+MB_ICONWARNING)=IDOK then
begin
if PhoneState <> 0 then
Send_OCCP_UNBIND;
sleep(1000);
CHClose:=True;
Close;
end
else
FSys_main.Show;
end;
procedure TFSys_main.SpeedButton1Click(Sender: TObject);
begin
if OpeSocket.Active then
Send_OCCP_BIND
else
Showmessage('服务器异常');
end;
procedure TFSys_main.UpdateStatusBar(i: Integer; Str: String);
begin
StatusBar1.Panels[i].Text:=Str;
end;
function TFSys_main.FormatSpace(var StrTemp: String; Len: Integer): String;
var
I:Integer;
begin
for I:=Length(StrTemp)+1 to Len do
StrTemp:=StrTemp+#0;
end;
procedure TFSys_main.FormatChar(var a: array of char; b: string);
var
i:integer;
begin
for i:=low(a) to high(a) do
begin
if i+1<=Length(b) then
a[i]:=b[i+1]
else
a[i]:=#0;
end;
end;
procedure TFSys_main.InitTimer;
begin
OpeTimer.Enabled:=True;
OpeTimer.Interval:=5000;
TimeCount:=0;
end;
procedure TFSys_main.InitButton;
begin
case PhoneState of
0:
begin
SpeedButton1.Enabled:=True;
SpeedButton2.Enabled:=False;
SpeedButton3.Enabled:=False;
SpeedButton4.Enabled:=False;
SpeedButton5.Glyph:=nil;
SpeedButton5.Caption:='摘机';
sndPlaySound(nil, 0);
SpeedButton5.Enabled:=False;
SpeedButton6.Enabled:=False;
SpeedButton7.Enabled:=False;
SpeedButton8.Enabled:=False;
SpeedButton9.Enabled:=False;
SpeedButton10.Enabled:=False;
SpeedButton11.Enabled:=False;
SpeedButton12.Enabled:=False;
SpeedButton13.Enabled:=True;
end;
91:
begin
SpeedButton1.Enabled:=False;
SpeedButton2.Enabled:=True;
SpeedButton3.Enabled:=False;
SpeedButton4.Enabled:=True;
SpeedButton5.Glyph:=nil;
sndPlaySound(nil, 0);
SpeedButton5.Caption:='摘机';
SpeedButton5.Enabled:=False;
SpeedButton6.Enabled:=False;
SpeedButton7.Enabled:=False;
SpeedButton8.Enabled:=False;
SpeedButton9.Enabled:=False;
SpeedButton10.Enabled:=False;
SpeedButton11.Enabled:=False;
SpeedButton12.Enabled:=False;
SpeedButton13.Enabled:=True;
end;
92:
begin
SpeedButton1.Enabled:=False;
SpeedButton2.Enabled:=True;
SpeedButton3.Enabled:=True;
SpeedButton4.Enabled:=False;
SpeedButton5.Glyph:=nil;
sndPlaySound(nil, 0);
SpeedButton5.Caption:='摘机';
SpeedButton5.Enabled:=False;
SpeedButton6.Enabled:=False;
SpeedButton7.Enabled:=False;
SpeedButton8.Enabled:=False;
SpeedButton9.Enabled:=True;
SpeedButton10.Enabled:=False;
SpeedButton11.Enabled:=True;
SpeedButton12.Enabled:=False;
SpeedButton13.Enabled:=True;
end;
93:
begin
SpeedButton1.Enabled:=False;
SpeedButton2.Enabled:=False;
SpeedButton3.Enabled:=False;
SpeedButton4.Enabled:=True;
SpeedButton5.Glyph:=nil;
sndPlaySound(nil, 0);
SpeedButton5.Caption:='摘机';
SpeedButton5.Enabled:=False;
SpeedButton6.Enabled:=False;
SpeedButton7.Enabled:=False;
SpeedButton8.Enabled:=False;
SpeedButton9.Enabled:=True;
SpeedButton10.Enabled:=False;
SpeedButton11.Enabled:=True;
SpeedButton12.Enabled:=False;
SpeedButton13.Enabled:=True;
end;
94:
begin
SpeedButton1.Enabled:=False;
SpeedButton2.Enabled:=False;
SpeedButton3.Enabled:=False;
SpeedButton4.Enabled:=False;
SpeedButton5.Glyph:=nil;
sndPlaySound(nil, 0);
SpeedButton5.Caption:='摘机';
SpeedButton5.Enabled:=False;
SpeedButton6.Enabled:=True;
SpeedButton7.Enabled:=False;
SpeedButton8.Enabled:=False;
SpeedButton9.Enabled:=False;
SpeedButton10.Enabled:=True;
SpeedButton11.Enabled:=False;
SpeedButton12.Enabled:=False;
SpeedButton13.Enabled:=True;
end;
95://话机待摘机状态
begin
SpeedButton1.Enabled:=False;
SpeedButton2.Enabled:=False;
SpeedButton3.Enabled:=False;
SpeedButton4.Enabled:=False;
SpeedButton5.Caption:='';
SpeedButton5.Glyph.LoadFromResourceName(hinstance,'mypic');
PlaySound('mywav', hInstance, SND_RESOURCE or SND_ASYNC Or SND_LOOP);
SpeedButton5.Enabled:=True;
SpeedButton6.Enabled:=False;
SpeedButton7.Enabled:=False;
SpeedButton8.Enabled:=False;
SpeedButton9.Enabled:=False;
SpeedButton10.Enabled:=False;
SpeedButton11.Enabled:=False;
SpeedButton12.Enabled:=False;
SpeedButton13.Enabled:=False;
end;
end;
end;
procedure TFSys_main.OpeTimerTimer(Sender: TObject);
begin
if (Timecount+1) mod 6 = 0 then
begin
Send_OCCP_LINK;
end;
TimeCount:=TimeCount+1;
end;
procedure TFSys_main.OpeSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Showmessage('Socket Error');
SysState:='服务器异常';
UpdateStatusBar(0,SysState);
Application.Terminate;
end;
procedure TFSys_main.OpeSocketConnecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
SysState:='连接服务器';
UpdateStatusBar(0,SysState);
end;
procedure TFSys_main.OpeSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
SysState:='连接成功';
UpdateStatusBar(0,SysState);
sleep(1000);
SysState:='未登录';
UpdateStatusBar(0,SysState);
end;
procedure TFSys_main.OpeSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
PhoneState:=0;
SysState:='连接断开';
UpdateStatusBar(0,SysState);
sleep(1000);
SysState:='未登录';
UpdateStatusBar(0,SysState);
end;
procedure TFSys_main.OpeSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
HEAD_INFO:OCCP_PDU_HEAD;
LINE_INFO:OCCP_SLINE;
SPHONE_INFO:OCCP_SPHONE;
StrTmp:String;
mobile:String;
spnumber:String;
I:Integer;
begin
TimeCount:=0;
I:=Socket.ReceiveLength;
Socket.ReceiveBuf(HEAD_INFO,SizeOf(HEAD_INFO));
HEAD_INFO.command_length:= ntohl(HEAD_INFO.command_length);
HEAD_INFO.csopcode:=ntohl(HEAD_INFO.csopcode);
HEAD_INFO.command_status:=ntohl(HEAD_INFO.command_status);
case HEAD_INFO.csopcode of
OPE_OCCP_BIND_RESP:
begin
LoginState:=HEAD_INFO.command_status;
if LoginState = 0 then
begin
SysState:='已登录';
UpdateStatusBar(0,SysState);
PhoneState:=91;
InitButton;
InitTimer;
end
else
begin
SysState:='登录失败';
UpdateStatusBar(0,SysState);
end;
end;
OPE_OCCP_CLINE_RESP,
OPE_OCCP_SLINE:
begin
Socket.ReceiveBuf(LINE_INFO,SizeOf(LINE_INFO));
StrTmp:=LINE_INFO.Linestate;
FortmatString(StrTmp);
if StrTmp = 'IDLE' then
begin
PhoneState:=91;
SysState:='登录示闲';
end
else if StrTmp = 'BUSY' then
begin
PhoneState:=92;
SysState:='登录示忙';
end
else if StrTmp = 'TALKING' then
begin
PhoneState:=94;
SysState:='通话中';
end
else if StrTmp = 'ANSWER' then
begin
PhoneState:=93;
SysState:='摘机中';
end;
InitButton;
UpdateStatusBar(0,SysState);
if HEAD_INFO.csopcode = OPE_OCCP_SLINE then
begin
Send_OCCP_SLINE_RESP;
end;
end;
OPE_OCCP_SPHONE:
begin
Socket.ReceiveBuf(SPHONE_INFO,SizeOf(SPHONE_INFO));
mobile:=SPHONE_INFO.Phonenumber;
spnumber:=SPHONE_INFO.Spnumber;
UpdateStatusBar(2,mobile);
UpdateStatusBar(4,spnumber);
phoneState:=95;
InitButton;
Send_OCCP_SPHONE_RESP;
end;
OPE_OCCP_BUSY_RESP:
begin
LoginState:=HEAD_INFO.command_status;
if LoginState = 0 then
begin
SysState:='已登录示忙';
UpdateStatusBar(0,SysState);
PhoneState:=92;
InitButton;
InitTimer;
end
else
begin
SysState:='示忙失败';
UpdateStatusBar(0,SysState);
end;
end;
OPE_OCCP_IDLE_RESP:
begin
LoginState:=HEAD_INFO.command_status;
if LoginState = 0 then
begin
SysState:='已登录示闲';
UpdateStatusBar(0,SysState);
PhoneState:=91;
InitButton;
InitTimer;
end
else
begin
SysState:='示闲失败';
UpdateStatusBar(0,SysState);
end;
end;
OPE_OCCP_UNBIND_RESP:
begin
LoginState:=HEAD_INFO.command_status;
if LoginState = 0 then
begin
SysState:='未登录';
UpdateStatusBar(0,SysState);
PhoneState:=0;
InitButton;
OpeTimer.Enabled:=False;
end
else
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -