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

📄 ufrmmain.pas

📁 图书电子阅览室门禁系统 v1.0
💻 PAS
字号:
unit UfrmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ImgList, StdCtrls, RzCmboBx, Mask, RzEdit, RzLstBox,
  RzChkLst, RzLabel, RzTabs, RzGroupBar, ExtCtrls, RzPanel, RzListVw,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, RzButton,
  IdAntiFreezeBase, IdAntiFreeze, Menus,IniFiles, RzRadChk;
const
  //客户机端信号
  KillConnect    ='断开连接';
  LoginConnect   ='申请连接';
  Door           ='学生入/出门';
  GetUserInfo    ='获取学生信息';
  InFlag         ='学生是否进门';
  //服务器端信号
  StopServerNow     ='关闭连接';
  BroadCast      ='系统广播';
  UserInfo       ='学生信息';
  //公共信号
  DATA           ='数据信息';
  GetDataSuccessIn ='接收入门数据成功';
  GetDataSuccessOut='接收出门数据成功';
  
type
  TfrmMain = class(TForm)
    StatusBar1: TStatusBar;
    StatusBar2: TStatusBar;
    RzPanel1: TRzPanel;
    RzPanel2: TRzPanel;
    RzGroupBar1: TRzGroupBar;
    RzGroup1: TRzGroup;
    RzGroup2: TRzGroup;
    RzGroup4: TRzGroup;
    RzPanel3: TRzPanel;
    RzPageControl1: TRzPageControl;
    TabSheet1: TRzTabSheet;
    TabSheet2: TRzTabSheet;
    ImageListMenu: TImageList;
    RzGroupBox1: TRzGroupBox;
    edtPort: TRzEdit;
    edtHost: TRzEdit;
    RzLabel1: TRzLabel;
    RzLabel2: TRzLabel;
    RzListView1: TRzListView;
    ImageListUser: TImageList;
    IdTCPClient: TIdTCPClient;
    RzMemoState: TRzMemo;
    RzGroup3: TRzGroup;
    edtUserID: TRzEdit;
    RzBitBtn1: TRzBitBtn;
    IdAntiFreeze1: TIdAntiFreeze;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    RzBitBtn2: TRzBitBtn;
    RzRadioButton1: TRzRadioButton;
    RzRadioButton2: TRzRadioButton;
    procedure IdTCPClientConnected(Sender: TObject);
    procedure IdTCPClientDisconnected(Sender: TObject);
    procedure RzGroup1Items3Click(Sender: TObject);
    procedure RzGroup1Items0Click(Sender: TObject);
    procedure RzGroup1Items1Click(Sender: TObject);
    procedure RzBitBtn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure RzGroup4Items0Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure RzBitBtn2Click(Sender: TObject);
    procedure edtUserIDChange(Sender: TObject);
    procedure RzGroup2Items0Click(Sender: TObject);
    procedure RzGroup1Items2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure LockControls(ALock:Boolean);
    function SendData(nIndex:Integer;sMsg:string):Boolean;
    function ConcatStr(nCommand:string;nMsg:string):string;  //待发送消息编码
    procedure SplitStr(nMsg:string);                         //分解收到的消息
  end;

var
  frmMain: TfrmMain;
  //----------------------------------
  nCommand:string;
  nStr:array[0..4] of Variant;
  //----------------------------------
implementation

uses UfrmUserInfo,UfrmAbout;

{$R *.dfm}

procedure TfrmMain.IdTCPClientConnected(Sender: TObject);
var
    LString : String;
begin
    LString := IdTCPClient.ReadLn;
    self.RzMemoState.Lines.Insert(0,'连接到服务器!');
    self.RzMemoState.Lines.Insert(0,'服务器信息 -> '+LString);
    LockControls(true);
end;

procedure TfrmMain.IdTCPClientDisconnected(Sender: TObject);
var
    strMsg:string;
begin
    self.RzMemoState.Lines.Insert(0,'与远程服务器断开连接');
    strMsg:='';
    strMsg:=self.ConcatStr(KillConnect,strMsg);
    self.IdTCPClient.WriteLn(strMsg);
    LockControls(false);
end;

procedure TfrmMain.LockControls(ALock: Boolean);
var
    i : integer;
begin
    for i := 0 to componentcount-1 do
        if TControl(Components[i]).Tag = 99 then
            TControl(Components[i]).Enabled := ALock;
