//类定义
TLogClientSocket = Class( TClientSocket )
  private
    DaysInter : integer;
    function GetLogDate: string;
    procedure ConnectServer;
//下面定义一个过程用来替代OnRead事件
    procedure ClientOnRead(Sender: TObject; Socket: TCustomWinSocket); 
  public
    constructor Create;
    destructor Destroy; override;  end;constructor TLogClientSocket.Create;
begin
  inherited Create(nil);
//注意,关键是下句,我把OnRead方法赋给ClientOnRead
//以方便调用
  OnRead := ClientOnRead; 
end;
//下面这个死活不执行,巨郁闷,并且我可以保证肯定有包发过来
procedure TLogClientSocket.ClientOnRead(Sender: TObject; Socket: TCustomWinSocket);
var sMsg : string;
begin
  sMsg := Socket.ReceiveText;    // 取得服务器返回信息
  showmessage(sMsg );
end;//窗体启动时创建对象
procedure TFrmMain.FormCreate(Sender: TObject);
var LogClientSocket : TLogClientSocket;
begin
  LogClientSocket := TLogClientSocket.Create;
  with LogClientSocket do
  try  
    ConnectServer;
    if DaysInter > 3 then
      Application.Terminate;
  finally
    Destroy;
  end;
end;//痴情帅哥冒雪求答~~~~~~~~~~~~

解决方案 »

  1.   

    我没说清楚吗?为什么我把OnRead方法赋给ClientOnRead,有包过来时,ClientOnRead不执行?
    大哥们救命啊!!!
      

  2.   

    procedure TLogClientSocket.ClientOnRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      SocketStream: TWinSocketStream;
    begin
      SocketStream := TWinSocketStream.Create(Socket);
      SocketStream.ReadBuffer  ......end;
      

  3.   

    感谢老冯,可我发的就是TEXT,有必要作成流接收吗?
    并且我试验过,如果我不封装成类,用控件CLientSocket接收,在OnRead里是可以收到的。
    为什么不用控件直接用类在ClientOnRead里收不到呢?
      

  4.   

    控件CLientSocket的ClientType是如何设置的?(应该是ctNonBlocking吧).这样吧,你在你的封装类设定一下:constructor TLogClientSocket.Create;
    begin
      inherited Create(nil);  ClientType := ctNonBlocking;//注意,关键是下句,我把OnRead方法赋给ClientOnRead
    //以方便调用
      OnRead := ClientOnRead; 
    end;然后你再用你的ONread看看能不能收到?
      

  5.   

    ClientType 默认就是ctNonBlocking,我加上这句还是不行。
    注意是用ClientOnRead函数来接收而不是OnRead
      

  6.   

    用SocketStream := TWinSocketStream.Create(Socket)可以吗?
      

  7.   

    这么晚你还没睡〉:)
    不可以,现在的问题是程序根本就没进入ClientOnRead函数
    我在里面设置断点了,发现ClientOnRead函数根本没执行!
      

  8.   

    找到你的程序毛病了.出在Free上面,我改了一下(TLogClientSocket的代码都是正确的)
    procedure TFormDemo.FormCreate(Sender: TObject);
    var
      LogClientSocket : TLogClientSocket;
    begin
      inherited;
      LogClientSocket := TLogClientSocket.Create;
      with LogClientSocket do
      try
        ConnectServer;
        if DaysInter > 3 then
          Application.Terminate;
      finally
        //Free;
      end;
    end;procedure TFormDemo.ServerSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      Socket.SendText('thunderbird521 (东方火鸟)');
    end;
      

  9.   

    { TLogClientSocket }procedure TLogClientSocket.ClientOnRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      sMsg: string;
    begin
      sMsg := Socket.ReceiveText;
      ShowMessage(sMsg);
    end;procedure TLogClientSocket.ConnectServer;
    begin
      Address := '127.0.0.1';
      Port := 5566;
      Active := True;
    end;constructor TLogClientSocket.Create;
    begin
      inherited Create(nil);
      OnRead := ClientOnRead;
    end;function TLogClientSocket.GetLogDate: string;
    begin
      //
    end;