解决方案 »

  1.   

    多语言确实比较麻烦,是不是因为buffer:array [0..2048] of Char;中这个char类型的问题呢?delphi2010中的string默认好像是widestring类型的,应该是支持unicode的,这个Char就不清楚了
      

  2.   


    对,因为多语种,所以原来是Delphi7的程序,花了好长时间,才把这个改变成Delphi2010的,Char在2010里面是WideChar主要目前是发送的时候,已经是????? 所以接收到也变成了???  就因为String[30]但是我去掉[30]又报错。。这代码页是拷贝别人的,自己对这块不大了解
      

  3.   

    请高手帮忙看下,我改成 type    
      TSendrec = packed record      
        msg: Array of Char;      
    end; 可以正常发送,但是接收的时候,就会报错,不清楚具体应该怎么写
      

  4.   

    动态数组用之前要先用SetLength分配内存空间。
      

  5.   

    动态数组用之前要先用SetLength分配内存空间。
    是的,我Setlength了,发送过去可以,但是接收的时候,不清楚应该set多少,我setLength(Sendrec.msg, SizeOf(buffer))任然报错
      

  6.   

    动态数组用之前要先用SetLength分配内存空间。
    是的,我Setlength了,发送过去可以,但是接收的时候,不清楚应该set多少,我setLength(Sendrec.msg, SizeOf(buffer))任然报错你分配多少空间就接收多少,这次收不完下次再收。你报错的原因应该是你传参数不对。你贴出你的代码,看看你怎么传缓冲区参数的。
      

  7.   


    procedure TForm2.IdUDPServerUDPRead(AThread: TIdUDPListenerThread;
      AData: TBytes; ABinding: TIdSocketHandle);
    var
        Sendrec: TSendrec;
        buffer:array [0..2048] of Char;
        str:string;
        i:integer;
    begin
      SetLength(Sendrec.msg, SizeOf(buffer));
      BytesToRaw(AData, buffer, SizeOf(buffer));
      CopyMemory(@Sendrec, @buffer, SizeOf(Sendrec));
      for I := 1 to Length(Sendrec.msg) do
      begin
        str := str + Sendrec.msg[i];
      end;  Memo1.Lines.Add(ABinding.IP + ' -> My: ' + str);
    end;
      

  8.   

    在CopyMemory之后,msg就变成空了,之后对他进行循环读取,就报错了
      

  9.   

    之前发的代码错了,是从0开始循环,我昨天改过的,但是接收到的数据为空。
    for I := 0 to Length(Sendrec.msg) - 1 do断点看了下Sendrec.msg数据,全部是#0
      

  10.   

    CopyMemory(@Sendrec.msg[0], @buffer, Length(Sendrec.msg));
    CopyMemory那行改成这样
      

  11.   


    搞定了,最后没用这种方式,看了下一个帖子,使用了String => TBytes 直接转的方法,很简单的实现了  - -!不过还是谢谢哈。
      

  12.   


    搞定了,最后没用这种方式,看了下一个帖子,使用了String => TBytes 直接转的方法,很简单的实现了  - -!不过还是谢谢哈。
    解决了就好,不过delphi的静态数组和动态数组取地址,是一个知识点,可以看下我之前总结的文章。
    http://pb.itsong.com/2009/01/delphi_is_an_array_of_array_name_is_the_first_address.html