end;

procedure TfrmMain.RzGroup1Items3Click(Sender: TObject);
begin
    Close;
end;

procedure TfrmMain.RzGroup1Items0Click(Sender: TObject);
begin
    Self.RzMemoState.Lines.Clear;
    with IdTCPClient do
    begin
        Host := edtHost.Text;
        Port := StrToint(edtPort.Text);
        try
            Connect; // add a timeout here if you wish, eg: Connect(3000) = timeout after 3 seconds.
        except
            on E : Exception do
            begin
                LockControls(True);
                //ShowMessage(E.Message);
                self.RzMemoState.Lines.Append(E.Message);
            end;
        end;
    end;
end;

procedure TfrmMain.RzGroup1Items1Click(Sender: TObject);
begin
    if IdTCPClient.Connected then
       try
           IdTCPClient.Disconnect; // we can disconnect from either the server or the client side
       except on E : Exception do
           //ShowMessage(E.Message);
           self.RzMemoState.Lines.Append(E.Message);
       end;
end;

function TfrmMain.SendData(nIndex: Integer; sMsg: string): Boolean;
begin
    Result:=False;
    with IdTCPClient do
    begin
         try
              case nIndex of
                0: WriteLn(sMsg);       //学生入/出门:InDoor+$YW$+学生编号;;
                1: WriteLn(sMsg);       //获取学生信息:GetUserInfo+$YW$+学生编号;
                2: WriteLn(sMsg);       //学生是否进门信息:InFlag+$YW$+学生编号;
              end;
              Result:=True;
         except
              on E : Exception do
              begin
                  LockControls(True);
                  //ShowMessage(E.Message);
                  self.RzMemoState.Lines.Append(E.Message);
                  Result:=False;
              end;
         end;
    end;
end;

function TfrmMain.ConcatStr(nCommand, nMsg: string): string;
var
    strMsg:string;
begin
    strMsg:=nCommand;
    strMsg:=strMsg+'$YW$'+nMsg;
    Result:=strMsg;
end;

procedure TfrmMain.SplitStr(nMsg: string);
var
    strMsg:string;
    i,j:Integer;
begin
    strMsg:=nMsg;
    i:=Pos('$YW$',strMsg);        //查找信号命令符$YW$的位置
    nCommand:=Copy(strMsg,1,i-1); //获得信号命令
    //ShowMessage(nCommand);
    Delete(strMsg,1,i+3);         //删除已获得信号命令和$YW$字符串
    //ShowMessage(strMsg);
    i:=Pos('%YW%',strMsg);        //查找数据信号符%YW%的位置
    //ShowMessage(IntToStr(i));
    j:=0;
    while i>0 do
    begin
          //i:=Pos('%YW%',strMsg);      //查找数据信号符%YW%的位置
          nStr[j]:=Copy(strMsg,1,i-1);  //获得数据
          //ShowMessage(VarToStr(nStr[j]));
          //ShowMessage(nStr[j]);
          Delete(strMsg,1,i+3);         //删除已获得数据信号和%YW%字符串
          i:=Pos('%YW%',strMsg);        //查找数据信号符%YW%的位置
          j:=j+1;
    end;
end;

procedure TfrmMain.RzBitBtn1Click(Sender: TObject);
var
    strMsg:string;//发送的信息
    recMsg:string;//返回的信息
    //sCommand,sName:string;//返回数据中的:命令信号和用户名称
    AItem:TListItem;
    nI,j:Integer;
begin
    strMsg:=self.edtUserID.Text+'%YW%';
    strMsg:=Self.ConcatStr(Door,strMsg);
    Self.IdTCPClient.WriteLn(strMsg);    //发送入门/出门信息
    self.RzMemoState.Lines.Append('发送数据成功');
    recMsg:=Self.IdTCPClient.ReadLn;     //接收服务器返回的信息:用户名
    self.RzMemoState.Lines.Append('接收数据成功');
    self.SplitStr(recMsg);
    if nCommand=GetDataSuccessIn then
    begin
       AItem:=Self.RzListView1.Items.Add;
       AItem.ImageIndex:=0;
       AItem.Caption:=nStr[0];
    end;
    if nCommand=GetDataSuccessOut then
    begin
       for j:=0 to self.RzListView1.Items.Count-1 do
       begin
           if self.RzListView1.Items[j].Caption=nStr[0] then
           begin
              self.RzListView1.Items[j].Delete;
              Exit;
           end;
       end;
    end;
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    if Application.MessageBox('确定退出本系统吗?','提示',MB_OKCANCEL+MB_ICONQUESTION)<>IDOK then
    begin
       Abort;
    end;
