{$WARN SYMBOL_DEPRECATED OFF}
unit loginp;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, RzTabs, RzPanel, StdCtrls, RzLabel, Mask, RzEdit,
  RzCmboBx, RzButton, Buttons, Menus, IdUDPClient, IdBaseComponent,
  IdComponent, IdUDPBase, IdUDPServer,IdSocketHandle;type
  Tlogin = class(TForm)
    Image1: TImage;
    RzPanel1: TRzPanel;
    RzPageControl1: TRzPageControl;
    TabSheet1: TRzTabSheet;
    RzLabel1: TRzLabel;
    RzLabel2: TRzLabel;
    RzLabel3: TRzLabel;
    RzComboBox1: TRzComboBox;
    pass: TRzEdit;
    cuser: TRzComboBox;
    RzButton1: TRzButton;
    RzButton2: TRzButton;
    RzToolbarButton1: TRzToolbarButton;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    IdUDPServer1: TIdUDPServer;
    IdUDPClient1: TIdUDPClient;
    Label1: TLabel;
    procedure RzButton2Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure RzButton1Click(Sender: TObject);
    procedure RzToolbarButton1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  login: Tlogin;
  aa:STRING;
  bb:STRING;
  cishu:integer;
implementationuses dmp,conn,conn2,md5;{$R *.dfm}//判断输入的ip地址是否合法
function IsIp(Str: string): Boolean;
var
  I, K, DotCnt : Integer;
  Num: string;
  Arr: Array [1..4] of string;
begin
  Result := False;
  DotCnt := 0;
  //由'0'..'9', '.'组成
  For I := 1 to Length(Str) do
  begin
    if Not (Str[I] in ['0'..'9', '.']) then
      Exit
    else
    if Str[I] = '.' then
      inc(DotCnt);
  end;
  //点分隔符号数量应该=3
  if DotCnt <> 3 then Exit;
  For K := 1 to 3 do
  begin
    I := Pos('.', Str);
    Num := Copy(Str, 1, I - 1);
    Delete(Str, 1, I);
    Arr[K] := Num;
  end;
  Arr[4] := Str;
  try
    DotCnt := 0;
    For I := 1 to 4 do
    begin
      K := StrToInt(Arr[I]);
      //每字节的值应介于0~255之间
      if ((K >= 0) and (K <= 255)) then
        Inc(DotCnt);
    end;
    //四个字节都满足0~255之间,则合法
    if(DotCnt = 4) then
      Result := True;
  except
  end;
end;
//==============================================================================
procedure Tlogin.RzButton2Click(Sender: TObject);
begin
  application.Terminate;
end;procedure Tlogin.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   application.Terminate;
end;procedure Tlogin.RzButton1Click(Sender: TObject);
var
  vt:string;
begin
  IdUDPServer1.Active:=True;
  IdUDPClient1.Active:=true;
  label1.Caption:='正在连接服务器,请稍后...';
  if IsIp(rzcombobox1.Text) then
     begin
        vt:=RzComboBox1.Text;
        IdUDPClient1.Send(vt,6789,'你是否在开着');
        SetADOConnection(dm.ADOConnection1,rzcombobox1.Text);
        SetADOConnection1(dm.ADOConnection2);
     end
  else
     begin
        //showmessage('IP不合法,请从新输入!');
      Application.MessageBox('IP不合法,请从新输入!','警告',mb_iconwarning);     end;
//==============================================================================
end;procedure Tlogin.RzToolbarButton1Click(Sender: TObject);
begin
// 左健弹出菜单。
popupmenu1.Popup(mouse.CursorPos.x,mouse.CursorPos.y); 
end;procedure Tlogin.FormCreate(Sender: TObject);
begin
     //打开idudp
  with IdUDPServer1.Bindings.Add do
  begin
    IP:='';
    Port:=6789;
  end;
  //设置本地端口号
  // IdUDPClient1.DefaultPort:=6789;
  //设置超时连接毫秒数
  IdUDPClient1.ReceiveTimeout:=5000;//毫秒
  //激活服务
  label1.Caption:='';
end;procedure Tlogin.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
Var
  v:String;
  str,id,name,kl:string;
begin
  if  IdUDPClient1.ReceiveTimeout=5000 then
    begin
       IdUDPServer1.Active:=false;
       IdUDPClient1.Active:=false;
       APPLICATION.MESSAGEBOX('您要连接的服务器端没有开启或网络不稳定,请稍后在登陆!','系统信息',mb_iconwarning);
       exit;
    end;
  if AData.Size<=0 then
    Exit;
  SetLength(v,AData.Size);
  AData.Read(v[1],AData.Size);
  if v='我已经启动了' then
     begin
       //ShowMessage(ABinding.IP+' is Existsed!'+s);//电脑A在线.
       //判断用户是否存在,并且登陆
     if (cuser.Text='') or (pass.Text='') then
         APPLICATION.MESSAGEBOX('您输入姓名或密码!','错误',mb_okcancel+mb_iconerror )
     else
       begin
         aa:=cuser.text;
         bb:=MD5Print(MD5String(pass.Text));
         dm.ryxx.close;
         dm.ryxx.sql.Clear;
         str:='select yhm,kl,yhid from ryxx where yhm='''+ aa +''' and kl='''+ bb +'''';
         dm.ryxx.sql.add(str);
         //dm.yh.ParamByName('aa').AsString:=cuser.Text;
         //dm.yh.ParamByName('bb').AsString:=pass.Text;
         dm.ryxx.open;         if not dm.ryxx.Eof then
             begin
                //mainform.StatusBar1.Panels[0].Text:='当前用户:'+aa;
                //mainform.StatusBar1.Panels[1].Text:='当前日期:'+DateTimeToStr(Now);
                id:=dm.ryxx.FieldByName('yhid').AsString;
                name:=dm.ryxx.FieldByName('yhm').AsString;
                kl:=dm.ryxx.FieldByName('kl').AsString;
                login.Hide;
                //ModalResult:=mrOK;  //密码正确,关闭自己,返回值mrOK;                //mainform.ShowModal;
                //IdUDPServer1.Active:=false;
                //IdUDPClient1.Active:=false;
                //display.ShowModal;
            end
         else
         if APPLICATION.MESSAGEBOX('您输入用户名或密码有误!请再一次输入','错误信息',mb_ok+mb_iconerror)=idok then
              cishu:=cishu+1;
              dm.ADOConnection1.Connected:=false;
              dm.ADOConnection2.Connected:=false;
              //==============如果输入3次退出系统工程======================
                 if cishu>3 then
                     application.Terminate;
                   //  cpassword.SetFocus ;end;       end;     end
  else
     begin
        APPLICATION.MESSAGEBOX('您要连接的服务器端没有开启,请稍后在登陆!','系统信息',mb_iconwarning);
     end;
end;end.
我发现我的思路是这样的,点击登陆按钮。然后当dUDPServer1读取到我已经启动了' 这个时候才判断用户是否正确,但是我发现一个问题,如果服务器上程序没有启动,我客户端的程序根本就不执行
procedure Tlogin.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);,请问我这个登陆验证窗口该怎么做

解决方案 »

  1.   

    是啊。那你看看我的思路,因该知道我上面做的是什么
    我的思路是这样的,当点击登陆按钮,则给服务器端发送一个信息,如果服务器端开启了,则服务器给客户端返回一个‘我已经启动了' 这样的信息。
    然后当客户端的dUDPServer1读取到‘我已经启动了' ,才判断登陆用户是否存在。
    但是我发现一个问题,如果服务器上的程序没有启动,则我客户端的程序根本就不执行
    procedure Tlogin.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);,
    因为我的验证用户写在procedure Tlogin.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);,这里了,所以服务器端不启动,则这里无法运行
    请问我这个登陆验证窗口该怎么做
      

  2.   

    我把程序缩短一下,就清楚了
    //点击登陆按钮-------------------------------------------------------
    procedure Tlogin.RzButton1Click(Sender: TObject);
    var
      vt:string;
    begin
      IdUDPServer1.Active:=True;
      IdUDPClient1.Active:=true;
      label1.Caption:='正在连接服务器,请稍后...';
      if IsIp(rzcombobox1.Text) then
         begin
            vt:=RzComboBox1.Text;
            IdUDPClient1.Send(vt,6789,'你是否在开着');
            SetADOConnection(dm.ADOConnection1,rzcombobox1.Text);
            SetADOConnection1(dm.ADOConnection2);
         end
      else
         begin
            //showmessage('IP不合法,请从新输入!');
          Application.MessageBox('IP不合法,请从新输入!','警告',mb_iconwarning);     end;
    //---------------------------------------------------------------------------
    //--窗体创建-----------------------------------------------------------------
    procedure Tlogin.FormCreate(Sender: TObject);
    begin
         //打开idudp
      with IdUDPServer1.Bindings.Add do
      begin
        IP:='';
        Port:=6789;
      end;
      //设置本地端口号
      // IdUDPClient1.DefaultPort:=6789;
      //设置超时连接毫秒数
      IdUDPClient1.ReceiveTimeout:=5000;//毫秒
      //激活服务
      label1.Caption:='';
    end;
    //-------------------------------------------------------------------------
    //udpserver读取信息--------------------------------------------------------
    procedure Tlogin.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    Var
      v:String;
      str,id,name,kl:string;
    begin
      if  IdUDPClient1.ReceiveTimeout=5000 then
        begin
           IdUDPServer1.Active:=false;
           IdUDPClient1.Active:=false;
           APPLICATION.MESSAGEBOX('您要连接的服务器端没有开启或网络不稳定,请稍后在登陆!','系统信息',mb_iconwarning);
           exit;
        end;
      if AData.Size<=0 then
        Exit;
      SetLength(v,AData.Size);
      AData.Read(v[1],AData.Size);
      if v='我已经启动了' then
         begin
           //ShowMessage(ABinding.IP+' is Existsed!'+s);//电脑A在线.
           //判断用户是否存在,并且登陆
         if (cuser.Text='') or (pass.Text='') then
             APPLICATION.MESSAGEBOX('您输入姓名或密码!','错误',mb_okcancel+mb_iconerror )
         else
           begin
             aa:=cuser.text;
             bb:=MD5Print(MD5String(pass.Text));
             dm.ryxx.close;
             dm.ryxx.sql.Clear;
             str:='select yhm,kl,yhid from ryxx where yhm='''+ aa +''' and kl='''+ bb +'''';
             dm.ryxx.sql.add(str);
             //dm.yh.ParamByName('aa').AsString:=cuser.Text;
             //dm.yh.ParamByName('bb').AsString:=pass.Text;
             dm.ryxx.open;         if not dm.ryxx.Eof then
                 begin
                    //mainform.StatusBar1.Panels[0].Text:='当前用户:'+aa;
                    //mainform.StatusBar1.Panels[1].Text:='当前日期:'+DateTimeToStr(Now);
                    id:=dm.ryxx.FieldByName('yhid').AsString;
                    name:=dm.ryxx.FieldByName('yhm').AsString;
                    kl:=dm.ryxx.FieldByName('kl').AsString;
                    login.Hide;
                    //ModalResult:=mrOK;  //密码正确,关闭自己,返回值mrOK;                //mainform.ShowModal;
                    //IdUDPServer1.Active:=false;
                    //IdUDPClient1.Active:=false;
                    //display.ShowModal;
                end
             else
             if APPLICATION.MESSAGEBOX('您输入用户名或密码有误!请再一次输入','错误信息',mb_ok+mb_iconerror)=idok then
                  cishu:=cishu+1;
                  dm.ADOConnection1.Connected:=false;
                  dm.ADOConnection2.Connected:=false;
                  //==============如果输入3次退出系统工程======================
                     if cishu>3 then
                         application.Terminate;
                       //  cpassword.SetFocus ;end;       end;     end
      else
         begin
            APPLICATION.MESSAGEBOX('您要连接的服务器端没有开启,请稍后在登陆!','系统信息',mb_iconwarning);
         end;
    end;end.