偶是初学者,请教各位高手一个简单问题.请帮帮我,小女子这厢有礼拉!
   我用Tcpclient和Tcpserver控件实现数据自动传输,采用多线程技术.目的时判断memrecv接收来得消息符合某一条件时,memsend自动显示出回复信息,并触发发送事件.问题是发送事件触发不了,还需要再点击发送按钮才执行.所需控件见程序,程序(改的delphi里的netchat)代码如下:unit Chatmain;interfaceuses
  Classes, QControls, QStdCtrls, QExtCtrls, QButtons, QForms, Sockets;
type
  TForm1 = class(TForm)
    memRecv: TMemo;
    Panel1: TPanel;
    memSend: TMemo;
    Panel2: TPanel;
    btnSend: TButton;
    Panel3: TPanel;
    Label1: TLabel;
    edtRemoteHost: TEdit;
    Label2: TLabel;
    edtRemotePort: TEdit;
    Label3: TLabel;
    edtLocalPort: TEdit;
    btnActivateServer: TButton;
    TcpClient1: TTcpClient;
    TcpServer1: TTcpServer;
    procedure btnSendClick(Sender: TObject);
    procedure TcpServer1Accept(sender: TObject;
      ClientSocket: TCustomIpClient);
    procedure btnActivateServerClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;  // you must create your own thread to synch
  // writing to a gui component
  TClientDataThread = class(TThread)
  private
  public
    ListBuffer :TStringList;
    TargetList :TStrings;
    procedure synchAddDataToControl;
    constructor Create(CreateSuspended: Boolean);
    procedure Execute; override;
    procedure Terminate;
  end;var
  Form1: TForm1;
  //DataThread: TClientDataThread;implementation{$R *.xfm}//------------- TClientDataThread impl -----------------------------------------
constructor TClientDataThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate := true;
  ListBuffer := TStringList.Create;
end;procedure TClientDataThread.Terminate;
begin
  ListBuffer.Free;
  inherited;
end;procedure TClientDataThread.Execute;
begin
  Synchronize(synchAddDataToControl);
end;procedure TClientDataThread.synchAddDataToControl;
begin
 TargetList.AddStrings(ListBuffer);
end;
//------------- end TClientDataThread impl -------------------------------------
procedure TForm1.btnActivateServerClick(Sender: TObject);
begin
  TcpServer1.LocalPort := edtLocalPort.Text;
  TcpServer1.Active := True;end;procedure TForm1.btnSendClick(Sender: TObject);
var
  I: Integer;
begin
  TcpClient1.RemoteHost := edtRemoteHost.Text;
  TcpClient1.RemotePort := edtRemotePort.Text;
  try
    if TcpClient1.Connect   then
      for I := 0 to memSend.Lines.Count - 1 do
      TcpClient1.Sendln(memSend.Lines[I]);
  finally
    TcpClient1.Disconnect;
  end;
 // memSend.Clear;
end;procedure TForm1.TcpServer1Accept(sender: TObject;
  ClientSocket: TCustomIpClient);
var
  s: string;
  DataThread: TClientDataThread;
begin  DataThread:= TClientDataThread.Create(true);  DataThread.TargetList := memRecv.Lines ;  s := ClientSocket.Receiveln;
  while s <> '' do
  begin
    DataThread.ListBuffer.Add(s);
    s := ClientSocket.Receiveln;
  end;
  memSend.Lines.Clear;  if memRecv.Lines[0]='hello' then
  begin
     memSend.Lines.Add('hello,shoudaole');
     Form1.btnSendClick(Sender);              //为什么不执行???
  end;  DataThread.Resume;
end;end.

解决方案 »

  1.   

    unit Chatmain;interfaceuses
      Classes, QControls, QStdCtrls, QExtCtrls, QButtons, QForms, Sockets;
    type
      TForm1 = class(TForm)
        memRecv: TMemo;
        Panel1: TPanel;
        memSend: TMemo;
        Panel2: TPanel;
        btnSend: TButton;
        Panel3: TPanel;
        Label1: TLabel;
        edtRemoteHost: TEdit;
        Label2: TLabel;
        edtRemotePort: TEdit;
        Label3: TLabel;
        edtLocalPort: TEdit;
        btnActivateServer: TButton;
        TcpClient1: TTcpClient;
        TcpServer1: TTcpServer;
        procedure btnSendClick(Sender: TObject);
        procedure TcpServer1Accept(sender: TObject;
          ClientSocket: TCustomIpClient);
        procedure btnActivateServerClick(Sender: TObject);
      private
        { Private declarations }
      public
          Flag:integer;//标志位,0,1    { Public declarations }
      end;  // you must create your own thread to synch
      // writing to a gui component
      TClientDataThread = class(TThread)
      private
      public
        ListBuffer :TStringList;
        TargetList :TStrings;
        procedure synchAddDataToControl;
        constructor Create(CreateSuspended: Boolean);
        procedure Execute; override;
        procedure Terminate;  end;var
      Form1: TForm1;
      //DataThread: TClientDataThread;implementation{$R *.xfm}//------------- TClientDataThread impl -----------------------------------------
    constructor TClientDataThread.Create(CreateSuspended: Boolean);
    begin
      inherited Create(CreateSuspended);
      FreeOnTerminate := true;
      ListBuffer := TStringList.Create;
    end;procedure TClientDataThread.Terminate;
    begin
      ListBuffer.Free;
      inherited;
    end;procedure TClientDataThread.Execute;
    begin
      Synchronize(synchAddDataToControl);
    end;procedure TClientDataThread.synchAddDataToControl;
    begin
     TargetList.AddStrings(ListBuffer);
    end;
    //------------- end TClientDataThread impl -------------------------------------
    procedure TForm1.btnActivateServerClick(Sender: TObject);
    begin
      TcpServer1.LocalPort := edtLocalPort.Text;
      TcpServer1.Active := True;
      Flag := 0;//标志位置0
    end;procedure TForm1.btnSendClick(Sender: TObject);
    var
      I: Integer;
    begin
      TcpClient1.RemoteHost := edtRemoteHost.Text;
      TcpClient1.RemotePort := edtRemotePort.Text;
      try
        if TcpClient1.Connect   then
        begin
          for I := 0 to memSend.Lines.Count - 1 do
            TcpClient1.Sendln(memSend.Lines[I]);
        end;
       finally
        TcpClient1.Disconnect;
      end;
      //memSend.Clear;
    end;procedure TForm1.TcpServer1Accept(sender: TObject;
      ClientSocket: TCustomIpClient);
    var
      s: string;
      DataThread: TClientDataThread;
    begin  DataThread:= TClientDataThread.Create(true);  DataThread.TargetList := memRecv.Lines ;  s := ClientSocket.Receiveln;    while s <> '' do
        begin
          DataThread.ListBuffer.Add(s);
          memRecv.Lines.Add(s);
          s := ClientSocket.Receiveln;
        end;  memSend.Lines.Clear;  if (memRecv.Lines[0]='hello') and (Flag = 0) then
      begin
         Flag := 1;
         memSend.Lines.Add('hello,shoudaole');
         Form1.btnSend.OnClick(SELF);  end;  DataThread.Resume;
    end;end.
      

  2.   

    ^_^,benben,看到了吧,也碰到问题的时候,也就我还能帮助你哦!!