📄 unitlogin.~pas
字号:
unit UnitLogin;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons, ShellAPI, ScktComp, IdWinsock, Winsock,
DB;
type
TFrmLogin = class(TForm)
RGroupUserType: TRadioGroup;
GBoxLoginInfo: TGroupBox;
LEditUser: TLabeledEdit;
LEditPassword: TLabeledEdit;
BBtnOK: TBitBtn;
BBtnCancel: TBitBtn;
LEditDataSourse: TLabeledEdit;
CSocket: TClientSocket;
SSocket: TServerSocket;
procedure RGroupUserTypeClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BBtnOKClick(Sender: TObject);
procedure BBtnCancelClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure CSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure CSocketConnecting(Sender: TObject; Socket: TCustomWinSocket);
procedure CSocketLookup(Sender: TObject; Socket: TCustomWinSocket);
procedure CSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure CSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure SSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure SSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmLogin: TFrmLogin;
LoginStr: String;
implementation
uses UnitDataModule, UnitCommonModule, UnitMain, UnitWait;
{$R *.dfm}
// returns ISP assigned IP
function LocalIP : string;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;
begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^[I] <> nil do begin
result:=StrPas(inet_ntoa(pptr^[I]^));
Inc(I);
end;
WSACleanup;
end;
procedure TFrmLogin.RGroupUserTypeClick(Sender: TObject);
begin
ClearEdit(FrmLogin);
case RGroupUserType.ItemIndex of
0:
begin
GBoxLoginInfo.Visible := False;
Height := 116;
BBtnOK.Top := 63;
BBtnCancel.Top := 63;
end;
1:
begin
GBoxLoginInfo.Visible := True;
GBoxLoginInfo.Height := 70;
Height := 196;
BBtnOK.Top := 143;
BBtnCancel.Top := 143;
LEditDataSourse.Visible := False;
end;
2:
begin
GBoxLoginInfo.Visible := True;
GBoxLoginInfo.Height := 94;
Height := 218;
BBtnOK.Top := 165;
BBtnCancel.Top := 165;
LEditDataSourse.Visible := True;
end;
end;
end;
procedure TFrmLogin.FormShow(Sender: TObject);
begin
Height := 116;
BBtnOK.Top := 63;
BBtnCancel.Top := 63;
RGroupUserType.ItemIndex := 0;
RGroupUserTypeClick(Sender);
end;
procedure TFrmLogin.BBtnOKClick(Sender: TObject);
begin
case RGroupUserType.ItemIndex of
0:
begin
CSocket.Host := ServerHost;
if Not CSocket.Active then CSocket.Active := True;
if CanLogin then
begin
// 重新登入
// 普通用户:R101<202.198.168.168>0+15:57:10#
LoginStr := 'R'+ IntToStr(CSocket.Socket.SocketHandle) +
'<' + CSocket.Socket.LocalAddress +'>'+
IntToStr(RGroupUserType.ItemIndex) + '+'+
CLoginTimeStr + '#';
CSocket.Socket.SendText(LoginStr);
end;
end;
1:
begin
if LEditUser.Text = ''
then Application.MessageBox('用户名不能为空!','提示',0)
else
begin
CSocket.Host := ServerHost;
if Not CSocket.Active then CSocket.Active := True;
if CanLogin then
begin
// 重新登入
// 高级用户:R102<202.198.168.168>1Andy*6666+15:57:10#
LoginStr := 'R'+ IntToStr(CSocket.Socket.SocketHandle) +
'<' + CSocket.Socket.LocalAddress +'>'+
IntToStr(RGroupUserType.ItemIndex) +
LEditUser.Text + '*'+ LEditPassword.Text + '+'+
CLoginTimeStr + '#';
CSocket.Socket.SendText(LoginStr);
end;
end;
end;
2:
begin
if LEditUser.Text = ''
then Application.MessageBox('用户名不能为空!','提示',0)
else
begin
try
if Not DM.ADOConnection1.Connected then
begin
DM.ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=' +
LEditPassword.Text +';Persist Security Info=True;User ID=' +
LEditUser.Text + ';Data Source=' +
LEditDataSourse.Text;
DM.ADOConnection1.Connected := True;
end;
except
Application.MessageBox('登入服务器失败!','提示',0);
ClearEdit(FrmLogin);
LEditUser.SetFocus;
Exit;
end;
SUser := LEditUser.Text;
SPassword := LEditPassword.Text;
SDataS := LEditDataSourse.Text;
SSocket.Active := True;
IsServer := True;
CanLogin := True;
Application.MessageBox('登入服务器成功!','提示',0);
// 根据不通的用户设置窗体及权限
SetUserForm(2);
// 写日志
FillRecord('管理员', '成功');
// 写状态栏
FrmMain.SBar.Panels[3].Text := '管理员';
FrmMain.SBar.Panels[5].Text := FormatDateTime('hh:nn AM/PM', Now);
Close;
end;
end;
end;
end;
procedure TFrmLogin.BBtnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TFrmLogin.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Not CanLogin then
begin
SSocket.Active := False;
CSocket.Active := False;
Application.Terminate;
end;
end;
procedure TFrmLogin.CSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// 正在验证用户和密码,请稍等...
// 普通用户:L101<202.198.168.168>0#
// 高级用户:L102<202.198.168.168>1Andy*6666#
LoginStr := 'L'+ IntToStr(Socket.SocketHandle) +
'<' + Socket.LocalAddress +'>'+
IntToStr(RGroupUserType.ItemIndex);
if RGroupUserType.ItemIndex = 1 then
LoginStr := LoginStr + LEditUser.Text + '*'
+ LEditPassword.Text + '#'
else LoginStr := LoginStr + '#';
Socket.SendText(LoginStr);
end;
procedure TFrmLogin.CSocketConnecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
// PanelInfo.Caption := '正在连接,请稍等...';
end;
procedure TFrmLogin.CSocketLookup(Sender: TObject;
Socket: TCustomWinSocket);
begin
// PanelInfo.Caption := '正在查找服务器,请稍等...';
end;
procedure TFrmLogin.CSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
// PanelInfo.Caption := '通信出现错误!';
end;
procedure TFrmLogin.CSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
ServerStr: String;
Useri, Passwordi, DataSoursei, LoginTimei: Integer;
begin
ServerStr := Socket.ReceiveText;
if ServerStr[1] = 'O' then
begin
Application.MessageBox('验证失败,不存在此用户!', '提示', 0);
ClearEdit(FrmLogin);
if Not CanLogin then CSocket.Active := False; // 新用户
end
else
if ServerStr[1] = 'N' then
begin
Application.MessageBox('验证失败,密码错误!', '提示', 0);
LEditPassword.Text := '';
LEditPassword.SetFocus;
if Not CanLogin then CSocket.Active := False; // 新用户
end
else
if ServerStr[1] = 'Y' then
begin
if CanLogin then // 重新登入成功 发出上次用户的退出信息
CSocket.Socket.SendText('E'+CUser+'<'+CSocketID+'>'+CLoginTimeStr);
// 成功:Ygis<gis>FEIYANG*20:44:30#
// 从服务器发来的数据中得到连接服务器的信息
SUser := ''; SPassword := ''; SDataC := ''; CLoginTimeStr := '';
for Useri := 2 to Length(ServerStr) do
begin
if ServerStr[Useri] <> '<' then
SUser := SUser + ServerStr[Useri]
else Break;
end;
for Passwordi := Useri+1 to Length(ServerStr) do
begin
if ServerStr[Passwordi] <> '>' then
SPassword := SPassword + ServerStr[Passwordi]
else Break;
end;
for DataSoursei := Passwordi+1 to Length(ServerStr) do
begin
if ServerStr[DataSoursei] <> '*' then
SDataC := SDataC + ServerStr[DataSoursei]
else Break;
end;
for LoginTimei := DataSoursei+1 to Length(ServerStr) do
begin
if ServerStr[LoginTimei] <> '#' then
CLoginTimeStr := CLoginTimeStr + ServerStr[LoginTimei]
else Break;
end;
try
if Not DM.ADOConnection1.Connected then
begin
DM.ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=' +
SPassword +';Persist Security Info=True;User ID=' +
SUser + ';Data Source=' +
SDataC;
DM.ADOConnection1.Connected := True;
end;
except
Application.MessageBox('登入服务器失败!','提示',0);
ClearEdit(FrmLogin);
LEditUser.SetFocus;
Exit;
end;
if RGroupUserType.ItemIndex = 0 then CUser := '普通用户'
else CUser := LEditUser.Text;
CSocketID := IntToStr(CSocket.Socket.SocketHandle);
IsServer := False;
CanLogin := True;
Application.MessageBox('登入服务器成功!','提示',0);
// 根据不通的用户设置窗体及权限
SetUserForm(RGroupUserType.ItemIndex);
// 写状态栏
FrmMain.SBar.Panels[3].Text := CUser;
FrmMain.SBar.Panels[5].Text := FormatDateTime('hh:nn AM/PM', Now);
Close;
end
else
if ServerStr[1] = 'S' then
begin
CSocket.Active := False;
DeleteMap();
Application.MessageBox('服务器端终止与你的连接!','提示',0);
Application.Terminate;
end;
end;
procedure TFrmLogin.SSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// 添日志
// FillRecord();
end;
procedure TFrmLogin.SSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Socketi, Ipi, Useri, Passwordi, LoginTimei: Integer;
SendS: String;
begin
ClientStr := Socket.ReceiveText;
if (ClientStr[1] = 'L') or (ClientStr[1] = 'R') // 登入请求
then
begin
// 普通用户:L101<202.198.168.168>0#
// 高级用户:L102<202.198.168.168>1Andy*6666#
// 普通用户:R101<202.198.168.168>0+15:57:10#
// 高级用户:R102<202.198.168.168>1Andy*6666+15:57:10#
CSocketID := ''; CIp := ''; CUser := ''; CPassword := '';
CLoginTimeStr := '';
for Socketi := 2 to Length(ClientStr) do
begin
if ClientStr[Socketi] <> '<' then
CSocketID := CSocketID + ClientStr[Socketi]
else Break;
end;
for Ipi := Socketi+1 to Length(ClientStr) do
begin
if ClientStr[Ipi] <> '>' then
CIp := CIp + ClientStr[Ipi]
else Break;
end;
CLevel := StrToInt(ClientStr[Ipi+1]);
if (ClientStr[1] = 'R') then // 重新登入的
if (CLevel = 0) then // 普通用户
begin
for LoginTimei := Ipi+3 to Length(ClientStr) do
begin
if ClientStr[LoginTimei] <> '#' then
CLoginTimeStr := CLoginTimeStr + ClientStr[LoginTimei]
else Break;
end;
end;
if CLevel = 1 // 高级用户
then
begin
for Useri := Ipi+2 to Length(ClientStr) do
begin
if ClientStr[Useri] <> '*' then
CUser := CUser + ClientStr[Useri]
else Break;
end;
for PassWordi := Useri+1 to Length(ClientStr) do
begin
if (ClientStr[PassWordi] <> '+') and
(ClientStr[PassWordi] <> '#') then
CPassword := CPassword + ClientStr[PassWordi]
else Break;
end;
if (ClientStr[1] = 'R') then // 重新登入的
begin
for LoginTimei := PassWordi+1 to Length(ClientStr) do
begin
if ClientStr[LoginTimei] <> '#' then
CLoginTimeStr := CLoginTimeStr + ClientStr[LoginTimei]
else Break;
end;
end;
end;
// 成功:Ygis[gis]FEIYANG#
SendS := 'Y' + SUser +'<'+ SPassword +'>'+ SDataS;
if CLevel = 0 then // 普通用户
begin
FillRecord('普通用户', '成功');
SendS := SendS + '*' + CLoginTimeStr + '#';
SSocket.Socket.Connections[SendUserNum].SendText(SendS);
end;
if CLevel = 1 then // 高级用户
begin
if Not DM.ADOQueryUsers.Active then DM.ADOQueryUsers.Open;
if DM.ADOQueryUsers.Locate('UserName', CUser, [loCaseInsensitive]) then
begin
if DM.ADOQueryUsers.FieldByName('Password').AsString = CPassword then
begin
FillRecord('高级用户', '成功');
SendS := SendS + '*' + CLoginTimeStr + '#';
SSocket.Socket.Connections[SendUserNum].SendText(SendS);
end
else
begin
FillRecord('高级用户', '失败');
SSocket.Socket.Connections[SendUserNum].SendText('N');
end;
end else
begin
FillRecord('高级用户', '失败');
SSocket.Socket.Connections[SendUserNum].SendText('O');
end;
end;
end
else if ClientStr[1] = 'E' // 客户端退出
then
begin
// Efeiyang<133>10:38:10#
CUser := ''; CSocketID := ''; CLoginTimeStr := '';
for Useri := 2 to Length(ClientStr) do
begin
if ClientStr[Useri] <> '<' then
CUser := CUser + ClientStr[Useri]
else Break;
end;
for Socketi := Useri+1 to Length(ClientStr) do
begin
if ClientStr[Socketi] <> '>' then
CSocketID := CSocketID + ClientStr[Socketi]
else Break;
end;
for LoginTimei := Socketi+1 to Length(ClientStr) do
begin
if ClientStr[LoginTimei] <> '#' then
CLoginTimeStr := CLoginTimeStr + ClientStr[LoginTimei]
else Break;
end;
// 填写客户端退出日志
FillRecordE(CUser, CSocketID, CLoginTimeStr);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -