服务器端与客户端用socket建立连接,当客户端向服务器端发送数据后,服务器端接收、处理并返回数据,在客户端如何在数据传递后,再执行下一步操作。比如,点击查询按钮,客户端发送一SQl查询语句给服务器端,服务器端返回一XML给客户端,现在是怎么样让查询结果完全传递后,再执行将XML传递给dataset的操作?

解决方案 »

  1.   

    发送时是这样的:
    procedure TFrm_Login.Button1Click(Sender: TObject);
    begin
      if strXML<>'' then
      begin
        ClientSocket.Socket.SendText('select * from Da_user order by username'+'$');    CltDS_User.Data := XMLToDataSet(strXML).Data;
        CltDS_User.Active := True;
        SocketConnectYes := 'No';
        while not CltDS_User.Eof do
        begin
          C_username.Items.Add(CltDS_User.FieldValues['username']);
          CltDS_User.Next;
        end;
      end;
    end;    
    接收时这样:
    procedure TFrm_Main.ClientSocketRead(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      strXML:=Socket.ReceiveText;
    end;当第一次点击按钮时,错误。再点击结果就出来了。应该怎么处理呢?
      

  2.   

    上面写错了
    发送时是这样的:
    procedure TFrm_Login.Button1Click(Sender: TObject);
    begin  ClientSocket.Socket.SendText('select * from Da_user order by username'+'$');
      if strXML<>'' then
      begin
        CltDS_User.Data := XMLToDataSet(strXML).Data;
        CltDS_User.Active := True;
        SocketConnectYes := 'No';
        while not CltDS_User.Eof do
        begin
        C_username.Items.Add(CltDS_User.FieldValues['username']);
        CltDS_User.Next;
        end;
      end;
    end;   
    接收时这样:
    procedure TFrm_Main.ClientSocketRead(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      strXML:=Socket.ReceiveText;
    end;
      

  3.   

    定义一个全局的变量;
    var
      strXML:Tstringlist;  //用来存放接收到的数据
    //在主程序的create中添加:
      strXML:=Tstringlist.Create;
      strXML.Sorted:=false;
    //在主程序的Destroy中添加:
    if Assigned(strXML) then
        begin
            strXML.Free;
            strXML:=nil;
        end;
    发送:
    procedure TFrm_Login.Button1Click(Sender: TObject);
    begin
      ClientSocket.Socket.SendText('select * from Da_user order by username'+'$');
    end;   
    接收:
    procedure TFrm_Main.ClientSocketRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      str:string;
    begin
      str:=Socket.ReceiveText;
      strXML.add(str);
    end;procedure TFrm_Login.showtimetimer(Sender: TObject);//用定时器处理收到数据显示到界面的问题
    begin
      if strXML.Count<=0 then  //接收变量中没有数据时跳出
      begin
        exit;
      end;  CltDS_User.Data := XMLToDataSet(strXML.Strings[0]).Data;
      CltDS_User.Active := True;  while not CltDS_User.Eof do
      begin
      C_username.Items.Add(CltDS_User.FieldValues['username']);
      CltDS_User.Next;
      end;
      strXML.Delete(0);
    end;   
      

  4.   

    执行到
     CltDS_User.Active := True;
    有错误!
    CltDS_User Missing data provider or data packet!
      

  5.   

    在Begin之后加一句试试:
        CltDS_User.Active := False;