uses unit2
var f:=Tform2
procedure TForm1.BtConnetClick(Sender: TObject);
begin
  //Application.CreateForm(TForm2, Form2);
  f := TForm2.Create(nil);
  f.Caption := '正在连接远程主机' + ClientSocket1.Address + '......';
  f.DoConnect(edit1.Text ,3000);{一个自定义的连接服务端的函数}
  f.show;
end;上面的代码可以多次显示form2; 与多个服务端建立连接
但是 只有一个服务端的时候连接正常,两个服务端则服务端传递回来的数据就错了!!?

解决方案 »

  1.   

    你所创建的两个form2都是用的一个内存地址,可能会有冲突。
    你试试用别的方法,例如把声明窗体变量写在过程里试试。
    就是这样
    procedure TForm1.BtConnetClick(Sender: TObject);
    var 
      f:=Tform2;
    begin
      //Application.CreateForm(TForm2, Form2);
      f := TForm2.Create(nil);
      f.Caption := '正在连接远程主机' + ClientSocket1.Address + '......';
      f.DoConnect(edit1.Text ,3000);{一个自定义的连接服务端的函数}
      f.show;
    end;
      

  2.   

    var f:=Tform2??
    这一句应该就有问题吧至少 应该是 var f : Tform2
    但是看你这个应该是个全局变量,但是你确在click事件里面创建了两次,,所以出错了。。可以要创建多个实例,就要定义 相应的实例才是。可以试试在
    procedure TForm1.BtConnetClick(Sender: TObject);
    var
      f : TForm2;
    begin
      

  3.   

    to : 上面的两位朋友: 你们把f定义在Click过程中,那么f的生命期会更短!!! 也就是说click完毕,f就被系统收回了!
     所以不正确. 我上面的方法在不进行socket接收数据的时候,一起功能正常
     但是接受数据后,就会发生,Tform2中的sochet组件接受数据混乱!? 再次请教! 谢谢
      

  4.   

    to  loon1981(懒家伙) 我也想过了用多线程但是以前我把 客户端 组件 直接放在 form2 中
    如果用线程的话,我是否需要在线程中创建 客户端控件
      

  5.   

    不是很明白,改成这样不行吗?
    uses unit2
    var f:=Tform2
    procedure TForm1.BtConnetClick(Sender: TObject);
    begin
      if f = nil then 
      beign
        f := TForm2.Create(nil); 
      end;
      f.Caption := '正在连接远程主机' + ClientSocket1.Address + '......';
      f.DoConnect(edit1.Text ,3000);{一个自定义的连接服务端的函数}
      f.show;
    end;
      

  6.   

    注意:一个实例只能创建一次(在没有被释放以前)所以你要完成这个功能可以用一个form2的数组来搞定并且定义在外面。就能实现所谓的生命期长一点的问题。