代码如下:unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer, IdThread;type
  TForm1 = class(TForm)
    mmo1: TMemo;
    idtcpsrvr1: TIdTCPServer;
    btn1: TButton;
    btn2: TButton;
    edt1: TEdit;
    procedure btn1Click(Sender: TObject);
    procedure idtcpsrvr1Execute(AThread: TIdPeerThread);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  FThread : TIdPeerThread;implementation{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
begin
  idtcpsrvr1.Active := True;
end;procedure TForm1.idtcpsrvr1Execute(AThread: TIdPeerThread);
var
  str: string;
begin
  try
    AThread.Connection.CheckForDisconnect(True,True);
    str:= AThread.Connection.ReadLn();
    mmo1.Lines.Add(str);
    if str<>''  then
    AThread.Connection.WriteLn('服务器已经相应你的消息'+str);
  finally  end;
end;procedure TForm1.btn2Click(Sender: TObject);
var
 // cList: TList;
  count: Integer;
  str: string;
begin
  str:= edt1.Text;
  try
    //cList := idtcpsrvr1.Threads.LockList;
   // for count := 0 to cList.Count-1 do
   // begin
      FThread.Connection.Write(str);    //每次程序执行到这里都报错。应该怎么写才可以???
  finally
   // idtcpsrvr1.Threads.UnlockList;
  end;end;end.

解决方案 »

  1.   

    FThread在哪创建的,是不是没有创建实例就引用啊
      

  2.   

    那请问应该怎么创建呢?
    那为什么在idtcpsrvr1Execute(AThread: TIdPeerThread); 这个事件里可以直接用呢?
      

  3.   

    FThread 在这里你定义为全局变量,没有实例化就直接引用了。所以报错。
    idtcpsrvr1Execute(AThread: TIdPeerThread); 这里可以用是TIdTCPServer在初始化的时候就已经创建了1个TIdPeerThread对象。也就是说这里AThread引用的对象VCL已经给你创建了。FThread在你用之前实例化下就可以了
    FThread :=TIdPeerThread.create();
      

  4.   

    kfcoffe,按照你说的做了,可是还是报错。
      

  5.   

    我在这里搜索过TCPSERVER向TCPCLIENT发送数据的帖子,可是好像都没有最终解答。
      

  6.   

    FThread.Connection你这里Connection属性在哪里指定的,建议lz仔细看看help
      

  7.   

    在IdTCPServe里,有个TIdPeerThread类,里面有connection属性,继承了TIdTCPConnection,里面有个WRITELN函数,为什么不能直接用,应该怎么用啊?
      

  8.   

    應該是這樣procedure TForm1.btn2Click(Sender: TObject); 
    var 
      cList: TList; 
      count: Integer; 
      str: string; 
    begin 
      str:= edt1.Text; 
      try 
        cList := idtcpsrvr1.Threads.LockList; 
        for count := 0 to cList.Count-1 do 
        begin 
          FThread := cList[count];//關鍵...
          FThread.Connection.Write(str);    
       end;
      finally 
        idtcpsrvr1.Threads.UnlockList; 
      end; end; 
      

  9.   

    谢谢,谢谢,太感谢了,现在服务器端可以广播了
    非常感谢OnlyYou这位朋友