在delphi2007下编译通过的源码,在delphi2009下却不行了,请大家看看怎么改。一个udp的聊天程序里,有这样一个记录客户端用户昵称和端口的记录结构:
type
Tcommblock=record    //通信结构
SenderName,Msg:string[100]; //SenderName存客户端聊天昵称和所发消息,不超过100字节
end;变量comm是Tcommblock型的一个变量,
客户端TIDUDPClient控件用IdUDPClient1.SendBuffer(RawToBytes(comm,SizeOf(comm)));命令把comm记录转为Tbytes字节数据发送到服务端,(RawToBytes命令要在use里加上IDGlobal单元引用)服务端IdUDPServer1的读取事件TFMain.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  AData: TBytes; ABinding: TIdSocketHandle);接收到了发来的消息,并用
SetLength(recbuf, SizeOf(AData));//先开辟一个空缓冲区备用
BytesToRaw(recbuf, AData, SizeOf(AData));//把字节流写到一个缓冲区里,(注说明一下原来delphi2007里的服务端读取事件里的AData参数是Tstream型,而delphi2009里的AData参数是TBytes型,把人害了很久,delphi的老毛病就是前后版不兼容,没有连贯性,气跑了很多delphi用户,现在还是这样动不动就不兼容低版本!)问题来了,这个comm记录型已经被服务端正确读到本地的缓冲区recbuf里了,如何把它在取出来,还原成一个可操作读取的记录结构。
试了下面这两句原来d2007的正常的命令,现在都不行。 
    recbuf.readbuffer(comm,recbuf.size);
    AData.ReadBuffer(Comm,AData.Size);
在delphi2009里都提示说上面两句的readbuffer方法不存在,AData.Size的这个Size方法也不存在。而上面两句在delphi2007里都工作正常。自从装了delphi2009,已研究两天了,还是不知道怎么从buffer里还原出记录结构comm出来。
大家帮忙看看,这是段d2007编的udp穿透的聊天程序,问题解决了我把源码贴出来大家学习学习。

解决方案 »

  1.   


    delphi高版本不兼容低版本是个及其愚蠢的问题,每升级一次就气跑一批用户。 
    这两天想把delphi2007下的一个基于UDP的聊天程序,移值到delphi2009下,弄了两天了没成功! 
    没成功的原因竟是TIDUDPserver的OnUDPread事件里一个参数类型的改变: 
    procedure TFMain.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes; ABinding: TIdSocketHandle); 大家仔细看,AData: TBytes这个参数在delphi2007是AData: TStream型的,这么小的地方难道非改不可吗?!!改了后能提升很大性能吗?!!!想不通,即使改了,起码应该兼容前面版本的参数一段时间啊。气死了,导致原来提取收到的数据的命令AData.ReadBuffer(Comm,AData.Size);出现3个编译错误提示。到现在也没找出解决和变通方法,一直提取不出来AData代表的接收信息了(AData里接收的是一个record记录结构型的字节流)。 再搞,也不想用delphi了!!!太麻烦,升级一次几乎要重新学习一次知识,学习成本、升级成本太高!
      

  2.   

    Indy是delphi带的第三方组件,不完全是codegear的.
      

  3.   

    2007的时候indy也是可以选择版本的
    indy9和indy10的确变化很大,但是我2007的时候已经用的是indy10了,所以改动不大。
      

  4.   

    type
      comm = packed record
        id = array [0..49] of char;
      end;var
      xx : comm;
    begin
    BytesToRaw(AData,xx,SizeOf(xx));
    end;
      

  5.   

    这么一点问题两天都没解决,还把indy和delphi混为一谈,整天埋怨工具
      

  6.   

    赶快结贴吧 . 如果对 INDY 9 到 INDY10 转换有什么不解可以看这个文章
    http://blog.csdn.net/handsy/article/details/6625274