end;

procedure TfrmMain.N1Click(Sender: TObject);
begin
    self.RzListView1.ViewStyle:=vsIcon;
    self.RzListView1.Refresh;
end;

procedure TfrmMain.N2Click(Sender: TObject);
begin
    self.RzListView1.ViewStyle:=vsSmallIcon;
    self.RzListView1.Refresh;
end;

procedure TfrmMain.N3Click(Sender: TObject);
begin
    self.RzListView1.ViewStyle:=vsList;
    self.RzListView1.Refresh;
end;

procedure TfrmMain.N4Click(Sender: TObject);
begin
    self.RzListView1.ViewStyle:=vsReport;
    self.RzListView1.Refresh;
end;

procedure TfrmMain.RzGroup4Items0Click(Sender: TObject);
var
    strMsg:string;
    recMsg:string;
    i,j:Integer;
begin
    if self.RzListView1.SelCount=0 then
    begin
       Application.MessageBox('请选择要查看的学生!','提示',MB_OK+MB_ICONINFORMATION);
       Exit;
    end;
    for i:=0 to self.RzListView1.Items.Count-1 do
    begin
       if self.RzListView1.Items[i].Selected then
       begin
          strMsg:=self.RzListView1.Items[i].Caption+'%YW%';
          strMsg:=self.ConcatStr(GetUserInfo,strMsg);
          Self.IdTCPClient.WriteLn(strMsg);
          self.RzMemoState.Lines.Append('发送查询学生信息请求成功');
          recMsg:=self.IdTCPClient.ReadLn;
          self.RzMemoState.Lines.Append('查询学生信息请求被允许并返回信息');
          self.SplitStr(recMsg);
          if nCommand=UserInfo then
          begin
             try
                 frmUserInfo:=TfrmUserInfo.Create(Application);
                 frmUserInfo.txtID.Text   :=nStr[0];
                 frmUserInfo.txtName.Text :=nStr[1];
                 frmUserInfo.txtSex.Text  :=nStr[2];
                 frmUserInfo.txtBM.Text   :=nStr[3];
                 frmUserInfo.txtDW.Text   :=nStr[4];
                 frmUserInfo.ShowModal;
             finally
                 frmUserInfo.Free;
             end;
          end;
       end;
    end;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
    SysSetup:TIniFile;
    AppPath:string;
begin
    AppPath:=ExtractFilePath(Application.ExeName)+'SysSetup.ini';
    SysSetup:=TIniFile.Create(AppPath);
    try
        self.edtHost.Text:=SysSetup.ReadString('SYSTEM','HOSTIP','');
        self.edtPort.Text:=SysSetup.ReadString('SYSTEM','HOSTPORT','');
    finally
        SysSetup.Free;
    end;
end;

procedure TfrmMain.RzBitBtn2Click(Sender: TObject);
var
    SysSetup:TIniFile;
    AppPath:string;
begin
    AppPath:=ExtractFilePath(Application.ExeName)+'SysSetup.ini';
    SysSetup:=TIniFile.Create(AppPath);
    try
        SysSetup.WriteString('SYSTEM','HOSTIP',self.edtHost.Text);
        SysSetup.WriteString('SYSTEM','HOSTPORT',self.edtPort.Text);
    finally
        SysSetup.Free;
    end;
end;

procedure TfrmMain.edtUserIDChange(Sender: TObject);
begin
    if self.RzRadioButton1.Checked then
       Exit;
    if self.RzRadioButton2.Checked then
       self.RzBitBtn1Click(self.RzBitBtn1);
end;

procedure TfrmMain.RzGroup2Items0Click(Sender: TObject);
begin
    Self.RzMemoState.Clear;
end;

procedure TfrmMain.RzGroup1Items2Click(Sender: TObject);
begin
    try
       frmAbout:=TfrmAbout.Create(Application);
       frmAbout.ShowModal;
    finally
       frmAbout.Free;
    end;   
end;

end.

⌨️ 快捷键说明

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